sync-diff-inspector 在线校验数据

背景:使用数据校验工具进行上下游mysql 一致性校验
上下游mysql 使用的是dm 进行数据同步

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

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

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

######################### Datasource config #########################
[data-sources]
[data-sources.mysql1] 
    host = "10.105.xxxx"
    port = 4012
    user = "tidb_worker"
    password = "xxxxxxxx"
    route-rules = ["rule1"]

[data-sources.tidb0]
    host = "10.105.xxxx"
    port = 3862
    user = "test123_app"
    password = "58IR_rxxxx"

########################### Routes ###########################
[routes]
[routes.rule1]                 
schema-pattern = "tidb_sync"    
target-schema = "test123"       

######################### Task config #########################
# 配置需要对比的*目标数据库*中的表
[task]
    output-dir = "/home/tidb/output"
    source-instances = ["mysql1"]
    target-instance = "tidb0"
    target-check-tables = ["test123.*"]

在静态的情况下可以通过校验,但是在上游有写入的时候,校验同步进度就会卡主。


请问此工具是否可以进行mysql → mysql 的数据实时同步 ?
上面的配置是否有需要调整的地方 ?


===> 在热心网友的建议下,这次降低了上游的请求并发,检验可以跑一会,但是最终还是以失败停止。
前台日志如下

报错信息如下:

[2022/06/13 18:28:01.477 +08:00] [FATAL] [diff.go:565] ["the isEqual1 and isEqual2 cannot be both true"] [stack="main.(*Diff).binSearch\
\t/home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/tidb-tools/sync_diff_inspector/diff.go:565\
main.(*Diff).BinGenerate\
\t/home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/tidb-tools/sync_diff_inspector/diff.go:496\
main.(*Diff).consume\
\t/home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/tidb-tools/sync_diff_inspector/diff.go:435\
main.(*Diff).Equal.func2\
\t/home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/tidb-tools/sync_diff_inspector/diff.go:284\
github.com/pingcap/tidb-tools/sync_diff_inspector/utils.(*WorkerPool).Apply.func1\
\t/home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/tidb-tools/sync_diff_inspector/utils/utils.go:75"]

明显是可以的

看配置应该是没什么问题。用的是哪个版本的sync-diff-inspector呢?

sync-diff-inspector在线比对DM上下游的数据,这个有没有案例?我们也有这样的需求场景,但是官方文档上 sync-diff-inspector 的使用限制那一节,第一个使用限制就是:

对于 MySQL 和 TiDB 之间的数据同步不支持在线校验,需要保证上下游校验的表中没有数据写入,或者保证某个范围内的数据不再变更,通过配置 range 来校验这个范围内的数据。

[tidb@db-tidb-238-146 tidb-toolkit]$ bin/sync_diff_inspector --version
App Name: sync_diff_inspector v2.0

2.0版本的

这个我看到了,明确说明不支持mysql – tidb 的在线校验,不知道mysql - mysql 的行不行。因为群里有哥们说可以,所以需要跟官方再确认下。我测试的结果是会卡主的

数据有变更没法保证校验的准确性,而且有可能触发sync-diff异常退出。

但是可以多次校验之后对校验结果做聚合,剔除那些在校验过程中发生变更的数据不一致。

也可以试试升级sync-diff-inspector版本,比如用v5.4.1:https://download.pingcap.org/tidb-community-toolkit-v5.4.1-linux-amd64.tar.gz

我们mysql 上下游都是5.7的,通过dm 同步的。你们是啥版本的mysql,是校验的主从架构吗 ?

mysql -> mysql 同步,5.7版本。也有可能是我们写入量小,没有触发你遇到的问题。。。