sync-diff-inspector 用户文档

    主要功能:

    GitHub 地址:sync-diff-inspector

    下载地址:

    • 不支持 JSON、BIT、BINARY、BLOB 等类型的数据,在校验时需要设置 ignore-columns 忽略检查这些类型的数据。

    • FLOAT、DOUBLE 等浮点数类型在 TiDB 和 MySQL 中的实现方式不同,在计算 checksum 时可能存在差异,如果发现因为这些类型的数据导致的数据校验不一致,需要设置 ignore-columns 忽略这些列的检查。

    • 支持对不包含主键或者唯一索引的表进行校验,但是如果数据不一致,生成的用于修复的 SQL 可能无法正确修复数据。

    sync-diff-inspector 需要获取表结构信息、查询数据、建 checkpoint 库保存断点信息,需要的数据库权限如下:

    • 上游数据库

      • SHOW_DATABASES (查看库名)

      • RELOAD (查看表结构)

    • 下游数据库

      • SELECT (查数据进行对比)

      • CREATE (创建 checkpoint 库和表)

      • DELETE (删除 checkpoint 表中的信息)

      • INSERT (写入 checkpoint 表)

      • UPDATE(修改 checkpoint 表)

    sync-diff-inspector 的配置总共分为三个部分:

    • Global config: 通用配置,包括日志级别、划分 chunk 的大小、校验的线程数量等。
    • Tables config: 配置校验哪些表,如果有的表在上下游有一定的映射关系或者有一些特殊要求,则需要对指定的表进行配置。
    • Databases config: 配置上下游数据库实例。

    下面是一个完整配置文件的说明:

    执行如下命令:

    该命令最终会在日志中输出一个检查报告,说明每个表的检查情况。如果数据存在不一致的情况,sync-diff-inspector 会生成 SQL 修复不一致的数据,并将这些 SQL 语句保存到 fix.sql 文件中。

    日志

    sync-diff-inspector 会在运行时定期(间隔 10s)输出校验进度到日志中,格式如下:

    • chunk num:总共需要校验的 chunk 数量。
    • success num:已经校验数据一致的 chunk 数量。
    • failed num:校验失败的 chunk 数量。校验时遇到错误和数据不一致两种情况都属于校验失败。
    • ignore num:被忽略校验的 chunk 数量。当配置项 sample-percent 的值小于 时,sync-diff-inspector 会采用抽样的方式校验数据,这样就会有部分 chunk 被忽略校验。

    校验结果

    当校验结束时,sync-diff-inspector 会输出一份校验报告。

    • 数据校验一致的日志示例如下:

    • 数据校验不一致或者遇到错误时的日志示例如下:

    校验通过和未通过的表的个数打印在 check result summary 中。所有表的校验结果的打印在 table check result 中。

    • sync-diff-inspector 在校验数据时会消耗一定的服务器资源,需要避免在业务高峰期间校验。
    • TiDB 使用的 collation 为 utf8_bin。如果对 MySQL 和 TiDB 的数据进行对比,需要注意 MySQL 中表的 collation 设置。如果表的主键/唯一键为 varchar 类型,且 MySQL 中 collation 设置与 TiDB 不同,可能会因为排序问题导致最终校验结果不正确,需要在 sync-diff-inspector 的配置文件中增加 collation 设置。
    • sync-diff-inspector 会优先使用 TiDB 的统计信息来划分 chunk,需要尽量保证统计信息精确,可以在业务空闲期手动执行 analyze table {table_name}
    • 生成的 fix.sql 仅作为修复数据的参考,需要确认后再执行这些 SQL 修复数据。