不能真正在线迁移数据目录而不改datadir,因mysql启动时硬绑定该路径并固化加载关键资源;唯一维持配置不变的方法是用软链接或bind mount将物理数据移至新位置,但需停库、校验权限、selinux策略及innodb日志路径等。

做不到真正意义上的“在线迁移数据目录而不改 datadir”。MySQL 启动时硬绑定 datadir 路径,运行中无法动态切换底层存储位置。所谓“不改配置文件”,实际是绕过直接修改 datadir,用其他机制把数据物理位置挪走,但 MySQL 仍认为它在原路径 —— 这只能靠符号链接或挂载点实现,且有严格前提和风险。
为什么不能跳过改 datadir 配置?
MySQL 启动时读取 datadir 并加载系统表空间(ibdata1)、日志文件(ib_logfile*)、数据字典等关键资源。这些路径在初始化阶段固化,运行时不可重定向。即使你用 rsync 把文件搬走了,服务仍会尝试从原 datadir 加载,必然失败。
常见错误现象:mysqld: Can't find file: './mysql/plugin.frm' (errno: 13) 或 InnoDB: The system tablespace must be writable,本质都是权限或路径错位导致的初始化失败。
用符号链接(symlink)假装“没改路径”
这是唯一能维持配置文件不变、又让数据存到别处的方法,但仅限 Linux/Unix,且需满足:
- MySQL 启动参数未启用
--skip-symbolic-links(MySQL 8.0+ 默认开启,必须显式关闭) - 原
datadir目录本身可被替换为链接,而非其子目录 - 目标路径属主和权限必须为
mysql:mysql,SELinux 上下文需正确(如启用)
操作步骤:
停库:systemctl stop mysqld
备份原目录:mv /var/lib/mysql /var/lib/mysql.bak
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
创建新目录并赋权:mkdir -p /home/mysql/data && chown -R mysql:mysql /home/mysql/data
复制数据:rsync -av /var/lib/mysql.bak/ /home/mysql/data/
建链接:ln -s /home/mysql/data /var/lib/mysql
启动前检查:ls -l /var/lib/mysql 确认指向正确;stat /home/mysql/data 确认 UID/GID 是 mysql
用 bind mount 替代 symlink 更可靠
Linux 下比符号链接更健壮:内核级挂载,不受 --skip-symbolic-links 影响,权限继承自然,且对 InnoDB 日志路径也生效。
操作要点:
- 停库后,把新路径挂载到原
datadir位置:mount --bind /home/mysql/data /var/lib/mysql - 写入
/etc/fstab持久化:/home/mysql/data /var/lib/mysql none bind 0 0 - 注意:挂载点目录(
/var/lib/mysql)必须存在且为空,否则挂载失败 - 验证:
findmnt | grep mysql看是否已挂载;df -h /var/lib/mysql看磁盘使用是否反映新路径
容易被忽略的关键点
哪怕用了 symlink 或 bind mount,仍必须确保:innodb_log_group_home_dir 和 log_error 对应的路径(如 ib_logfile*、错误日志)也落在新存储上——它们默认跟随 datadir,但若显式配置了独立路径,就得同步调整。另外,socket 文件路径虽不影响数据迁移,但若放在旧磁盘上,客户端连接可能因磁盘满而失败,建议一并移到新路径并更新 my.cnf 中的 socket 配置。










