怎样在数据迁移前进行预检查?

wen IT资讯 240

本文目录导读:

怎样在数据迁移前进行预检查?

  1. 源端检查:确保数据“出得来”
  2. 目标端检查:确保环境“接得住”
  3. 网络与工具检查:确保通道“通得了”
  4. 数据一致性模拟检查:模拟“走得稳”
  5. 工具推荐与自动化脚本
  6. 总结:预检查清单(精简版)

在数据迁移前进行预检查,是确保迁移顺利、避免数据丢失或损坏的关键步骤,一个完整的预检查方案通常涵盖源端、目标端、网络与工具、数据一致性四个维度。

以下是一套系统化的预检查流程和检查清单,供你参考。

源端检查:确保数据“出得来”

  1. 存储空间与性能

    • 检查项:源数据库/服务器的磁盘剩余空间是否足够(用于备份或导出临时文件)。
    • 指标:IOPS(每秒读写次数)、吞吐量是否接近瓶颈。
    • 注意:避免在业务高峰期进行全量备份导出,防止IO争抢导致业务卡顿。
  2. 数据库状态与参数

    • 检查项
      • 数据库是否正常运行,有无挂起的死锁或长事务。
      • 归档日志模式(适用于Oracle等)是否开启,日志是否能完整覆盖迁移窗口。
      • 表空间、数据文件是否处于可用状态(无OFFLINE、READ ONLY)。
    • 命令示例(MySQL):SHOW PROCESSLIST (检查长事务);SHOW VARIABLES LIKE ‘%timeout%’(检查超时设置)。
  3. 对象完整性

    • 检查项
      • 所有表是否有主键(对于CDC实时同步至关重要)。
      • 外键、触发器、存储过程是否完整,且依赖关系清晰。
      • 有无自增ID、序列的断点或冲突风险。
    • 工具:使用 mysqldump --all-databases 先模拟导出一个DDL文件进行语法检查。
  4. 数据量与脏数据

    • 检查项:预估需迁移的数据总量(行数、表大小),检测是否有乱码、NULL值超限、不合规的日期格式(如‘0000-00-00’)。

目标端检查:确保环境“接得住”

  1. 版本与字符集兼容

    • 检查项
      • 目标数据库版本是否不低于源端(或已知兼容性矩阵允许)。
      • 字符集(UTF-8、GBK、Latin1)是否一致或可无损转换,源端是GBK,目标端是UTF8mb4,需要确认没有生僻字会变成乱码。
    • 关键:注意UTF8UTF8mb4在MySQL中的差异,后者才是真正的4字节UTF-8。
  2. 磁盘与连接资源

    • 检查项:目标端磁盘剩余空间 >(源端数据量 x 1.5到2倍)(考虑到索引重建和undo日志膨胀),最大连接数(max_connections)是否足够容纳迁移工具和业务连接。
  3. 目标库状态

    • 检查项:目标库必须为空库(或已有结构且无数据冲突),权限账户是否有CREATE TABLEALTERINSERTINDEX等权限。

网络与工具检查:确保通道“通得了”

  1. 网络连通性与延迟

    • 操作ping <目标IP>(看丢包率);telnet <目标IP> <端口>(看端口是否开放)。
    • 指标:延迟低于5ms为优,高于50ms需考虑分批或压缩传输,带宽估算:(数据量 / 预计耗时)* 8 < 可用带宽的70%(留余量)。
  2. 防火墙与白名单

    • 检查项:两端防火墙规则是否放开迁移工具的端口(如MySQL 3306、Oracle 1521、SSH 22、MQTT 1883等)。
    • 常见坑:云数据库的安全组出/入方向规则是否遗漏。
  3. 迁移工具适配性

    • 检查项:如使用DTS(数据迁移服务)、DataX、Kettle、或自研脚本,需在测试环境运行一次“预迁移”任务,看是否有不支持的DDL语句或数据类型(PostgreSQL的array类型转到MySQL需特殊处理)。

数据一致性模拟检查:模拟“走得稳”

  1. 行数对比

    • 方法:在源端和目标端分别执行 SELECT COUNT(1) FROM t_table,如果对比不通过,需排查是否有增量数据写入或掉行。
    • 进阶:对分片表,统计各分片之和;对时间分区表,确认分区边界。
  2. 关键字段校验

    • 方法:使用 CHECKSUM TABLE t_table(MySQL)或 DBMS_UTILITY.GET_HASH_VALUE(Oracle)对关键表计算MD5,对比两端的哈希值。
  3. 增量数据截断测试

    • 方法:在测试库模拟写入100条数据,然后启动增量迁移,检查是否完全同步。

工具推荐与自动化脚本

  • 常用工具

    • MySQLpt-table-checksum(Percona Toolkit),自动校验主从一致性。
    • 通用DataX(阿里开源)的preCheck模式;ClickHouse等列存数据库的remote函数。
  • 简易脚本示例(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),以便失败时能进行回滚。

抱歉,评论功能暂时关闭!