温馨提示×

如何使用Linux MySQL进行数据迁移

小樊
46
2025-11-30 07:31:52
栏目: 云计算

Linux MySQL 数据迁移实操指南

一、迁移方式总览与选择

  • 逻辑迁移(推荐通用):使用 mysqldump 导出为 .sql 脚本,在目标库导入。优点是兼容性强、操作简单;缺点是大数据量导入较慢。适合大多数场景与版本差异环境。
  • 物理迁移(最快整体迁移):直接拷贝 datadir(如 /var/lib/mysql)到目标服务器,要求 MySQL 版本与配置尽量一致,停机时间短、速度快。适合海量数据与整体实例迁移。
  • 热备工具(在线备份恢复):使用 Percona XtraBackup 做全量/增量备份与恢复,几乎不停机,适合生产环境在线迁移与快速回滚。
  • 实时/近实时同步:基于 MySQL binlogmysqlbinlog 回放或 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)适用场景
    • 计划维护窗口短、需要 持续同步双写到新库 的业务。

0