迁移mysql必须确保版本主号一致、数据目录完整、权限属主正确、配置参数适配新硬件、binlog与gtid状态准确重置,并校验时区字符集。

迁移前必须确认的 MySQL 版本与数据目录一致性
新旧环境的 mysqld 版本主版本号必须一致(如都是 8.0.x),否则直接拷贝数据文件会触发启动失败或数据损坏。尤其注意 5.7 升级到 8.0 不属于“硬件迁移”,而是升级操作,需走 mysql_upgrade 或逻辑导出导入流程。
确认 datadir 路径下所有子目录(如 mysql、performance_schema 系统库)完整,且 ibdata1、ib_logfile*、undo_* 等 InnoDB 共享表空间和日志文件一并迁移——遗漏任一都会导致实例无法启动。
- 用
SELECT @@datadir;查当前路径,避免误迁 /var/lib/mysql 下的软链接目标之外的内容 - 检查
my.cnf中innodb_data_home_dir和innodb_log_group_home_dir是否显式指定,若不同路径需同步迁移对应文件 - 禁止在新机器上先初始化实例再覆盖数据目录;必须清空目标
datadir后再复制
文件权限与用户归属不能靠“复制”自动继承
Linux 下 MySQL 进程以 mysql 用户运行,但 rsync/scp 默认不保留属主,迁移后常见错误是 mysqld: Can't create/write to file ... (Errcode: 13),本质是文件属主为 root 或其他用户。
必须在新机器上执行:chown -R mysql:mysql /var/lib/mysql,且确保父目录(如 /var/lib)对 mysql 用户可读可执行。SELinux 启用时还需恢复上下文:restorecon -Rv /var/lib/mysql。
- 不要用
cp -r,优先用rsync -avz --owner --group - 检查
ls -ld /var/lib/mysql,输出中第二列应为mysql,而非root - systemd 环境下,若使用
ProtectHome=yes等安全限制,需在/etc/systemd/system/mysqld.service.d/override.conf中显式放开路径
配置文件中的硬件敏感参数必须重校准
my.cnf 里很多参数直接受新机器 CPU 核数、内存大小、磁盘 IOPS 影响,照搬旧配置轻则性能下降,重则 OOM 或写入卡死。关键项包括:
-
innodb_buffer_pool_size:建议设为物理内存的 50%–75%,旧机器 32G 内存配了 24G,新机器 128G 就不能还写 24G -
innodb_log_file_size:总日志容量(×2)不宜超过buffer_pool_size的 25%,且单个文件不宜大于 2GB(MySQL 8.0.30+ 支持更大,但需验证) -
max_connections和table_open_cache:需按新机器并发能力调整,过高会耗尽文件描述符(见ulimit -n) -
tmp_table_size和max_heap_table_size:过大会导致大查询频繁落磁盘,过小则触发内部临时表转换为 MyISAM
迁移后首次启动前,务必用 mysqld --validate-config 检查语法,并用 mysqld --verbose --help | grep -A 1 "Default options" 确认实际生效路径是否为你修改的 my.cnf。
二进制日志与 GTID 状态必须显式处理
如果原库启用了 log_bin,迁移后不重置 binlog 位置会导致从库 IO 线程报错 Could not find first log file name in binary log index file。即使不用于复制,也建议清空 binlog 并重置索引:
RESET MASTER;(仅当确认无下游依赖时)或更稳妥地:删除 mysql-bin.* 文件 + 清空 mysql-bin.index,再重启 mysqld。
- 启用 GTID 时,必须保证
gtid_executed和gtid_purged在新实例中准确反映迁移前状态,可用SELECT * FROM performance_schema.replication_applier_status_by_coordinator;辅助核对 - 若原库有半同步插件(
rpl_semi_sync_master),迁移后需重新安装并配置,否则主库会卡在 commit 等待应答 - 检查
SHOW SLAVE STATUS\G中Seconds_Behind_Master是否为NULL,避免误以为从库已就绪
最易被忽略的是时区和字符集:迁移后执行 SELECT @@time_zone, @@character_set_server, @@collation_server;,确认与旧库完全一致,否则时间字段或中文排序可能异常。










