功能介紹:
檢查mysql複製一致性
工作原理:
通過在主服務器上運行pt-table-checksum,它會通過一系列的MySQL函數計算每個表的散列值,利用主從複製關係,把同樣的計算過程在從服務器上重放,從而就拿到了主從服務器各自的散列值,只要比較散列值是否相同就OK了。
注意:使用的時候選擇業務地峯的時候運行,因爲運行的時候會造成表的部分記錄鎖定。使用--max-load
來指定最大的負載情況,如果達到那個負載這個暫停運行。如果發現有不一致的數據,可以使用pt-table-sync工具來修復。
使用說明
shell> pt-table-checksum [OPTIONS] [DSN]
詳情可參考
shell> pt-table-checksum --help
常用參數:
--nocheck-replication-filters :不檢查複製過濾器,建議啓用。後面可以用--databases來指定需要檢查的數據庫。
--no-check-binlog-format : 不檢查複製的binlog模式。
--replicate-check-only :只顯示不同步的信息。
--replicate= :指定checksum的信息寫入的表。
--databases= :指定需要被檢查的數據庫,多個則用逗號隔開。
--tables= :指定需要被檢查的表,多個用逗號隔開
--chunk-size=z: 指定每個校驗查詢的行數,默認爲1000
--function=s :指定校驗的哈希函數(FNV1A_64,MURMUR_HASH, SHA1, MD5, CRC32, etc)
安裝使用
主從配置一致
shell> tar -zxvf percona-toolkit-2.2.9.tar.gz
shell> perl Makefile.PL
shell> make && make install
[master]
mysql> GRANT SELECT, PROCESS, SUPER, REPLICATION SLAVE ON *.* TO 'svoid'@'localhost' IDENTIFIED BY '123qwe';
shell> pt-table-checksum h='127.0.0.1',u='svoid',p='123qwe',P=3306 -d db_test --nocheck-replication-filters
--replicate=test.checksums --no-check-binlog-format
# 2 software updates are available:
# * The current version for MySQL Community Server (GPL) is 5.5.40.
# * The current version for Percona::Toolkit is 2.2.11.
TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE
01-07T17:37:22 0 0 0 1 0 0.005 test.bookinfo
01-07T17:37:24 0 1 147378 4 0 1.581 test.t
01-07T17:37:24 0 0 1762 1 0 0.258 test.user
TS :完成檢查的時間。
ERRORS :檢查時候發生錯誤和警告的數量。
DIFFS :0表示一致,1表示不一致。當指定--no-replicate-check時,會一直爲0,當指定--replicate-check-only只顯示數據不一致的信息。
ROWS :表的行數。
CHUNKS :被劃分到表中的塊的數目。
SKIPPED :由於錯誤或警告或過大,則跳過塊的數目。
TIME :執行的時間。
TABLE :被檢查的表名。
mysql> select * from checksums limit 1 \G;
*************************** 1. row ***************************
db: test
tbl: bookinfo
chunk: 1
chunk_time: 0.005444
chunk_index: NULL
lower_boundary: NULL
upper_boundary: NULL
this_crc: 2d51c233 #從庫
this_cnt: 1 #從庫
master_crc: 2d51c233 #主庫
master_cnt: 1 #主庫
ts: 2015-01-07 17:37:22
1 row in set (0.00 sec)
主從配置不一致
mysql> CREATE TABLE `dsns` (
> `id` int(11) NOT NULL AUTO_INCREMENT,
> `parent_id` int(11) DEFAULT NULL,
> `dsn` varchar(255) NOT NULL,
> PRIMARY KEY (`id`) );
Query OK, 0 rows affected (0.06 sec)
# 寫入從庫信息,可指定多條
mysql> INSERT INTO dsns (parent_id,dsn) values(1, "h=192.168.1.251,u=root,p=oracle,P=3308");
Query OK, 1 row affected (0.01 sec)
mysql> select * from test.dsns;
+----+-----------+-------------------------------------+
| id | parent_id | dsn |
+----+-----------+-------------------------------------+
| 1 | 1 | h=192.168.1.251,u=svoid,p=123qwe,P=3308 |
+----+-----------+-------------------------------------+
1 row in set (0.00 sec)
# 運行pt-table-checksum
shell> pt-table-checksum h='127.0.0.1',u='svoid',p='123qwe',P=3307 -d bbb,book --nocheck-replication-filters
--replicate=test.checksums --recursion-method=dsn=h=192.168.1.251,D=test,t=dsns
TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE
01-08T01:22:46 0 1 4 1 0 0.074 bbb.eq
01-08T01:22:46 0 1 4 1 0 0.021 bbb.eqs
01-08T01:22:46 0 1 4 1 0 0.016 bbb.mas
01-08T01:22:46 0 1 4 1 0 0.013 bbb.sla
01-08T01:22:46 0 1 3 1 0 0.012 bbb.t
01-08T01:22:46 0 0 3 1 0 0.013 book.bookinfo
01-08T01:22:46 0 0 0 1 0 0.014 book.test_memory
# 統計主從不一致的表
從庫運行
mysql> SELECT db, tbl, SUM(this_cnt) AS total_rows, COUNT(*) AS chunks FROM test.checksums
> WHERE ( master_cnt <> this_cnt OR master_crc <> this_crc OR ISNULL(master_crc) <> ISNULL(this_crc))
> GROUP BY db, tbl;
+-----------+------------+------------+--------+
| db | tbl | total_rows | chunks |
+-----------+------------+------------+--------+
| bbb | eq | 4 | 1 |
| bbb | eqs | 4 | 1 |
| bbb | mas | 4 | 1 |
| bbb | sla | 4 | 1 |
| bbb | t | 3 | 1 |
+-----------+------------+------------+--------+
5 rows in set (0.01 sec)
整理自網絡
Svoid
2015-01-08