Ubuntu 上 MySQL 数据迁移实操指南
一、常用迁移方式与适用场景
- 逻辑迁移(mysqldump/MySQL Workbench):跨版本、跨平台通用,操作简单,适合大多数中小规模库与日常变更迁移。
- 物理迁移(拷贝数据目录):同版本、同平台最快,需停机,适合一次性整机搬迁。
- 热备份迁移(Percona XtraBackup):几乎不停机,适合7×24业务与大体量库。
- 官方图形化迁移(MySQL Workbench Migration Wizard):向导式迁移,适合从异构数据库迁至 MySQL 或做结构/数据同步评估。
二、标准流程 逻辑迁移(跨服务器/跨版本通用)
- 1)源库备份
- InnoDB 推荐单事务导出,避免全库锁表:
- 全库:
- mysqldump -uroot -p --single-transaction --routines --triggers --default-character-set=utf8mb4 --hex-blob --databases 库1 库2 > backup.sql
- 单库:
- mysqldump -uroot -p --single-transaction --routines --triggers --default-character-set=utf8mb4 --hex-blob 库名 > backup.sql
- 说明:–single-transaction 保证一致性;–routines 含存储过程/函数;–triggers 含触发器;–hex-blob 更稳妥地处理 BLOB/TEXT;字符集建议统一为 utf8mb4。
- 2)传输到目标服务器
- scp backup.sql user@目标IP:/home/user/
- 3)目标库准备
- 安装同版本 MySQL(或兼容版本),创建同名空库(如使用 mysql -e “CREATE DATABASE db;”)。
- 4)导入数据
- mysql -uroot -p < backup.sql
- 5)验证
- 登录检查:SHOW DATABASES; USE db; SHOW TABLES; SELECT COUNT(*) FROM 表; 抽样对比关键数据。
三、物理迁移 同版本拷贝数据目录(最快,需停机)
- 1)源库停机并拷贝
- sudo systemctl stop mysql
- sudo rsync -av /var/lib/mysql/ 目标主机:/var/lib/mysql/
- 2)目标库权限与目录
- sudo chown -R mysql:mysql /var/lib/mysql
- 3)启动与验证
- sudo systemctl start mysql
- 登录核对库表与数据量。
- 4)仅变更存储路径(本机目录迁移)
- 修改 /etc/mysql/my.cnf 的 datadir 为新路径;
- 配置 AppArmor(Ubuntu 常见限制):编辑 /etc/apparmor.d/usr.sbin.mysqld,为新的数据目录新增读写权限规则,例如:
- /newdatadir/ r,
- /newdatadir/** rwk,
- 执行:sudo systemctl reload apparmor && sudo systemctl start mysql。
四、热备份迁移 使用 Percona XtraBackup(几乎不停机)
- 1)安装工具
- sudo apt-get install percona-xtrabackup
- 2)源库备份
- xtrabackup --backup --target-dir=/opt/backup
- 3)准备备份(回滚未提交事务)
- xtrabackup --prepare --target-dir=/opt/backup
- 4)传输到目标并恢复
- rsync -av /opt/backup 目标主机:/var/lib/mysql
- 目标库:sudo chown -R mysql:mysql /var/lib/mysql
- 5)启动与验证
- sudo systemctl start mysql
- 登录核对库表与数据量。
- 适用场景:大体量、要求高可用的生产库;迁移窗口短。
五、迁移校验与常见问题
- 校验清单
- 数据量:对比各表 COUNT(*) 与关键业务指标;
- 一致性:对核心表做校验和(如 CHECKSUM TABLE)或抽样比对;
- 结构:SHOW CREATE TABLE/SHOW CREATE PROCEDURE 确认索引、触发器、存储过程、视图一致;
- 权限:核对用户、库级/表级权限是否迁移到位。
- 常见问题与处理
- 字符集乱码:导出/导入统一使用 utf8mb4;
- 权限错误:数据目录必须属主 mysql:mysql,AppArmor/SELinux 策略需放行新路径;
- 版本差异:跨大版本(如 5.7→8.0)建议先小流量演练,关注系统库变更与 SQL 模式;
- 大表超时:导入时适当增大 net_read_timeout/net_write_timeout,或分批导入。