sync_diff数据校验报错

想校验tidb 和 tidb 的数据,执行命令的时候报错:


上游tidb版本:4.0.8 下游tidb版本:7.1.1

# Diff Configuration.

######################### Global config #########################

# 检查数据的线程数量,上下游数据库的连接数会略大于该值
check-thread-count = 4


# 如果开启,若表存在不一致,则输出用于修复的 SQL 语句。
export-fix-sql = true

# 只对比表结构而不对比数据
check-struct-only = false

######################### Datasource config #########################
[data-sources]
[data-sources.mysql1] # mysql1 是该数据库实例唯一标识的自定义 id,用于下面 task.source-instances/task.target-instance 中
    host = "*****"
    port = 4000
    user = "root"
    password = "****" # 设置连接上游数据库的密码,可为明文或 Base64 编码。

    #(可选)使用映射规则来匹配上游多个分表,其中 rule1 和 rule2 在下面 Routes 配置栏中定义
    route-rules = ["rule1"]

[data-sources.tidb0]
    host = "****"
    port = 8000
    user = "****"
    password = "****" # 设置连接下游数据库的密码,可为明文或 Base64 编码。

    #(可选)使用 TLS 连接 TiDB
    # security.ca-path = ".../ca.crt"
    # security.cert-path = ".../cert.crt"
    # security.key-path = ".../key.crt"

    #(可选)使用 TiDB 的 snapshot 功能,如果开启的话会使用历史数据进行对比
    # snapshot = "386902609362944000"
    # 当 snapshot 设置为 "auto" 时,使用 TiCDC 在上下游的同步时间点,具体参考 <https://github.com/pingcap/tidb-tools/issues/663>
    # snapshot = "auto"

########################### Routes ###########################
# 如果需要对比大量的不同库名或者表名的表的数据,或者用于校验上游多个分表与下游总表的数据,可以通过 table-rule 来设置映射关系
# 可以只配置 schema 或者 table 的映射关系,也可以都配置
#[routes]
#[routes.rule1] # rule1 是该配置的唯一标识的自定义 id,用于上面 data-sources.route-rules 中
#schema-pattern = "ceshi"      # 匹配数据源的库名,支持通配符 "*" 和 "?"
#table-pattern = "insurance_area_face_mode"          # 匹配数据源的表名,支持通配符 "*" 和 "?"
#target-schema = "epp"         # 目标库名
#target-table = "insurance_area_face_mode" # 目标表名

#[routes.rule2]
#schema-pattern = "test2_*"      # 匹配数据源的库名,支持通配符 "*" 和 "?"
#table-pattern = "t2_*"          # 匹配数据源的表名,支持通配符 "*" 和 "?"
#target-schema = "test2"         # 目标库名
#target-table = "t2" # 目标表名

######################### Task config #########################
# 配置需要对比的*目标数据库*中的表
[task]
    # output-dir 会保存如下信息
    # 1 sql: 检查出错误后生成的修复 SQL 文件,并且一个 chunk 对应一个文件
    # 2 log: sync-diff.log 保存日志信息
    # 3 summary: summary.txt 保存总结
    # 4 checkpoint: a dir 保存断点续传信息
    output-dir = "./output"

    # 上游数据库,内容是 data-sources 声明的唯一标识 id
    source-instances = ["mysql1"]

    # 下游数据库,内容是 data-sources 声明的唯一标识 id
    target-instance = "tidb0"
    # 需要比对的下游数据库的表,每个表需要包含数据库名和表名,两者由 `.` 隔开
    # 使用 ? 来匹配任意一个字符;使用 * 来匹配任意;详细匹配规则参考 golang regexp pkg: https://github.com/google/re2/wiki/Syntax
    target-check-tables = ["visadb.vsParamCompany"]

补充配置文件

route-rules = ["rule1"]

像是这一行的问题,因为下面的rule1被你注释掉了。这个应该是关联不到的。把这一行注释掉,再试试看。

1 个赞

这一行注释了 也不行还是报同样的错误

你的 sync_diff版本是4.0的,但是你的sync_diff.toml文件内容则是7.1的格式。

下面这个链接来自4.0版本的sync_diff文档,你可以看到里面的配置文件内容写法有很大的不同。

https://docs.pingcap.com/zh/tidb/v4.0/sync-diff-inspector-overview

######################### Databases config #########################

# 源数据库实例的配置
[[source-db]]
    host = "127.0.0.1"
    port = 3306
    user = "root"
    password = "123456"
    # 源数据库实例的 id,唯一标识一个数据库实例
    instance-id = "source-1"
    # 使用 TiDB 的 snapshot 功能,如果开启的话会使用历史数据进行对比
    # snapshot = "2016-10-08 16:45:26"
    # 设置数据库的 sql-mode,用于解析表结构
    # sql-mode = ""

# 目标数据库实例的配置
[target-db]
    host = "127.0.0.1"
    port = 4000
    user = "root"
    password = "123456"
    # 使用 TiDB 的 snapshot 功能,如果开启的话会使用历史数据进行对比
    # snapshot = "2016-10-08 16:45:26"
    # 设置数据库的 sql-mode,用于解析表结构
    # sql-mode = ""

所以根本识别不到source-db的配置。

是的,配置文件是不贴的不对呢

好的 谢谢,这个确实没有关注,以为配置文件都一样的写法,我更改下

更改了配置文件,可以执行了,但是我上下游的表结构不一致,导致报错了,想问下,这个工具只能校验表结构一致的表,如果表结构不一致的话是不是没有办法校验了,目前上游是12个字段,下游是21个字段

1 个赞

是的,校验本质上是对范围的列进行hash值运算。字段不同,就算出来肯定不同。不过印象中syncdiff是有注释忽略某列的功能的。可以把多的列注释掉试试。

1 个赞

配置文件里有个ignore-columns 可以忽略某些列的对比

1 个赞

有页面可以查到sync_diff参数变化了哪些么?除了ReleaseNotes

不清楚,要不是他有报错信息,我才去比对了一下版本参数变化,我都没想到变化这么大。

而且截图里看这sync diff 是4.0.9 还不是4.0.8,提示的比较清楚就是配置项不对,
不过可以肯定的说是老用户无疑了

好嘞,谢谢 不过很多表的字段数量都不一样,这样排查起来有点困难,像我这种情况,数据进行校验的话有没有建议

没有。除非只校验条数,写个count脚本

话说回来,版本差异这么大,是为了验证新版本么,为升级做准备么?

原来的业务在4.0.8 ,业务升级正好也申请了新的服务器,就部署了新的版本,业务想切到新的版本上

此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。