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 http://www.percona.com/downloads/percona-toolkit/LATEST/percona-toolkit-2.2.4.tar.gz 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 checksumG; *************************** 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命令檢查。 |
免責聲明:本站部分文章和圖片均來自用戶投稿和網絡收集,旨在傳播知識,文章和圖片版權歸原作者及原出處所有,僅供學習與參考,請勿用于商業用途,如果損害了您的權利,請聯系我們及時修正或刪除。謝謝!
始終以前瞻性的眼光聚焦站長、創業、互聯網等領域,為您提供最新最全的互聯網資訊,幫助站長轉型升級,為互聯網創業者提供更加優質的創業信息和品牌營銷服務,與站長一起進步!讓互聯網創業者不再孤獨!
掃一掃,關注站長網微信