MySQL 数据迁移核心是“先安全备份,再精准还原”,关键在于保证数据一致性、兼容性和可回滚性。
一、选择合适的备份方式
根据数据量大小和业务停机容忍度决定:
mysqldump(适合中小数据量、需跨版本/跨平台):逻辑备份,生成 SQL 文件,可读性强,支持单库、单表导出。注意加 --single-transaction(InnoDB 表一致性)和 --routines --events --triggers(存储过程、事件、触发器不丢失) 物理备份(如 Percona XtraBackup):适合大库(百 GB+),速度快、恢复快,但要求源目 MySQL 版本相近,且必须同架构(如都是 InnoDB)。备份时不影响写入,但只支持 Linux + MySQL/Percona Server 复制(Replication)方式迁移:适用于不能长时间停机的场景。先在新环境搭从库,同步完成后提升为新主库,切换应用连接。需确保主从 GTID 或位点准确,切换前 stop slave 并校验 Seconds_Behind_Master = 0二、迁移前必须做的检查项
避免还原失败或数据异常:
确认新环境 MySQL 版本是否兼容(例如:5.7 备份不建议直接导入 8.0,因默认认证插件、关键字、SQL_MODE 差异可能报错;可用 --skip-column-names --compact 配合脚本预检) 检查字符集与排序规则(character_set_server、collation_server 及库/表级设置),防止中文乱码。推荐统一使用 utf8mb4 + utf8mb4_0900_as_cs(8.0)或 utf8mb4_unicode_ci(5.7) 导出前执行 FLUSH TABLES WITH READ LOCK;(仅 mysqldump 未用 --single-transaction 时需要),或确保无长事务阻塞 记录当前 binlog 位置(SHOW MASTER STATUS;)或 GTID(SELECT @@GLOBAL.GTID_EXECUTED;),便于后续追平或审计三、还原与验证要点
还原不是简单 source,要闭环验证:
导入前清空目标库(DROP DATABASE IF EXISTS xxx; + CREATE DATABASE xxx CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;),避免旧对象干扰 用 mysql -u user -p db_name 导入;大文件建议加 --force 跳过个别非关键错误,并重定向日志便于排查 必做验证:对比行数(SELECT COUNT(*) FROM table;)、校验和(CHECKSUM TABLE table;)、关键业务数据抽样(如最新订单、用户登录时间) 测试应用连通性、读写功能、索引是否生效(EXPLAIN 查看执行计划)、慢查询是否新增四、常见坑与绕过技巧
少踩坑,多省事:
ERROR 1231 (HY000): Variable 'sql_mode' can't be set to the value of 'NO_AUTO_CREATE_USER':MySQL 8.0 移除了该 mode,dump 文件里若有,手动删掉或用 sed 替换:sed -i 's/NO_AUTO_CREATE_USER,//g' backup.sql 权限不足导致无法创建函数/存储过程:导入前执行 SET GLOBAL log_bin_trust_function_creators = 1;,或用高权限账号导入 自增 ID 冲突:若新库已有数据,导入前在目标库执行 ALTER TABLE t AUTO_INCREMENT = N;(N 为源库最大值+1) 时间类型字段行为差异(如 0000-00-00):MySQL 5.7 默认 sql_mode 含 NO_ZERO_DATE,8.0 更严格。可在导入前临时设置:SET SESSION sql_mode='';