利用percona-toolkit檢查並修復mysql叢集的資料一致性
percona-toolkit是一組高階命令列工具的集合,用來執行各種透過手工執行非常複雜和麻煩的mysql任務和系統任務,這些任務包括:
· 檢查master和slave資料的一致性
· 有效地對記錄進行歸檔
· 查詢重複的索引
· 對伺服器資訊進行彙總
· 分析來自日誌和tcpdump的查詢
· 當系統出問題的時候收集重要的系統資訊
在這裡只介紹一下mysql主從複製+MHA架構下最常用到資料一致性檢測及修復,當master當機後,其中一個slaver被推舉為主節點,當機節點重新加入叢集后,需根據bin log同步資料,為了保險起見還是要檢查一遍叢集的資料一致性,percona-toolkit就派上用場了
一、pt-table-checksum檢查主從庫資料的一致性
pt-table-checksum在MASTER上校驗指定庫、表,將結果存在一個庫表裡,複製程式將檢驗sql傳遞到slave上再執行一次。透過比較M/S的檢驗值確定資料是否一致。利用主從複製做檢驗,不需要在檢驗期間對主從資料庫同時鎖表,可以控制校驗的資料和速度,不影響到正常服務。
安裝:
#依賴包
yum –y perl-DBI perl-DBD-MySQL perl-TermReadKey
#percona-toolkit包
wget
tar xzvf percona-toolkit-2.2.4.tar.gz ; cd percona-toolkit-2.2.4 ; perl Makefile.pl && make && make install
使用方法:
pt-table-checksum [OPTIONS] [DSN]
pt-table-checksum:在主上透過執行校驗的查詢對複製的一致性進行檢查,對比主從的校驗值,從而產生結果。DSN指向的是主的地址,該工具的退出狀態不為零,如果發現有任何差別,或者如果出現任何警告或錯誤,更多資訊請見官網。
不指定任何引數,會直接對本地的所有資料庫的表進行檢查。
pt-table-checksum –S /tmp/mysqld.sock u=root,p=123456
環境:
#主庫:
mysql> select * from t1;
+----+------+
| id | name |
+----+------+
| 1 | aa |
| 2 | bb |
| 3 | cc |
| 4 | dd |
| 5 | ee |
+----+------+
5 rows in set (0.00 sec)
#從庫:
mysql> select * from t1;
+----+------+
| id | name |
+----+------+
| 1 | aa |
| 2 | bb |
| 3 | cc |
| 4 | dd |
+----+------+
4 rows in set (0.00 sec)
注意:
1、 根據測試,需要一個技能登入主庫,也能登入從庫,而且還能同步資料庫的賬號;
2、 只能指定一個host,必須為主庫的IP;
3、 在檢查時會向表加S鎖;
4、 執行之前需要從庫的同步IO和SQL程式是YES狀態。
可以用該語句授權使用者,這裡為了方便直接用root使用者了
GRANT SELECT, PROCESS, SUPER, REPLICATION SLAVE ON *.* TO ‘checksums’@’x.x.x.x’ IDENTIFIED BY ‘xxxx’;
執行檢測(MASTER上):
pt-table-checksum --nocheck-replication-filters --replicate=test.checksum --databases=test h=192.168.68.235,u=root,p=123 --empty-replicate-table --create-replicate-table
TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE
09-18T12:03:16 0 1 5 1 0 0.018 test.t1
引數說明:
TS :完成檢查的時間。
ERRORS :檢查時候發生錯誤和警告的數量。
DIFFS :0表示一致,1表示不一致。當指定--no-replicate-check時,會一直為0,當指定--replicate-check-only會顯示不同的資訊。
ROWS :表的行數。
CHUNKS :被劃分到表中的塊的數目。
SKIPPED :由於錯誤或警告或過大,則跳過塊的數目。
TIME :執行的時間。
TABLE :被檢查的表名。
引數意義:
--nocheck-replication-filters :不檢查複製過濾器,建議啟用。後面可以用--databases來指定需要檢查的資料庫。
--no-check-binlog-format : 不檢查複製的binlog模式,要是binlog模式是ROW,則會報錯。
--replicate-check-only :只顯示不同步的資訊。
--replicate= :把checksum的資訊寫入到指定表中,建議直接寫到被檢查的資料庫當中。
--databases= :指定需要被檢查的資料庫,多個則用逗號隔開。
--tables= :指定需要被檢查的表,多個用逗號隔開
h=127.0.0.1 :Master的地址
u=root :使用者名稱
p=123456 :密碼
P=3306 :埠
更多的引數請見官網,上面指出來的是常用的,對該場景夠用的引數。
透過DIFFS是1可以看出主從的表資料不一致。透過檢視從庫上的test.checksum表可以看到主從庫的檢驗資訊。
mysql> select * from checksum\G;
*************************** 1. row ***************************
db: test
tbl: t1
chunk: 1
chunk_time: 0.001604
chunk_index: NULL
lower_boundary: NULL
upper_boundary: NULL
this_crc: 13fa7d9d #從的校驗值
this_cnt: 4 #從的行數
master_crc: aa7a56c3 #主的校驗值
master_cnt: 5 #主的行數
ts: 2013-09-18 12:03:16
1 row in set (0.00 sec)
透過上面的 this_crc <> master_crc 更能清楚的看出他們的不一致了,透過chunk知道是這個張表的哪個塊上的記錄出現不一致。要是主的binlog模式是Row 則會報錯:
Replica db2 has binlog_format ROW which could cause pt-table-checksum to break replication.
Please read "Replicas using row-based replication" in the LIMITATIONS section of the tool's documentation.
If you understand the risks, specify --no-check-binlog-format to disable this check.
從錯誤資訊得出,要是不改binlog模式的話,則在執行上面的命令時候要指定:--no-check-binlog-format,即:
pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate-check-only --replicate=test.checksum --databases=test --tables=t1 h=127.0.0.1,u=root,p=123,P=3306
指定--replicate-check-only引數會在前一次pt-table-checksum檢驗的資料之上比較(不會再執行計算),顯示出資料不一致的SLAVE主機名:
[root@host125 ~]# pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate-check-only --replicate=test.checksum --databases=test --tables=t1 h=127.0.0.1,u=root,p=123456,P=3306
[root@host125 ~]# pt-table-checksum --nocheck-replication-filters --replicate=test.checksum --databases=test h=192.168.68.235,u=root,p=123 --empty-replicate-table --create-replicate-table --replicate-check-only
Differences on host122
TABLE CHUNK CNT_DIFF CRC_DIFF CHUNK_INDEX LOWER_BOUNDARY UPPER_BOUNDARY
test.t1 1 -1 1
資料不一致的SLAVE和表都找出來了,下面就用pt-table-sync來修補資料。
二、pt-table-sync修復從庫不一致的資料
使用方法:
pt-table-sync [OPTIONS] DSN [DSN]
pt-table-sync: 高效的同步MySQL表之間的資料,他可以做單向和雙向同步的表資料。他可以同步單個表,也可以同步整個庫。它不同步表結構、索引、或任何其他模式物件。所以在修復一致性之前需要保證他們表存在。
繼續上面的複製環境,主和從的t1表資料不一致,需要修復,
執行:
[root@host125 ~]# pt-table-sync --print --replicate=test.checksum h=192.168.68.235,u=root,p=123,P=3306 h=192.168.68.232,u=root,p=123,P=3306
#先MASTER的IP,再SLAVE的IP
REPLACE INTO `test`.`t1`(`id`, `name`) VALUES ('5', 'ee')
/*percona-toolkit src_db:test src_tbl:t1 src_dsn:P=3306,h=192.168.68.235,p=...,u=root dst_db:test dst_tbl:t1 dst_dsn:P=3306,h=192.168.68.232,p=...,u=root lock:1 transaction:1 changing_src:test.checksum replicate:test.checksum bidirectional:0 pid:24763 user:root host:host125*/;
引數的意義:
--replicate= :指定透過pt-table-checksum得到的表,這2個工具差不多都會一直用。
--databases= : 指定執行同步的資料庫,多個用逗號隔開。
--tables= :指定執行同步的表,多個用逗號隔開。
--sync-to-master :指定一個DSN,即從的IP,他會透過show processlist或show slave status 去自動的找主。
h=127.0.0.1 :伺服器地址,命令裡有2個ip,第一次出現的是M的地址,第2次是Slave的地址。
u=root :帳號。
p=123456 :密碼。
--print :列印,但不執行命令。
--execute :執行命令。
更多的引數請見官網,上面指出來的是常用的,對該場景夠用的引數。
和上面的命令一樣效果的命令:
[root@host125 ~]# pt-table-sync --print --sync-to-master h=192.168.68.232,u=root,p=123,P=3306 --databases test --tables t1
#用一個IP (SLAVE)就可以了。
REPLACE INTO `test`.`t1`(`id`, `name`) VALUES ('5', 'ee') /*percona-toolkit src_db:test src_tbl:t1 src_dsn:P=3306,h=192.168.68.235,p=...,u=root dst_db:test dst_tbl:t1 dst_dsn:P=3306,h=192.168.68.232,p=...,u=root lock:1 transaction:1 changing_src:1 replicate:0 bidirectional:0 pid:24798 user:root host:host125*/;
還可以讓它自己執行修復資料的SQL語句,但是這樣就沒有輸出了:
[root@host125 ~]# pt-table-sync --execute --sync-to-master h=192.168.68.232,u=root,p=123,P=3306 --databases test --tables t1
資料已經修復完成了:
mysql> select * from t1;
+----+------+
| id | name |
+----+------+
| 1 | aa |
| 2 | bb |
| 3 | cc |
| 4 | dd |
| 5 | ee |
+----+------+
5 rows in set (0.00 sec)
建議還是用--print 列印出來的好,這樣就可以知道那些資料有問題,可以人為的干預下。不然直接執行了,出現問題之後更不好處理。總之還是在處理之前做好資料的備份工作。
注意:要是表中沒有唯一索引或則主鍵則會報錯:
Can't make changes on the master because no unique index exists at /usr/local/bin/pt-table-sync line 10591.
補充:
要是從庫有的資料,而主庫沒有,那這個資料怎麼處理?會給出刪除SLAVE多餘資料,和修復SLAVE缺失資料的SQL語句。
如果在shell視窗不想顯示輸入密碼則可以新增:--ask-pass 引數,如:
[root@host125 ~]# pt-table-sync --print --ask-pass --sync-to-master h=192.168.68.232,u=root,P=3306 --databases test --tables t1
Enter password for 192.168.68.232:
如果使用--ask-pass,報錯:
Cannot read response; is Term::ReadKey installed? Can't locate Term/ReadKey.pm in @INC
安裝Term/ReadKey.pm模組:
[root@host125 ~]# perl -MCPAN -e "shell"
cpan[1]> install Term::ReadKey
總結:
該工具執行檢查表動作,檢查連線的帳號需要有很高的許可權,在一般許可權上需要加SELECT, PROCESS, SUPER, REPLICATION SLAVE等許可權。pt-table-checksm 配合pt-table-sync使用,在執行pt-table-sync資料同步之前,一定要執行pt-table-checksm命令檢查。
· 檢查master和slave資料的一致性
· 有效地對記錄進行歸檔
· 查詢重複的索引
· 對伺服器資訊進行彙總
· 分析來自日誌和tcpdump的查詢
· 當系統出問題的時候收集重要的系統資訊
在這裡只介紹一下mysql主從複製+MHA架構下最常用到資料一致性檢測及修復,當master當機後,其中一個slaver被推舉為主節點,當機節點重新加入叢集后,需根據bin log同步資料,為了保險起見還是要檢查一遍叢集的資料一致性,percona-toolkit就派上用場了
一、pt-table-checksum檢查主從庫資料的一致性
pt-table-checksum在MASTER上校驗指定庫、表,將結果存在一個庫表裡,複製程式將檢驗sql傳遞到slave上再執行一次。透過比較M/S的檢驗值確定資料是否一致。利用主從複製做檢驗,不需要在檢驗期間對主從資料庫同時鎖表,可以控制校驗的資料和速度,不影響到正常服務。
安裝:
#依賴包
yum –y perl-DBI perl-DBD-MySQL perl-TermReadKey
#percona-toolkit包
wget
tar xzvf percona-toolkit-2.2.4.tar.gz ; cd percona-toolkit-2.2.4 ; perl Makefile.pl && make && make install
使用方法:
pt-table-checksum [OPTIONS] [DSN]
pt-table-checksum:在主上透過執行校驗的查詢對複製的一致性進行檢查,對比主從的校驗值,從而產生結果。DSN指向的是主的地址,該工具的退出狀態不為零,如果發現有任何差別,或者如果出現任何警告或錯誤,更多資訊請見官網。
不指定任何引數,會直接對本地的所有資料庫的表進行檢查。
pt-table-checksum –S /tmp/mysqld.sock u=root,p=123456
環境:
#主庫:
mysql> select * from t1;
+----+------+
| id | name |
+----+------+
| 1 | aa |
| 2 | bb |
| 3 | cc |
| 4 | dd |
| 5 | ee |
+----+------+
5 rows in set (0.00 sec)
#從庫:
mysql> select * from t1;
+----+------+
| id | name |
+----+------+
| 1 | aa |
| 2 | bb |
| 3 | cc |
| 4 | dd |
+----+------+
4 rows in set (0.00 sec)
注意:
1、 根據測試,需要一個技能登入主庫,也能登入從庫,而且還能同步資料庫的賬號;
2、 只能指定一個host,必須為主庫的IP;
3、 在檢查時會向表加S鎖;
4、 執行之前需要從庫的同步IO和SQL程式是YES狀態。
可以用該語句授權使用者,這裡為了方便直接用root使用者了
GRANT SELECT, PROCESS, SUPER, REPLICATION SLAVE ON *.* TO ‘checksums’@’x.x.x.x’ IDENTIFIED BY ‘xxxx’;
執行檢測(MASTER上):
pt-table-checksum --nocheck-replication-filters --replicate=test.checksum --databases=test h=192.168.68.235,u=root,p=123 --empty-replicate-table --create-replicate-table
TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE
09-18T12:03:16 0 1 5 1 0 0.018 test.t1
引數說明:
TS :完成檢查的時間。
ERRORS :檢查時候發生錯誤和警告的數量。
DIFFS :0表示一致,1表示不一致。當指定--no-replicate-check時,會一直為0,當指定--replicate-check-only會顯示不同的資訊。
ROWS :表的行數。
CHUNKS :被劃分到表中的塊的數目。
SKIPPED :由於錯誤或警告或過大,則跳過塊的數目。
TIME :執行的時間。
TABLE :被檢查的表名。
引數意義:
--nocheck-replication-filters :不檢查複製過濾器,建議啟用。後面可以用--databases來指定需要檢查的資料庫。
--no-check-binlog-format : 不檢查複製的binlog模式,要是binlog模式是ROW,則會報錯。
--replicate-check-only :只顯示不同步的資訊。
--replicate= :把checksum的資訊寫入到指定表中,建議直接寫到被檢查的資料庫當中。
--databases= :指定需要被檢查的資料庫,多個則用逗號隔開。
--tables= :指定需要被檢查的表,多個用逗號隔開
h=127.0.0.1 :Master的地址
u=root :使用者名稱
p=123456 :密碼
P=3306 :埠
更多的引數請見官網,上面指出來的是常用的,對該場景夠用的引數。
透過DIFFS是1可以看出主從的表資料不一致。透過檢視從庫上的test.checksum表可以看到主從庫的檢驗資訊。
mysql> select * from checksum\G;
*************************** 1. row ***************************
db: test
tbl: t1
chunk: 1
chunk_time: 0.001604
chunk_index: NULL
lower_boundary: NULL
upper_boundary: NULL
this_crc: 13fa7d9d #從的校驗值
this_cnt: 4 #從的行數
master_crc: aa7a56c3 #主的校驗值
master_cnt: 5 #主的行數
ts: 2013-09-18 12:03:16
1 row in set (0.00 sec)
透過上面的 this_crc <> master_crc 更能清楚的看出他們的不一致了,透過chunk知道是這個張表的哪個塊上的記錄出現不一致。要是主的binlog模式是Row 則會報錯:
Replica db2 has binlog_format ROW which could cause pt-table-checksum to break replication.
Please read "Replicas using row-based replication" in the LIMITATIONS section of the tool's documentation.
If you understand the risks, specify --no-check-binlog-format to disable this check.
從錯誤資訊得出,要是不改binlog模式的話,則在執行上面的命令時候要指定:--no-check-binlog-format,即:
pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate-check-only --replicate=test.checksum --databases=test --tables=t1 h=127.0.0.1,u=root,p=123,P=3306
指定--replicate-check-only引數會在前一次pt-table-checksum檢驗的資料之上比較(不會再執行計算),顯示出資料不一致的SLAVE主機名:
[root@host125 ~]# pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate-check-only --replicate=test.checksum --databases=test --tables=t1 h=127.0.0.1,u=root,p=123456,P=3306
[root@host125 ~]# pt-table-checksum --nocheck-replication-filters --replicate=test.checksum --databases=test h=192.168.68.235,u=root,p=123 --empty-replicate-table --create-replicate-table --replicate-check-only
Differences on host122
TABLE CHUNK CNT_DIFF CRC_DIFF CHUNK_INDEX LOWER_BOUNDARY UPPER_BOUNDARY
test.t1 1 -1 1
資料不一致的SLAVE和表都找出來了,下面就用pt-table-sync來修補資料。
二、pt-table-sync修復從庫不一致的資料
使用方法:
pt-table-sync [OPTIONS] DSN [DSN]
pt-table-sync: 高效的同步MySQL表之間的資料,他可以做單向和雙向同步的表資料。他可以同步單個表,也可以同步整個庫。它不同步表結構、索引、或任何其他模式物件。所以在修復一致性之前需要保證他們表存在。
繼續上面的複製環境,主和從的t1表資料不一致,需要修復,
執行:
[root@host125 ~]# pt-table-sync --print --replicate=test.checksum h=192.168.68.235,u=root,p=123,P=3306 h=192.168.68.232,u=root,p=123,P=3306
#先MASTER的IP,再SLAVE的IP
REPLACE INTO `test`.`t1`(`id`, `name`) VALUES ('5', 'ee')
/*percona-toolkit src_db:test src_tbl:t1 src_dsn:P=3306,h=192.168.68.235,p=...,u=root dst_db:test dst_tbl:t1 dst_dsn:P=3306,h=192.168.68.232,p=...,u=root lock:1 transaction:1 changing_src:test.checksum replicate:test.checksum bidirectional:0 pid:24763 user:root host:host125*/;
引數的意義:
--replicate= :指定透過pt-table-checksum得到的表,這2個工具差不多都會一直用。
--databases= : 指定執行同步的資料庫,多個用逗號隔開。
--tables= :指定執行同步的表,多個用逗號隔開。
--sync-to-master :指定一個DSN,即從的IP,他會透過show processlist或show slave status 去自動的找主。
h=127.0.0.1 :伺服器地址,命令裡有2個ip,第一次出現的是M的地址,第2次是Slave的地址。
u=root :帳號。
p=123456 :密碼。
--print :列印,但不執行命令。
--execute :執行命令。
更多的引數請見官網,上面指出來的是常用的,對該場景夠用的引數。
和上面的命令一樣效果的命令:
[root@host125 ~]# pt-table-sync --print --sync-to-master h=192.168.68.232,u=root,p=123,P=3306 --databases test --tables t1
#用一個IP (SLAVE)就可以了。
REPLACE INTO `test`.`t1`(`id`, `name`) VALUES ('5', 'ee') /*percona-toolkit src_db:test src_tbl:t1 src_dsn:P=3306,h=192.168.68.235,p=...,u=root dst_db:test dst_tbl:t1 dst_dsn:P=3306,h=192.168.68.232,p=...,u=root lock:1 transaction:1 changing_src:1 replicate:0 bidirectional:0 pid:24798 user:root host:host125*/;
還可以讓它自己執行修復資料的SQL語句,但是這樣就沒有輸出了:
[root@host125 ~]# pt-table-sync --execute --sync-to-master h=192.168.68.232,u=root,p=123,P=3306 --databases test --tables t1
資料已經修復完成了:
mysql> select * from t1;
+----+------+
| id | name |
+----+------+
| 1 | aa |
| 2 | bb |
| 3 | cc |
| 4 | dd |
| 5 | ee |
+----+------+
5 rows in set (0.00 sec)
建議還是用--print 列印出來的好,這樣就可以知道那些資料有問題,可以人為的干預下。不然直接執行了,出現問題之後更不好處理。總之還是在處理之前做好資料的備份工作。
注意:要是表中沒有唯一索引或則主鍵則會報錯:
Can't make changes on the master because no unique index exists at /usr/local/bin/pt-table-sync line 10591.
補充:
要是從庫有的資料,而主庫沒有,那這個資料怎麼處理?會給出刪除SLAVE多餘資料,和修復SLAVE缺失資料的SQL語句。
如果在shell視窗不想顯示輸入密碼則可以新增:--ask-pass 引數,如:
[root@host125 ~]# pt-table-sync --print --ask-pass --sync-to-master h=192.168.68.232,u=root,P=3306 --databases test --tables t1
Enter password for 192.168.68.232:
如果使用--ask-pass,報錯:
Cannot read response; is Term::ReadKey installed? Can't locate Term/ReadKey.pm in @INC
安裝Term/ReadKey.pm模組:
[root@host125 ~]# perl -MCPAN -e "shell"
cpan[1]> install Term::ReadKey
總結:
該工具執行檢查表動作,檢查連線的帳號需要有很高的許可權,在一般許可權上需要加SELECT, PROCESS, SUPER, REPLICATION SLAVE等許可權。pt-table-checksm 配合pt-table-sync使用,在執行pt-table-sync資料同步之前,一定要執行pt-table-checksm命令檢查。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29018063/viewspace-2061757/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL資料庫叢集MySql資料庫
- 大資料叢集修機器名大資料
- 資料結構-並查集資料結構並查集
- 如何修復mysql資料庫MySql資料庫
- 修復一個kubernetes叢集
- 利用mysql slave 修復master MyISAM tableMySqlAST
- MySQL資料庫健康檢查--MySQL巡檢MySql資料庫
- 資料結構之並查集資料結構並查集
- 快速檢查資料庫一致性資料庫
- 優雅的資料結構–並查集資料結構並查集
- 利用RMAN修復資料檔案中的壞塊
- RMAN備份恢復典型案例——快速檢查資料庫一致性資料庫
- Mac 下 利用 docker 構建 MySQL 叢集MacDockerMySql
- 資料庫Mysql5.7 MGR叢集的搭建資料庫MySql
- 【資料結構】帶權並查集資料結構並查集
- 資料結構:速通並查集資料結構並查集
- 叢集資料庫重要檔案的檢視管理資料庫
- 資料遷移的預檢測及修復方案
- 【並查集】【帶偏移的並查集】食物鏈並查集
- MySQL 5.5 NDB叢集檢視日誌MySql
- win10系統利用檔案檢查器修復受損檔案的方法Win10
- 將Mysql資料匯入到ElasticSearch叢集MySqlElasticsearch
- Redis叢集 - cluster叢集、資料分片Redis
- python跨庫檢查資料一致性Python
- 生產環境使用 pt-table-checksum 檢查MySQL資料一致性MySql
- 並查集到帶權並查集並查集
- 資料結構 — 並查集的原理與應用資料結構並查集
- MySQL資料庫表損壞後的修復方法MySql資料庫
- 並查集(一)並查集的幾種實現並查集
- 利用binlog日誌恢復mysql資料MySql
- 資料庫修復資料恢復資料庫資料恢復
- 資料庫叢集資料庫
- 鑲嵌資料集工具小結(十 一)分析、修復、同步鑲嵌資料集
- Kubernetes叢集健康檢查最佳實踐
- 資料結構——並查集 學習筆記資料結構並查集筆記
- MySQL資料庫InnoDB壞頁處理修復MySql資料庫
- 並查集是一種怎樣的資料結構?並查集資料結構
- Mysql cluster slave server的自動檢測與修復MySqlServer