迁移前准备

明确迁移需求

  • 目标平台规格(CPU、内存、磁盘)
  • 迁移时间窗口和业务中断容忍度
  • 数据量大小和表结构复杂度

备份数据(必须)

mysqldump -u root -p --all-databases > full_backup_$(date +%Y%m%d).sql

方案一:mysqldump 导出/导入

适用场景: 数据量 < 10GB,跨版本迁移,需要跨平台兼容。

导出

# 导出单个数据库
mysqldump -u root -p --single-transaction --databases mydb > mydb.sql

# 导出所有数据库
mysqldump -u root -p --single-transaction --all-databases > all.sql

传输到目标服务器

scp mydb.sql user@target-server:/tmp/

导入

mysql -u root -p mydb < /tmp/mydb.sql

优点: 不影响源数据库,SQL 格式跨版本兼容
缺点: 大数据量耗时长,需要额外磁盘空间


方案二:.ibd 文件迁移

适用场景: 大表迁移,需要快速导入,源和目标版本相同。

# 源库:锁表并生成 .cfg 文件
FLUSH TABLES mydb.users FOR EXPORT;

# 目标库:创建表结构并清空
CREATE TABLE users (...);
ALTER TABLE users DISCARD TABLESPACE;

# 复制 .ibd 和 .cfg 文件到目标库数据目录
scp /var/lib/mysql/mydb/users.{ibd,cfg} user@target:/var/lib/mysql/mydb/

# 目标库:导入表空间
ALTER TABLE users IMPORT TABLESPACE;

优点: 导入速度快,适合大表
缺点: 操作复杂,要求版本和配置严格匹配


方案三:目录级迁移

适用场景: 整库迁移,版本完全相同,追求最快速度。

# 停止源库 MySQL 服务
systemctl stop mysql

# 使用 rsync 同步数据目录(排除系统库)
rsync -avz --exclude='mysql/' --exclude='performance_schema/' \
  /var/lib/mysql/ user@target:/var/lib/mysql/

# 设置目标库权限
chown -R mysql:mysql /var/lib/mysql

# 启动目标库
systemctl start mysql

优点: 速度最快,操作简单
缺点: 需要停机,文件传输量大


关键注意事项

  1. 版本兼容性:方案二和三要求源和目标版本一致
  2. 字符集:确认源和目标的字符集配置相同
  3. 权限:迁移后重新创建数据库用户和权限
  4. 验证:迁移完成后对比行数和关键数据,确认完整性
  5. 回滚方案:迁移前保留源库,确认新库稳定后再下线