必须停库操作,否则必然导致数据损坏或启动失败;需确认应用断连、进程完全退出,再复制数据、修改配置(含socket/pid-file等)、设置权限与selinux策略,最后验证表可用性及innodb日志状态。

MySQL数据目录迁移必须停库操作
不关服务就复制或改配置,必然导致数据损坏或启动失败。InnoDB的redo log、doublewrite buffer、buffer pool等机制都依赖datadir下文件的原子一致性,运行中移动文件等于直接破坏事务日志链。
停库前务必确认:
- 所有应用已断开连接,或已切到只读/降级模式
- 执行
mysqladmin -u root -p shutdown或systemctl stop mysqld后,用ps -ef | grep mysqld确认进程完全退出(包括mysqld_safe进程) - 若使用 systemd,检查
systemctl is-active mysqld返回inactive
Linux 下迁移 datadir 的关键路径与权限
迁移后 MySQL 启动报错 “Can’t open the mysql.plugin table” 或 “Table ‘mysql.plugin’ doesn’t exist”,90% 是因为新目录权限不对,不是配置写错了。
正确做法:
- 新目录必须由
mysql用户和组拥有:chown -R mysql:mysql /new/path/data - 目录权限设为
750(不能是 755 或 777),否则 MySQL 8.0+ 会拒绝启动 - SELinux 启用时,需打标:
semanage fcontext -a -t mysqld_db_t "/new/path/data(/.*)?",再restorecon -Rv /new/path/data -
my.cnf中不仅改datadir,还要同步更新socket、pid-file、log-error路径,否则客户端连不上或日志写不进
Windows 下最常漏改的三处注册表与配置项
服务能启动但命令行执行 mysql -u root -p 失败,或者启动后立刻退出,基本就是这三处没同步更新:
-
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesMySQL80ImagePath:必须把原路径中C:Program FilesMySQL...替换为新路径,末尾保持inmysqld.exe,不要加额外引号 -
my.ini中的basedir和datadir必须都改,且推荐用正斜杠/或双反斜杠\,单反斜杠在某些编辑器里会被转义 -
log-error和pid-file路径也得指向新盘——很多人只搜datadir,结果 MySQL 因无法写入错误日志而静默退出
迁移后验证不能只看 show variables like 'datadir'
这个命令只说明配置生效了,不代表数据可用。真正要验证的是表能否打开、记录能否读写、索引是否有效。
建议按顺序执行:
- 登录后运行
SELECT COUNT(*) FROM information_schema.tables WHERE table_schema NOT IN ('mysql', 'performance_schema', 'sys');,确认各库表数量与迁移前一致 - 挑几个大表执行
SELECT * FROM tbl_name LIMIT 1;,避免因 .ibd 文件损坏导致查询卡住 - 查
SHOW ENGINE INNODB STATUSG,看Log sequence number是否持续增长,确认 redo log 正常写入 - Windows 下别忘了检查事件查看器 → Windows 日志 → 应用程序,过滤来源为
MySQL的错误,比命令行提示更准
路径硬编码散落在注册表、配置文件、环境变量、服务账户权限里,改漏任意一处都会让迁移变成“半成功”——服务起来又倒下,问题藏得深,排查成本远高于提前逐项核对。











