1. 程式人生 > >pt-table-checksum校驗與pt-table-sync修復數據

pt-table-checksum校驗與pt-table-sync修復數據

3.0 復制 servers 成功 捕獲 千萬 .com dex 不一致

1:下載工具包 登錄網站下載相應的工具包 https://www.percona.com/downloads/percona-toolkit/LATEST/ 2:安裝 (1)yum安裝:
sudo yum install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm
yum list | grep percona-toolkit

結果集顯示以下證明安裝成功:

percona-toolkit.noarch 3.0.0-rc percona-release-noarch

然後進行安裝

sudo yum install percona-toolkit

(2)解壓安裝包:

[root@localhost home]# cd toolkit/
[root@localhost toolkit]# ls
percona-toolkit-2.2.19.tar.gz
[root@localhost toolkit]# tar -xvf percona-toolkit.tar.gz

至此來說已經安裝了percona 的toolKit工具包,下面主要測一下pt-table-checksum校驗與pt-table-sync,前者主要用於數據的校驗,驗證主從是否一致,後者主要用來修復數據,兩者一般情況結合起來用可以修復數據不一致的問題。

pt-table-checksum是percona公司提供的一款驗證主從數據一致性的工具,我們指向主庫,判斷從庫的結果集會反饋給我們,當有捕獲到不一致問題的時候,就會返回一個非0的結果。但是他只能查找數據的不一致,如果要修復數據問題就要使用pt-table-sync。 pt-table-checksum在運行的時候是基於statement復制格式的,如果我們是ROW格式,需要在執行的時候加上--no-check-binlog-format參數。 3:pt-table-checksum的實踐,裝完以後我們就可以直接使用了,我這是使用的是第二種方式 技術分享圖片
[root@localhost bin]# /home/toolkit/percona-toolkit-2.2.19/bin/pt-table-checksum --nocheck-replication-filters --replicate=rep_test.checksums --no-check-binlog-format h=172.16.16.35,u=root,p=123456,P=3306
TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE
06-07T10:55:49 0 0 1 1 0 1.331 MAXIANGQIAN.MAXIANGQIAN
06-07T10:55:54 0 0 1 1 0 5.524 maxiangqian.test
06-07T10:55:56 0 0 4 1 0 1.208 maxiangqian.test01
06-07T10:55:57 0 0 0 1 0 1.164 mysql.columns_priv
06-07T10:55:58 0 0 5 1 0 1.216 mysql.db
06-07T10:55:59 0 0 2 1 0 1.176 mysql.engine_cost
06-07T10:56:00 0 0 0 1 0 1.178 mysql.event
06-07T10:56:01 0 0 0 1 0 1.160 mysql.func
06-07T10:56:03 0 0 1 1 0 1.154 mysql.gtid_executed
06-07T10:56:08 0 0 40 4 0 5.015 mysql.help_category
06-07T10:56:13 0 0 679 5 0 5.806 mysql.help_keyword
06-07T10:56:18 0 0 1334 4 0 4.572 mysql.help_relation
06-07T10:56:19 0 0 635 1 0 1.169 mysql.help_topic
06-07T10:56:20 0 0 0 1 0 1.163 mysql.ndb_binlog_index
06-07T10:56:22 0 0 0 1 0 1.157 mysql.plugin
06-07T10:56:23 0 1 48 1 0 1.236 mysql.proc
06-07T10:56:24 0 0 0 1 0 1.197 mysql.procs_priv
06-07T10:56:25 0 0 1 1 0 1.235 mysql.proxies_priv
06-07T10:56:26 0 0 6 1 0 1.188 mysql.server_cost
06-07T10:56:28 0 0 0 1 0 1.154 mysql.servers
06-07T10:56:34 0 0 1 1 0 6.184 mysql.tables_priv
06-07T10:56:35 0 0 0 1 0 1.198 mysql.time_zone
06-07T10:56:36 0 0 0 1 0 1.121 mysql.time_zone_leap_second
06-07T10:56:37 0 0 0 1 0 1.148 mysql.time_zone_name
06-07T10:56:38 0 0 0 1 0 1.147 mysql.time_zone_transition
06-07T10:56:40 0 0 0 1 0 1.138 mysql.time_zone_transition_type
06-07T10:56:41 0 0 8 1 0 1.336 mysql.user
06-07T10:56:42 0 0 0 1 0 1.164 open_api.ma
06-07T10:57:01 0 0 1000000 13 0 18.707 sbtest.sbtest
06-07T10:57:02 0 0 6 1 0 1.263 sys.sys_config
技術分享圖片

我們也可以單獨檢查某一個庫,這樣來縮小檢查範圍:

[root@localhost bin]# /home/toolkit/percona-toolkit-2.2.19/bin/pt-table-checksum --nocheck-replication-filters --replicate=rep_test.checksums --no-check-binlog-format --databases=maxiangqian h=172.16.16.35,u=root,p=123456,P=3306

得到的結果如上,看一下描述:

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 :端口
技術分享圖片

通過指定--replicate=rep_test.checksums 參數,會自動生成一個數據庫.把檢查信息都寫到了checksums表中。

進入SLAVE相應的庫中查看checksums表的信息,可以通過以下語句查看不一致的信息:
mysql> select * from checksums where this_cnt<>master_cnt;

通過上面的 this_crc <> master_crc 更能清楚的看出他們的不一致了,通過chunk知道是這個張表的哪個塊上的記錄出現不一致。

4:檢測數據不一致的情況使用pt-table-sync進行修復 我們看一下上一節我們通過以下的語句檢測到有數據是不一致的: 技術分享圖片
[root@localhost bin]# /home/toolkit/percona-toolkit-2.2.19/bin/pt-table-checksum --nocheck-replication-filters --replicate=rep_test.checksums --no-check-binlog-format --databases=maxiangqian h=172.16.16.35,u=root,p=123456,P=3306
TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE
06-07T11:13:18 0 0 1 1 0 1.220 MAXIANGQIAN.MAXIANGQIAN
06-07T11:13:19 0 1 1 1 0 1.135 maxiangqian.test
06-07T11:13:21 0 0 4 1 0 1.197 maxiangqian.test01
技術分享圖片

恢復不一致數據:

技術分享圖片
[root@localhost bin]# clear
[root@localhost bin]# ./pt-table-sync --execute h=172.16.16.35,P=3306,D=maxiangqian,t=test,u=root,p=123456 h=172.16.16.34,P=3306,u=root,p=123456 --no-check-slave --print
[root@localhost bin]# /home/toolkit/percona-toolkit-2.2.19/bin/pt-table-checksum --nocheck-replication-filters --replicate=rep_test.checksums --no-check-binlog-format --databases=maxiangqian h=172.16.16.35,u=root,p=123456,P=3306
TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE
06-07T11:18:09 0 0 1 1 0 1.172 MAXIANGQIAN.MAXIANGQIAN
06-07T11:18:10 0 0 1 1 0 1.144 maxiangqian.test
06-07T11:18:11 0 0 4 1 0 1.282 maxiangqian.test01
技術分享圖片

本身來說test這張表少了一行數據,執行以後主體和副本的數據將會一致:

接下來我們再看一下看一下pt-table-sync的一些使用案例: (1)將host1上的數據同步到host2,只同步db.tbl表
pt-table-sync --execute h=host1,D=db,t=tbl h=host2
[root@localhost bin]# ./pt-table-sync --execute h=172.16.16.35,P=3306,D=maxiangqian,t=test,u=root,p=123456 h=172.16.16.34,P=3306,u=root,p=123456 --no-check-slave --print

(2)將host1 上的所有數據同步到host2和host3

pt-table-sync --execute host1 host2 host3
[root@localhost bin]# ./pt-table-sync --execute h=172.16.16.35,P=3306,D=maxiangqian,t=test,u=root,p=123456 h=172.16.16.34,P=3306,u=root,p=123456 h=172.16.16.35,P=3307,u=root,p=123456 --no-check-slave --print

(3)確保slave1上的所有數據和主庫是同步的

pt-table-sync --execute --sync-to-master slave1
[root@localhost bin]# ./pt-table-sync --execute --sync-to-master h=172.16.16.34,P=3306,u=root,p=123456 --no-check-slave --print

這個要求所檢查的表是必須有主鍵或者說唯一索引的。我們也可以按照下面指定單庫的單表

[root@localhost bin]# ./pt-table-sync --execute --sync-to-master h=172.16.16.34,P=3306,D=maxiangqian,t=test01,u=root,p=123456 --no-check-slave --print

(4)按照檢查生成的rep_test.checksums恢復所有的從庫

pt-table-sync --execute --replicate test.checksum master1

也就是下面的例子:

[root@localhost bin]# ./pt-table-sync --execute --replicate rep_test.checksums h=172.16.16.35,P=3306,u=root,p=123456

(5)只修復slave1的數據

/pt-table-sync --execute --replicate rep_test.checksums --sync-to-master slave1

(6)雙主模式master2修復自身數據:

pt-table-sync --execute --sync-to-master h=master2,D=db,t=tbl

由於雙主模式有很多問題,一個修改可能會傳給另外的數據庫,所以說我們千萬不能在雙主的模式下執行以下的操作:

pt-table-sync --execute h=master1,D=db,t=tbl master2

pt-table-checksum校驗與pt-table-sync修復數據