MySQL数据目录迁移必须停服,确认datadir真实路径,将原目录整体迁移至新位置后创建符号链接,保持my.cnf中datadir指向链接路径,并同步调整tmpdir等关联路径。

MySQL 数据目录迁移前必须停服并确认 datadir 路径
直接操作符号链接前,MySQL 必须完全停止,否则 mysqld 会持续写入原路径,导致数据不一致甚至损坏。先确认当前实际数据位置:
mysql -u root -p -e "SHOW VARIABLES LIKE 'datadir';"输出的
datadir 值(如 /var/lib/mysql/)才是真实路径,不是配置文件里写的就一定生效——有时配置未重载或被覆盖。检查该路径是否为挂载点、是否有剩余空间、目标磁盘是否已格式化并挂载(如挂载到 /mnt/data),且 MySQL 用户(通常是 mysql)对该目标路径有读写权限。
用 ln -s 创建符号链接时不能保留原目录内容
迁移本质是把原 datadir 目录整体移到新位置,再用符号链接“指向”它。常见错误是直接在原位置 ln -s /mnt/data/mysql .,这会导致 MySQL 启动时看到的是空链接或循环引用。正确流程是:
- 停止
mysqld - 复制整个原数据目录(含
ibdata1、ib_logfile*、数据库子目录等)到新位置:rsync -av /var/lib/mysql/ /mnt/data/mysql/
- 重命名或清空原目录:
mv /var/lib/mysql /var/lib/mysql.bak
- 在原位置创建指向新路径的符号链接:
ln -s /mnt/data/mysql /var/lib/mysql
- 确保属主和权限一致:
chown -h mysql:mysql /var/lib/mysql
(-h是关键,只改链接本身权限,不穿透到目标)
my.cnf 中的 datadir 配置必须与符号链接路径一致
即使用了符号链接,MySQL 启动时仍会读取配置文件中的 datadir。如果 my.cnf 里还写着 datadir = /var/lib/mysql,而你又把 /var/lib/mysql 做成了链接,那没问题;但如果你改成 datadir = /mnt/data/mysql,就绕过了符号链接机制,后续升级或重装可能意外破坏结构。更稳妥的做法是:保持 my.cnf 中的 datadir 指向符号链接所在路径(即 /var/lib/mysql),让操作系统层面完成路径解析。否则,mysqld 会尝试直接访问物理路径,忽略符号链接,导致启动失败并报错:Can't find file: './mysql/plugin.frm' 或 InnoDB: The system tablespace must be writable。
重启后验证表空间和日志文件是否真正落在新磁盘
启动 mysqld 后别急着用,先确认 InnoDB 表空间和 redo log 确实写到了新位置:
- 查
ibdata1和ib_logfile*的实际位置:ls -l /var/lib/mysql/ib*
,输出应显示指向/mnt/data/mysql/下的文件 - 进 MySQL 执行:
SELECT FILE_NAME, TABLESPACE_NAME FROM INFORMATION_SCHEMA.FILES WHERE FILE_TYPE = 'DATAFILE';
,结果中FILE_NAME应为相对路径(如./test/t1.ibd),结合datadir解析后,物理路径必须落在新磁盘 - 检查磁盘使用:
df -h /mnt/data
,确认有写入增长;同时df -h /var/lib应基本无变化
最容易被忽略的是 tmpdir 和 log-error 路径——它们默认可能还在旧磁盘,大查询临时表或错误日志堆积仍会撑爆系统盘。记得一并检查并调整这些配置项。


















