迁移前准备
明确迁移需求
- 目标平台规格(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
优点: 速度最快,操作简单
缺点: 需要停机,文件传输量大
关键注意事项
- 版本兼容性:方案二和三要求源和目标版本一致
- 字符集:确认源和目标的字符集配置相同
- 权限:迁移后重新创建数据库用户和权限
- 验证:迁移完成后对比行数和关键数据,确认完整性
- 回滚方案:迁移前保留源库,确认新库稳定后再下线