pt-table-checksum与pt-table-sync使用实践
--------------原文地址:http://www.cnblogs.com/gomysql/p/3662264.html
mysql在工作中接觸最多的就是mysql replication,由于現在公司也還在使用mysql 5.1.x版本,在復制方面還是比較多的問題,比如主庫宕機或者從庫宕機都會導致復制中斷,通常我們需要進行人為修復(mysql 5.5版本解決大部分問題),或者很多時候需要把一個從庫提升為主庫,但對從庫和主庫的數據一致性不能保證一樣,所以就利用 pt-table-checksum 工作來檢查主從的一致性,以及通過 pt-table-sync 如何修復這些不一致的數據。當然如果你數據量小,slave只是當做一個備份使用,那么出現數據不一致完全可以重做,或者通過其他方法解決。如果數據量非常大,重做就是非常蛋碎的一件事情了。^_^
工具安裝:
1.軟件下載:
[root@MySQL-01?~]#?wget?http://www.percona.com/downloads/percona-toolkit/LATEST/RPM/percona-toolkit-2.2.7-1.noarch.rpm2.安裝該工具依賴的軟件包:
[root@MySQL-01?~]#?yum?install?perl-IO-Socket-SSL?perl-DBD-MySQL?perl-Time-HiRes?-y3.軟件安裝:
[root@MySQL-01?~]#?rpm?-ivh?percona-toolkit-2.2.7-1.noarch.rpm? Preparing...????????????????###########################################?[100%] 1:percona-toolkit????????###########################################?[100%] [root@MySQL-02?~]#使用方法:
pt-table-checksum?[OPTIONS]?[DSN]pt-table-checksum:在主(master)上通過執行校驗的查詢對復制的一致性進行檢查,對比主從的校驗值,從而產生結果。DSN指向的是主的地址,該工具的退出狀態不為零,如果發現有任何差別,或者如果出現任何警告或錯誤,更多信息請查看官方資料。
下面通過實際的例子來解釋該工具如何使用:
主庫:
備庫:
mysql>?select?*?from?yayun.t1; +----+----------+ |?id?|?name?????| +----+----------+ |??1?|?yayun????| |??2?|?atlas????| |??3?|?mysql????| |??4?|?dengyy???| |??5?|?love?sql?| +----+----------+ 5?rows?in?set?(0.00?sec) mysql>很明顯主從數據不一致,那么我們使用工具來檢測:
[root@MySQL-01?~]#?pt-table-checksum?--nocheck-replication-filters?--replicate=yayun.checksums?--databases=yayun?--tables=t1?h=127.0.0.1,u=root,p=123456,P=3306 Replica?MySQL-02?has?binlog_format?MIXED?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. [root@MySQL-01?~]#從錯誤信息得出,要是不改binlog模式的話,則在執行上面的命令時候要指定:
--no-check-binlog-format,即:
Diffs cannot be detected because no slaves were found. ?Please read the --recursion-method documentation for information.
這個報錯又是為什么呢?很多文章都沒有說到,我真搞不清楚那文章怎么寫出來的,囧。。。。
上面的提示信息很清楚,因為找不到從,所以執行失敗。用參數--recursion-method?可以指定模式解決,關于--recursion-method參數的設置有:
METHOD???????USES ===========??============================================= processlist??SHOW?PROCESSLIST hosts????????SHOW?SLAVE?HOSTS cluster??????SHOW?STATUS?LIKE?'wsrep\_incoming\_addresses'dsn=DSN??????DSNs?from?a?table none?????????Do?not?find?slaves默認是通過show processlist 找到host的值或show slave hosts 找到host的值。
mysql>?show?processlist\G ***************************?1.?row?***************************Id:?3User:?slaveHost:?192.168.0.20:52352db:?NULLCommand:?Binlog?DumpTime:?4164State:?Master?has?sent?all?binlog?to?slave;?waiting?for?binlog?to?be?updatedInfo:?NULL ***************************?2.?row?***************************Id:?33User:?rootHost:?localhostdb:?NULLCommand:?QueryTime:?0State:?NULLInfo:?show?processlist2?rows?in?set?(0.00?sec)還有一種方法是show slave hosts;前提從庫配置文件里面已經配置自己的地址和端口:
[root@MySQL-02?~]#?grep?'report'?/etc/my.cnf? report_host?=?192.168.0.20report_port?=?3306 [root@MySQL-02?~]#mysql?-uroot?-pxxx mysql>?show?slave?hosts; +-----------+--------------+------+-----------+ |?Server_id?|?Host?????????|?Port?|?Master_id?| +-----------+--------------+------+-----------+ |?????????2?|?192.168.0.20?|?3306?|?????????1?| +-----------+--------------+------+-----------+ 1?row?in?set?(0.00?sec) mysql>所以找不到從服務器時。在從庫配置文件添加
report_host=slave_ip
report_port=slave_port
最重要的一點是我們需要在從庫上授權,能讓主庫訪問。很多文章沒提,卻能正常進行,不得不說大牛就是牛B
注意:
1、? 根據測試,需要一個即能登錄主庫,也能登錄從庫的賬號;
2、? 只能指定一個host,必須為主庫的IP;
3、? 在檢查時會向表加S鎖;
4、? 運行之前需要從庫的同步IO和SQL進程是YES狀態。
mysql>?GRANT?SELECT,?PROCESS,?SUPER,?REPLICATION?SLAVE?ON?*.*?TO?'root'@'192.168.0.10'?IDENTIFIED?BY?'123456'; Query?OK,?0?rows?affected?(0.00?sec) mysql>?flush?privileges; Query?OK,?0?rows?affected?(0.00?sec) mysql>現在我們再來檢測數據一致性:
[root@MySQL-01?~]#?pt-table-checksum?--nocheck-replication-filters??--no-check-binlog-format?--replicate=yayun.checksums?--databases=yayun?--tables=t1?h=127.0.0.1,u=root,p=123456,P=3306 TS?ERRORS??DIFFS?????ROWS??CHUNKS?SKIPPED????TIME?TABLE 04-13T15:59:31??????0??????1????????3???????1???????0???0.080?yayun.t1 [root@MySQL-01?~]# 結果解析: 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 就可以看出主從的表數據不一致。怎么不一致呢??通過指定--replicate=yayun.checksums?參數,就說明把檢查信息都寫到了checksums表中。
進入SLAVE相應的庫中查看checksums表的信息:
通過上面找到了這些不一致的數據表,如何同步數據呢?即如何修復MySQL主從不一致的數據,讓他們保持一致性呢?利用另外一個工具?pt-table-sync。
使用方法:
pt-table-sync:?高效的同步MySQL表之間的數據,他可以做單向和雙向同步的表數據。他可以同步單個表,也可以同步整個庫。它不同步表結構、索引、或任何其他模式對象。所以在修復一致性之前需要保證他們表存在。
接著上面的復制情況,主和從的t1表數據不一致,需要修復,
執行:
先master的ip,用戶,密碼,然后是slave的ip,用戶,密碼
[root@MySQL-01?~]#?pt-table-sync?--replicate=yayun.checksums?h=127.0.0.1,u=root,p=123456?h=192.168.0.20,u=root,p=123456?--print DELETE?FROM?`yayun`.`t1`?WHERE?`id`='4'?LIMIT?1?/*percona-toolkit?src_db:yayun?src_tbl:t1?src_dsn:h=127.0.0.1,p=...,u=root?dst_db:yayun?dst_tbl:t1?dst_dsn:h=192.168.0.20,p=...,u=root?lock:1?transaction:1?changing_src:yayun.checksums?replicate:yayun.checksums?bidirectional:0?pid:2190?user:root?host:MySQL-01*/; DELETE?FROM?`yayun`.`t1`?WHERE?`id`='5'?LIMIT?1?/*percona-toolkit?src_db:yayun?src_tbl:t1?src_dsn:h=127.0.0.1,p=...,u=root?dst_db:yayun?dst_tbl:t1?dst_dsn:h=192.168.0.20,p=...,u=root?lock:1?transaction:1?changing_src:yayun.checksums?replicate:yayun.checksums?bidirectional:0?pid:2190?user:root?host:MySQL-01*/; [root@MySQL-01?~]#參數的意義:
命令介紹完了,一起解釋下執行的效果:通過(--print)打印出來了修復數據的sql語句,可以手動的去從行執行,讓他們數據保持一致性。那能否直接執行?當然可以,通過(--execute)
[root@MySQL-01?~]#?pt-table-sync?--replicate=yayun.checksums?h=127.0.0.1,u=root,p=123456?h=192.168.0.20,u=root,p=123456?--execute沒發現任何異常,然后檢查主從數據的一致性:
[root@MySQL-01?~]#?pt-table-checksum?--nocheck-replication-filters??--no-check-binlog-format?--replicate=yayun.checksums?--databases=yayun?--tables=t1?h=127.0.0.1,u=root,p=123456,P=3306 TS?ERRORS??DIFFS?????ROWS??CHUNKS?SKIPPED????TIME?TABLE 04-13T16:27:28??????0??????0????????3???????1???????0???0.097?yayun.t1 [root@MySQL-01?~]#主庫:
mysql>?select?*?from?t1; +----+-------+ |?id?|?name??| +----+-------+ |??1?|?yayun?| |??2?|?atlas?| |??3?|?mysql?| +----+-------+ 3?rows?in?set?(0.00?sec) mysql>備庫:
mysql>?select?*?from?t1; +----+-------+ |?id?|?name??| +----+-------+ |??1?|?yayun?| |??2?|?atlas?| |??3?|?mysql?| +----+-------+ 3?rows?in?set?(0.00?sec) mysql>OK,數據已經保持一致了。不過建議還是用--print 打印出來的好,這樣就可以知道那些數據有問題,可以人為的干預下。不然直接執行了,出現問題之后更不好處理。總之還是在處理之前做好數據的備份工作。
注意:要是表中沒有唯一索引或則主鍵則會報錯:
Can't?make?changes?on?the?master?because?no?unique?index?exists?at?/usr/local/bin/pt-table-sync?line?10591.總結:
工具很給力,工作中常常在使用。注意使用該工具需要授權,一般SELECT, PROCESS, SUPER, REPLICATION SLAVE等權限就已經足夠了。
出處:Atlas的博客 http://www.cnblogs.com/gomysql
感謝好文章
轉載于:https://blog.51cto.com/arthur376/1963396
總結
以上是生活随笔為你收集整理的pt-table-checksum与pt-table-sync使用实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何用WordPress搭建自己的博客(
- 下一篇: BGP重分布进IGP-EIGRP