本文目录导读:

在数据迁移前进行预检查,是确保迁移顺利、避免数据丢失或损坏的关键步骤,一个完整的预检查方案通常涵盖源端、目标端、网络与工具、数据一致性四个维度。
以下是一套系统化的预检查流程和检查清单,供你参考。
源端检查:确保数据“出得来”
-
存储空间与性能
- 检查项:源数据库/服务器的磁盘剩余空间是否足够(用于备份或导出临时文件)。
- 指标:IOPS(每秒读写次数)、吞吐量是否接近瓶颈。
- 注意:避免在业务高峰期进行全量备份导出,防止IO争抢导致业务卡顿。
-
数据库状态与参数
- 检查项:
- 数据库是否正常运行,有无挂起的死锁或长事务。
- 归档日志模式(适用于Oracle等)是否开启,日志是否能完整覆盖迁移窗口。
- 表空间、数据文件是否处于可用状态(无OFFLINE、READ ONLY)。
- 命令示例(MySQL):
SHOW PROCESSLIST(检查长事务);SHOW VARIABLES LIKE ‘%timeout%’(检查超时设置)。
- 检查项:
-
对象完整性
- 检查项:
- 所有表是否有主键(对于CDC实时同步至关重要)。
- 外键、触发器、存储过程是否完整,且依赖关系清晰。
- 有无自增ID、序列的断点或冲突风险。
- 工具:使用
mysqldump --all-databases先模拟导出一个DDL文件进行语法检查。
- 检查项:
-
数据量与脏数据
- 检查项:预估需迁移的数据总量(行数、表大小),检测是否有乱码、NULL值超限、不合规的日期格式(如‘0000-00-00’)。
目标端检查:确保环境“接得住”
-
版本与字符集兼容
- 检查项:
- 目标数据库版本是否不低于源端(或已知兼容性矩阵允许)。
- 字符集(UTF-8、GBK、Latin1)是否一致或可无损转换,源端是
GBK,目标端是UTF8mb4,需要确认没有生僻字会变成乱码。
- 关键:注意
UTF8与UTF8mb4在MySQL中的差异,后者才是真正的4字节UTF-8。
- 检查项:
-
磁盘与连接资源
- 检查项:目标端磁盘剩余空间 >(源端数据量 x 1.5到2倍)(考虑到索引重建和undo日志膨胀),最大连接数(
max_connections)是否足够容纳迁移工具和业务连接。
- 检查项:目标端磁盘剩余空间 >(源端数据量 x 1.5到2倍)(考虑到索引重建和undo日志膨胀),最大连接数(
-
目标库状态
- 检查项:目标库必须为空库(或已有结构且无数据冲突),权限账户是否有
CREATE TABLE、ALTER、INSERT、INDEX等权限。
- 检查项:目标库必须为空库(或已有结构且无数据冲突),权限账户是否有
网络与工具检查:确保通道“通得了”
-
网络连通性与延迟
- 操作:
ping <目标IP>(看丢包率);telnet <目标IP> <端口>(看端口是否开放)。 - 指标:延迟低于5ms为优,高于50ms需考虑分批或压缩传输,带宽估算:(数据量 / 预计耗时)* 8 < 可用带宽的70%(留余量)。
- 操作:
-
防火墙与白名单
- 检查项:两端防火墙规则是否放开迁移工具的端口(如MySQL 3306、Oracle 1521、SSH 22、MQTT 1883等)。
- 常见坑:云数据库的安全组出/入方向规则是否遗漏。
-
迁移工具适配性
- 检查项:如使用DTS(数据迁移服务)、DataX、Kettle、或自研脚本,需在测试环境运行一次“预迁移”任务,看是否有不支持的DDL语句或数据类型(PostgreSQL的
array类型转到MySQL需特殊处理)。
- 检查项:如使用DTS(数据迁移服务)、DataX、Kettle、或自研脚本,需在测试环境运行一次“预迁移”任务,看是否有不支持的DDL语句或数据类型(PostgreSQL的
数据一致性模拟检查:模拟“走得稳”
-
行数对比
- 方法:在源端和目标端分别执行
SELECT COUNT(1) FROM t_table,如果对比不通过,需排查是否有增量数据写入或掉行。 - 进阶:对分片表,统计各分片之和;对时间分区表,确认分区边界。
- 方法:在源端和目标端分别执行
-
关键字段校验
- 方法:使用
CHECKSUM TABLE t_table(MySQL)或DBMS_UTILITY.GET_HASH_VALUE(Oracle)对关键表计算MD5,对比两端的哈希值。
- 方法:使用
-
增量数据截断测试
- 方法:在测试库模拟写入100条数据,然后启动增量迁移,检查是否完全同步。
工具推荐与自动化脚本
-
常用工具:
- MySQL:
pt-table-checksum(Percona Toolkit),自动校验主从一致性。 - 通用:
DataX(阿里开源)的preCheck模式;ClickHouse等列存数据库的remote函数。
- MySQL:
-
简易脚本示例(Bash + MySQL CLI):
# 快速检查所有表的行数 mysql -h源IP -u用户 -p密码 -e “SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_ROWS FROM information_schema.TABLES WHERE TABLE_SCHEMA=‘database_name’ ORDER BY TABLE_ROWS DESC;” > source_rows.txt mysql -h目标IP -u用户 -p密码 -e “USE database_name; SHOW TABLES;” | while read table; do echo “$table: ” >> target_rows.txt mysql -h目标IP -u用户 -p密码 -e “SELECT COUNT(1) FROM database_name.$table;” >> target_rows.txt done
预检查清单(精简版)
| 类别 | 关键检查项 | 通过标准 |
|---|---|---|
| ✅ 源端 | 存储空间 | 有临时导出空间(1.5x数据量) |
| ✅ 源端 | 字符集 | 源端字符集可被目标端无损接收 |
| ✅ 目标端 | 磁盘与连接 | 空闲空间 >= 2x数据量,连接数足够 |
| ✅ 网络 | 延迟与丢包 | ping < 10ms,丢包率0% |
| ✅ 权限 | 目标端写入权限 | 拥有CREATE/INSERT/ALTER/INDEX等 |
| ✅ 数据 | 行数校验 | 上10万行级可按表count,大表抽样 |
| ✅ 工具 | 兼容性测试 | 测试环境跑通全量+增量迁移 |
最后建议:务必在测试环境执行一次完整的预迁移演练,并记录所有报错,实际迁移时,建议开启事务日志(如Binlog、Redo log),以便失败时能进行回滚。