MySQL 資料對比

aoerqileng發表於2021-09-02

MySQL資料對比是常見的日常任務,使用pt-checksum 只能對比主從複製的資料,並且效率和使用上也不太方便。

因此寫了一個對比的工具mydiff,經過測試對比50張500萬的表,能在30s內完成。

要求,mysql 表必須有自增主鍵,對比期間不會加鎖。對於不是非常非常高併發的主從複製,也可以進行資料的對比。

可以非常方便的加入到日常的定時任務中。建議使用單獨的機器執行對比,並把結果儲存在單獨的資料庫例項中。


使用:在db.conf.json中指定需要對比的資料庫資訊。以及儲存結果的資料庫資訊即可。

CheckTables 可以指定全部對比,也可以指定對位元定的表

{
"SourceMySQLHost": "127.0.0.1",
"SourceMySQLPort": 20996,
"SourceMySQLDB": "test",
"SourceMySQLUser": "msandbox",
"SourceMySQLUserPassword": "msandbox",
"TargetMySQLHost": "127.0.0.1",
"TargetMySQLPort": 20996,
"TargetMySQLDB": "test2",
"TargetMySQLUser": "msandbox",
"TargetMySQLUserPassword": "msandbox",
"ChecksumHost": "127.0.0.1",
"ChecksumPort": 20996,
"ChecksumDB": "test",
"ChecksumUser": "msandbox",
"ChecksumPassword": "msandbox",
"CheckTables":"*",
"ChunkSize":2000,
"CommitLimit":1000 --批次提交crc結果數量
}


 測試輸出:

go run *.go
2022-01-13 09:49:33 INFO Read config: db.conf.json
table not in target:[accounts accounts2 accounts3 accounts_del active_node crc_1 crc_2 crc_result cycle_count_task_assignment_rule_v2_tab dba_test experiment_config_tab inbound_mbn_tab node_health node_health_history rs sbtest5_bak t_checksum user_bak user_infos]
table not in source:[sbtest5 user2]
tables to be compare:[user]
begin compare table:%s int db tables user test test2
Getting nothing in the write queue. Sleeping...
diff values chunk len: 5
begin to find diff rows in table: test user
compare diff..........
Table rows in test.user chunk_num:5854 crc is not same,check end_pk row
Getting nothing in the write queue. Sleeping...
begin to find diff rows in table: test user
compare diff..........
Table rows in test.user chunk_num:7841 crc is not same,check end_pk row
Getting nothing in the write queue. Sleeping...
begin to find diff rows in table: test user
compare diff..........
Table rows in test.user chunk_num:9275 crc is not same,check end_pk row
Getting nothing in the write queue. Sleeping...
begin to find diff rows in table: test user
compare diff..........
Table rows in test.user chunk_num:11507 crc is not same,check end_pk row
Getting nothing in the write queue. Sleeping...
begin to find diff rows in table: test user
compare diff..........
Table rows in test.user chunk_num:13173 crc is not same,check end_pk row
Getting nothing in the write queue. Sleeping...
table compare elapsed: 25.583540092s
done


根據提示查詢對應的chunk,或者直接用sql查詢crc_result表,獲取不一樣的記錄

 select * from crc_result where chunk_num=11507;
+-------+--------+------------+-----------+----------+--------+----------+-----+---------------------+--------+
| id    | dbname | table_name | chunk_num | start_pk | end_pk | crc      | cnt | ctime               | which  |
+-------+--------+------------+-----------+----------+--------+----------+-----+---------------------+--------+
| 59719 | test   | user       |     11507 | 81022    | 81024  | ac9e9b3  |   1 | 2022-01-13 09:49:58 | source |
| 59720 | test2  | user       |     11507 | 81022    | 81024  | 7573c5a8 |   2 | 2022-01-13 09:49:58 | target |
+-------+--------+------------+-----------+----------+--------+----------+-----+---------------------+--------+
select * from crc_result where chunk_num=9275;
+-------+--------+------------+-----------+----------+--------+----------+-----+---------------------+--------+
| id    | dbname | table_name | chunk_num | start_pk | end_pk | crc      | cnt | ctime               | which  |
+-------+--------+------------+-----------+----------+--------+----------+-----+---------------------+--------+
| 55255 | test   | user       |      9275 | 12457    | 12458  | a2e9ba83 |   1 | 2022-01-13 09:49:56 | source |
| 55256 | test2  | user       |      9275 | 12457    | 12458  | 67fab947 |   1 | 2022-01-13 09:49:56 | target |
+-------+--------+------------+-----------+----------+--------+----------+-----+---------------------+--------+


第一個輸出中看到crc不一樣,cnt也不一樣,說明chunk中的記錄行數不一樣


第二個輸出中看到crc內容不一樣,對應的行內容不一樣

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25719946/viewspace-2790185/,如需轉載,請註明出處,否則將追究法律責任。

相關文章