Linux MySQL 数据迁移实操指南
一、迁移方式总览与选择
- 逻辑迁移(推荐通用):使用 mysqldump 导出为 .sql 脚本,在目标库导入。优点是兼容性强、操作简单;缺点是大数据量导入较慢。适合大多数场景与版本差异环境。
- 物理迁移(最快整体迁移):直接拷贝 datadir(如 /var/lib/mysql)到目标服务器,要求 MySQL 版本与配置尽量一致,停机时间短、速度快。适合海量数据与整体实例迁移。
- 热备工具(在线备份恢复):使用 Percona XtraBackup 做全量/增量备份与恢复,几乎不停机,适合生产环境在线迁移与快速回滚。
- 实时/近实时同步:基于 MySQL binlog 的 mysqlbinlog 回放或 CDC 工具(Maxwell、Debezium),适合需要持续同步与零停机切换的场景。
二、通用准备与注意事项
- 版本与兼容性:尽量保持源/目标 MySQL 主版本一致;跨大版本迁移先做小范围演练。物理迁移对版本一致性要求更高。
- 停机窗口与一致性:逻辑迁移可在低峰期进行;物理迁移需停库或使用热备工具避免业务中断。
- 权限与安全:准备具备 SELECT/SHOW VIEW/LOCK TABLES/RELOAD 等权限的账号;传输过程使用 scp/rsync 加密通道。
- 字符集与 SQL 模式:导出/导入时显式指定 –default-character-set=utf8mb4;保持 sql_mode 一致,避免导入后约束/比较规则变化。
- GTID 与复制:源库启用 GTID 时,导入到启用 GTID 的目标库通常需设置 –set-gtid-purged=OFF(避免执行 SET @@GLOBAL.GTID_PURGED 冲突);若目标库用于复制,按复制拓扑正确初始化 GTID。
- 目标库准备:提前创建同名数据库(如需要)、用户与权限;导入前检查 磁盘空间、innodb_log_file_size、max_allowed_packet 等参数。
三、方法一 逻辑迁移 mysqldump(通用首选)
- 1)导出(源库)
- 单库导出(推荐):
mysqldump -uroot -p --databases mydb --routines --triggers --default-character-set=utf8mb4 --set-gtid-purged=OFF --column-statistics=0 > mydb.sql
- 全库导出:
mysqldump -uroot -p --all-databases --routines --triggers --default-character-set=utf8mb4 --set-gtid-purged=OFF --column-statistics=0 > full.sql
- 说明:
- –routines/–triggers 保留存储过程/触发器;
- –set-gtid-purged=OFF 避免 GTID 相关报错(按需开启);
- –column-statistics=0 兼容旧版 server 的 mysqldump。
- 2)传输到目标库
scp mydb.sql user@target_ip:/tmp/
- 3)导入(目标库)
- 单库导入:
mysql -uroot -p < /tmp/mydb.sql
- 全库导入:
mysql -uroot -p < /tmp/full.sql
- 4)验证
mysql -uroot -p -e “SHOW DATABASES LIKE ‘mydb’; USE mydb; SHOW TABLES; SELECT COUNT(*) FROM your_table;”
四、方法二 物理迁移 拷贝 datadir(最快整体迁移)
- 1)源库停库
sudo systemctl stop mysql
- 2)拷贝数据目录(示例路径 /var/lib/mysql)
- rsync(推荐,断点续传):
rsync -aAXv /var/lib/mysql/ user@target_ip:/var/lib/mysql/
- 3)目标库准备
- 备份原数据目录(如有):mv /var/lib/mysql /var/lib/mysql.bak_$(date +%F)
- 修改配置 /etc/mysql/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf:
datadir = /var/lib/mysql
- 4)修复权限并启动
sudo chown -R mysql:mysql /var/lib/mysql
sudo systemctl start mysql
- 5)验证
mysql -uroot -p -e “SELECT VERSION(); SHOW DATABASES;”
- 注意:两台服务器 MySQL 版本/配置需尽量一致;若版本不一致,优先采用逻辑迁移。
五、方法三 热备工具 XtraBackup(在线备份恢复)
- 1)源库安装与全量备份
sudo apt-get update && sudo apt-get install -y percona-xtrabackup-24
xtrabackup --backup --user=backup --password=pwd --target-dir=/backup/full_20251130
- 2)传输备份到目标库
scp -r /backup/full_20251130 user@target_ip:/backup/
- 3)目标库准备与恢复
xtrabackup --prepare --target-dir=/backup/full_20251130
sudo systemctl stop mysql
sudo mv /var/lib/mysql /var/lib/mysql.bak_$(date +%F)
mkdir -p /var/lib/mysql
xtrabackup --copy-back --target-dir=/backup/full_20251130 --datadir=/var/lib/mysql
sudo chown -R mysql:mysql /var/lib/mysql
sudo systemctl start mysql
- 4)验证
mysql -uroot -p -e “SHOW DATABASES; SELECT COUNT(*) FROM mysql.user;”
- 扩展:支持 增量备份(–incremental-backup,–incremental-basedir 指向全量/上一次增量)。
六、方法四 实时或近实时迁移(全量+增量)
- 1)基于 binlog 的回放(简单、轻量)
- 全量导出:
mysqldump -uroot -p --databases mydb --single-transaction --routines --triggers --default-character-set=utf8mb4 --set-gtid-purged=OFF > mydb.sql
- 导入全量后,回放增量(按时间/位置):
mysqlbinlog --start-datetime=“2025-11-30 10:00:00” mysql-bin.000001 | mysql -uroot -p
- 2)CDC 方案(生产级实时同步)
- Maxwell/Debezium 读取 binlog,输出到 Kafka 等消息总线,再由下游消费写入目标库,适合 零停机切换、跨系统解耦。
- 3)适用场景
- 计划维护窗口短、需要 持续同步 或 双写到新库 的业务。