能迁移,但必须停机、权限对、版本同,漏一项就起不来;需确认进程真终止、rsync路径末尾带斜杠并加--delete、目标机执行chown和restorecon、核对datadir配置且不可删ibdata1。

能迁移,但必须停机、权限对、版本同,漏一项就起不来。
停服务前先确认进程真死了
很多人执行 systemctl stop mysql 就以为完事了,其实 mysqld 子进程或 mysqld_safe 可能还挂着。残留进程会导致文件状态不一致,后续启动直接卡在 InnoDB: Starting crash recovery 或静默退出。
- 用
ps aux | grep mysqld看有没有残留进程 - 检查
/var/lib/mysql/mysqld.pid是否还存在,存在说明没干净退出 - 强制清理:
kill -9 $(cat /var/lib/mysql/mysqld.pid) && rm -f /var/lib/mysql/mysqld.pid - 最后跑一次
systemctl is-active mysql,输出inactive才算真正停稳
rsync 同步时末尾斜杠和 --delete 缺一不可
写成 rsync -avz /var/lib/mysql user@newhost:/data/mysql 是错的——它会把源目录内容“铺平”到目标路径下,可能覆盖 auto.cnf 导致 UUID 冲突,主从复制断裂。
- 正确写法(注意两个路径末尾都有
/):rsync -avz --delete /var/lib/mysql/ user@newhost:/data/mysql/ -
--delete保证目标目录干净,避免旧ib_logfile*和新配置中innodb_log_file_size不匹配,否则报错InnoDB: Error: log file ./ib_logfile0 is of different size - 别用
cp -a跨机器;本地迁移可用,但跨机还是rsync更可控
目标机上三件事不做,mysqld 肯定起不来
物理迁移不是“拷完就跑”,MySQL 对环境极其敏感,以下三项必须逐项核对:
-
chown -R mysql:mysql /data/mysql—— 漏掉这句,常见报错是Can't open the mysql.plugin table或直接静默退出 - 若 SELinux 开启,补一句:
restorecon -Rv /data/mysql,否则同样是Permission denied - 检查
my.cnf中[mysqld]段的datadir值是否为/data/mysql(末尾不能带/),且该路径在ls -ld /data/mysql下可读可写
启动失败先盯 error.log 里的三个关键词
别急着重启,直接打开 /var/log/mysql/error.log(或 mysqld.err),搜索这几个线索:
-
InnoDB: Database page corruption on disk→ 停服前没等刷盘完成,或拷贝中途磁盘满 -
Table 'mysql.plugin' doesn't exist→ 权限没改,或mysql/目录下文件被漏拷(尤其是隐藏文件如.ibd) -
keyring_file_data not found→ 源库开了innodb_encrypt_tables=ON但密钥没导出,目标机无法解密,无明确提示,只报启动失败
最易忽略的是 innodb_file_per_table 关闭时所有表数据都在 ibdata1 里,迁移后这个文件绝不能删,也不能用 --initialize 重建——那等于清空全部数据。


















