跨服务器迁移MySQL数据库需先配置远程访问并授权,再按数据量选择mysqldump导出导入、物理拷贝或XtraBackup等合适方式。

跨服务器迁移 MySQL 数据库,核心是把数据从源服务器完整、安全地复制到目标服务器,同时确保服务可用性和数据一致性。关键不在于“远程”二字,而在于迁移方式的选择、网络配置和权限控制是否到位。
确认远程连接与权限是否就绪
目标服务器必须允许源服务器(或你的操作终端)通过网络连接其 MySQL 服务。默认情况下 MySQL 只监听本地(127.0.0.1),需修改配置启用远程访问:
- 编辑 /etc/mysql/mysql.conf.d/mysqld.cnf(Ubuntu/Debian)或 /etc/my.cnf(CentOS),将 bind-address = 127.0.0.1 改为 bind-address = 0.0.0.0 或指定 IP
- 重启 MySQL:sudo systemctl restart mysql
- 创建具备远程访问权限的账号(例如用于迁移的专用用户):
CREATE USER 'migrator'@'%' IDENTIFIED BY 'strong_pass';
GRANT SELECT ON *.* TO 'migrator'@'%';
FLUSH PRIVILEGES; - 检查防火墙是否放行 3306 端口(如 ufw、iptables 或云平台安全组)
选择适合场景的迁移方式
小库(10GB)或要求停机时间极短,建议物理拷贝(需同版本、同架构)或使用 Percona XtraBackup:
-
mysqldump 远程导出 + 本地导入(最常用):
mysqldump -h 源IP -u migrator -p --single-transaction --routines --triggers database_name > db.sql
再在目标服务器执行:
mysql -u root -p database_name -
直接管道迁移(免中间文件):
mysqldump -h 源IP -u migrator -p --single-transaction database_name | mysql -u root -p -h 目标IP database_name - 物理迁移(仅限同版本、关闭源库):停掉源 MySQL → 复制 /var/lib/mysql/数据库名/ 到目标对应目录 → 调整属主:chown -R mysql:mysql /var/lib/mysql/数据库名 → 启动目标 MySQL
迁移后务必验证与收尾
迁移完成不等于成功,必须人工核对关键指标:
- 登录目标库,执行 SELECT COUNT(*) FROM 表名 对比源库结果
- 检查表结构:SHOW CREATE TABLE 表名\G,确认字符集、引擎、索引一致
- 运行 mysqlcheck -u root -p --check database_name 验证表完整性
- 若应用已切换,测试读写功能;未切换前,可临时修改应用配置指向新库做灰度验证
- 清理临时账号(如删掉 'migrator'@'%')、关闭不必要的远程监听或收紧 bind-address
常见坑与规避建议
很多失败源于细节疏忽:
- 字符集不一致导致乱码:导出时加 --default-character-set=utf8mb4,目标库建库也要指定 CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
- 外键约束中断导入:导出加 --skip-extended-insert 更易调试;或导入前加 SET FOREIGN_KEY_CHECKS=0;
- 超时中断大库迁移:在 mysqldump 命令中加 --net_buffer_length=1048576 --max_allowed_packet=512M,并在 my.cnf 中同步调大对应参数
- 时间戳自动更新异常:注意 sql_mode 差异,尤其是 NO_ZERO_DATE、STRICT_TRANS_TABLES 等,迁移前后用 SELECT @@sql_mode; 核对











