分库分表场景下的数据校验

sync-diff-inspector 支持对分库分表场景进行数据校验。例如有多个 MySQL 实例,使用同步工具 DM 同步到一个 TiDB 中,用户可以使用 sync-diff-inspector 对上下游数据进行校验。

使用 table-config 进行配置

使用 table-configtable-0 进行特殊配置,设置 is-sharding=true,并且在 table-config.source-tables 中配置上游表信息。这种配置方式需要对所有分表进行设置,适合上游分表数量较少,且分表的命名规则没有规律的场景。场景如图所示:

shard-table-sync-1

sync-diff-inspector 完整的示例配置如下:

  1. # Diff Configuration.
  2. ######################### Global config #########################
  3. # 日志级别,可以设置为 info、debug
  4. log-level = "info"
  5. # sync-diff-inspector 根据主键/唯一键/索引将数据划分为多个 chunk,
  6. # 对每一个 chunk 的数据进行对比。使用 chunk-size 设置 chunk 的大小
  7. chunk-size = 1000
  8. # 检查数据的线程数量
  9. check-thread-count = 4
  10. # 抽样检查的比例,如果设置为 100 则检查全部数据
  11. sample-percent = 100
  12. # 通过计算 chunk 的 checksum 来对比数据,如果不开启则逐行对比数据
  13. use-checksum = true
  14. # 如果设置为 true 则只会通过计算 checksum 来校验数据,如果上下游的 checksum 不一致也不会查出数据再进行校验
  15. only-use-checksum = false
  16. # 是否使用上次校验的 checkpoint,如果开启,则只校验上次未校验以及校验失败的 chunk
  17. use-checkpoint = true
  18. # 不对比数据
  19. ignore-data-check = false
  20. # 不对比表结构
  21. ignore-struct-check = false
  22. # 保存用于修复数据的 sql 的文件名称
  23. fix-sql-file = "fix.sql"
  24. ######################### Tables config #########################
  25. # 配置需要对比的目标数据库中的表
  26. [[check-tables]]
  27. # 库的名称
  28. schema = "test"
  29. # 需要检查的表的名称
  30. tables = ["table-0"]
  31. # 配置该表对应的分表的相关配置
  32. [[table-config]]
  33. # 目标库的名称
  34. schema = "test"
  35. # 目标库中表的名称
  36. table = "table-0"
  37. # 为分库分表场景下数据的对比,设置为 true
  38. is-sharding = true
  39. # 源数据表的配置
  40. [[table-config.source-tables]]
  41. # 源数据库实例的 id
  42. instance-id = "MySQL-1"
  43. schema = "test"
  44. table = "table-1"
  45. [[table-config.source-tables]]
  46. # 源数据库实例的 id
  47. instance-id = "MySQL-1"
  48. schema = "test"
  49. table = "test-2"
  50. [[table-config.source-tables]]
  51. # 源数据库实例的 id
  52. instance-id = "MySQL-2"
  53. schema = "test"
  54. table = "table-3"
  55. ######################### Databases config #########################
  56. # 源数据库实例的配置
  57. [[source-db]]
  58. host = "127.0.0.1"
  59. port = 3306
  60. user = "root"
  61. password = "123456"
  62. instance-id = "MySQL-1"
  63. # 源数据库实例的配置
  64. [[source-db]]
  65. host = "127.0.0.2"
  66. port = 3306
  67. user = "root"
  68. password = "123456"
  69. instance-id = "MySQL-2"
  70. # 目标数据库实例的配置
  71. [target-db]
  72. host = "127.0.0.3"
  73. port = 4000
  74. user = "root"
  75. password = "123456"
  76. instance-id = "target-1"

使用 table-rules 进行配置

当上游分表较多,且所有分表的命名都符合一定的规则时,则可以使用 table-rules 进行配置。场景如图所示:

shard-table-sync-2

sync-diff-inspector 完整的示例配置如下:

  1. # Diff Configuration.
  2. ######################### Global config #########################
  3. # 日志级别,可以设置为 info、debug
  4. log-level = "info"
  5. # sync-diff-inspector 根据主键/唯一键/索引将数据划分为多个 chunk,
  6. # 对每一个 chunk 的数据进行对比。使用 chunk-size 设置 chunk 的大小
  7. chunk-size = 1000
  8. # 检查数据的线程数量
  9. check-thread-count = 4
  10. # 抽样检查的比例,如果设置为 100 则检查全部数据
  11. sample-percent = 100
  12. # 通过计算 chunk 的 checksum 来对比数据,如果不开启则逐行对比数据
  13. use-checksum = true
  14. # 如果设置为 true 则只会通过计算 checksum 来校验数据,如果上下游的 checksum 不一致也不会查出数据再进行校验
  15. only-use-checksum = false
  16. # 是否使用上次校验的 checkpoint,如果开启,则只校验上次未校验以及校验失败的 chunk
  17. use-checkpoint = true
  18. # 不对比数据
  19. ignore-data-check = false
  20. # 不对比表结构
  21. ignore-struct-check = false
  22. # 保存用于修复数据的 sql 的文件名称
  23. fix-sql-file = "fix.sql"
  24. ######################### Tables config #########################
  25. # 配置需要对比的目标数据库中的表
  26. [[check-tables]]
  27. # 库的名称
  28. schema = "test"
  29. # 需要检查的表的名称
  30. tables = ["table-0"]
  31. # 通过 table-rule 来设置上游分表与下游总表的映射关系。可以只配置 schema 或者 table 的映射关系,也可以都配置
  32. [[table-rules]]
  33. # schema-pattern 和 table-pattern 支持通配符 *?
  34. # 在 source-db 中配置的上游数据库中所有满足 schema-pattern 和 table-pattern 规则的表都为 target-schema.target-table 的分表
  35. schema-pattern = "test"
  36. table-pattern = "table-*"
  37. target-schema = "test"
  38. target-table = "table-0"
  39. ######################### Databases config #########################
  40. # 源数据库实例的配置
  41. [[source-db]]
  42. host = "127.0.0.1"
  43. port = 3306
  44. user = "root"
  45. password = "123456"
  46. instance-id = "MySQL-1"
  47. # 源数据库实例的配置
  48. [[source-db]]
  49. host = "127.0.0.2"
  50. port = 3306
  51. user = "root"
  52. password = "123456"
  53. instance-id = "MySQL-2"
  54. # 目标数据库实例的配置
  55. [target-db]
  56. host = "127.0.0.3"
  57. port = 4000
  58. user = "root"
  59. password = "123456"
  60. instance-id = "target-1"