sync_diff_inspector是TiDB提供的數據效驗的工具。
可以用來比對TiDB與MySQL中的數據是否一致,也會檢查schema。資料不一致的時候,會產生修復的SQL語法。
但是有個使用上的限制,在執行校驗時,必須保證兩邊是沒有新資料寫入的情況下。
官網提供了執行的範本,可供參考,以下我提供我變更的部分。
首先使用情境是,我只要比對test.tidb_test這張表的資料。
[[check-tables]]
schema = "test"
tables = ["tidb_test"]
然後指定我的來源和目標資料庫ip和帳密。
[[source-db]]
host = "10.102.1.4"
port = 3306
user = "tidb_rep"
password = "不給你看"
instance-id = "source-1"
# 目标数据库实例的配置
[target-db]
host = "10.102.1.92"
port = 4000
user = "root"
password = ""
接下來執行sync_diff_inspector
./sync_diff_inspector --config=/root/diff_config.toml
執行後會跑出很長很長很長一串的log...只要看最後一句就知道是否成功。[2021/09/13 09:20:45.116 +00:00] [INFO] [main.REPLACE INTO `test`.`tidb_test`(`id`,`name`,`age`,`salary`) VALUES (4,'diff_test',99,99999);go:69] ["check pass!!!"]
故意多寫一筆資料讓兩邊資料不一致再跑一次看看[2021/09/13 09:21:46.195 +00:00] [WARN] [main.go:66] ["check failed!!!"]
檢查出來是失敗的,並且會產生一個fix.sql檔案裡面有記錄怎麼修復的語法
REPLACE INTO `test`.`tidb_test`(`id`,`name`,`age`,`salary`) VALUES (4,'diff_test',99,99999);
除了全表比較以外,也可以設定只比對某個範圍內的資料,例如我只要比較年齡在10到20歲之前的資料,
只要在設定檔定義range="age>=10 and age<=20",range的設定比照SQL語法。也可以這樣做比較。