mysql迁移到新的硬件环境中需要注意什么_mysql硬件迁移策略

来源:这里教程网 时间:2026-02-28 20:52:50 作者:

迁移前必须确认的 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;
,确认与旧库完全一致,否则时间字段或中文排序可能异常。

相关推荐