模擬主從庫數據不一致環境:html
192.168.0.39 master庫: mysql> select * from test01.frame01;; +----+-----------+------------------------------------------+ | id | parent_id | dsn | +----+-----------+------------------------------------------+ | 1 | 1 | 192.168.0.22,u=pt22,p=ptchecksums,P=3307 | | 2 | 2 | 192.168.0.33,u=pt33,p=ptchecksums,P=3308 | +----+-----------+------------------------------------------+ 2 rows in set (0.00 sec) 192.168.0.39 slave庫: mysql> update frame01 set dsn='192.168.0.55,u=umaaa,p=ptchsyeudew,P=3310' where id=1; Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> update frame01 set dsn='192.168.0.66,u=umbbb,p=ptchsyeudew,P=3311' where id=2; Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from frame01; +----+-----------+-------------------------------------------+ | id | parent_id | dsn | +----+-----------+-------------------------------------------+ | 1 | 1 | 192.168.0.55,u=umaaa,p=ptchsyeudew,P=3310 | | 2 | 2 | 192.168.0.66,u=umbbb,p=ptchsyeudew,P=3311 | +----+-----------+-------------------------------------------+
pt-table-sync校驗修復數據具體指令:mysql
[root@kusou-es11 ~]# /usr/local/percona-toolkit/bin/pt-table-sync h=192.168.0.39,u=ptsum,p=ptchecksums,P=3306 --databases=test01 --tables=frame01 --replicate=percona.checksums --print REPLACE INTO `test01`.`frame01`(`id`, `parent_id`, `dsn`) VALUES ('1', '1', '192.168.0.22,u=pt22,p=ptchecksums,P=3307') /*percona-toolkit src_db:test01 src_tbl:frame01 src_dsn:P=3306,h=192.168.0.39,p=...,u=ptsum dst_db:test01 dst_tbl:frame01 dst_dsn:P=3306,h=192.168.0.11,p=...,u=ptsum lock:1 transaction:1 changing_src:percona.checksums replicate:percona.checksums bidirectional:0 pid:176411 user:root host:kusou-es11*/; REPLACE INTO `test01`.`frame01`(`id`, `parent_id`, `dsn`) VALUES ('2', '2', '192.168.0.33,u=pt33,p=ptchecksums,P=3308') /*percona-toolkit src_db:test01 src_tbl:frame01 src_dsn:P=3306,h=192.168.0.39,p=...,u=ptsum dst_db:test01 dst_tbl:frame01 dst_dsn:P=3306,h=192.168.0.11,p=...,u=ptsum lock:1 transaction:1 changing_src:percona.checksums replicate:percona.checksums bidirectional:0 pid:176411 user:root host:kusou-es11*/;
提示: 命令末尾的--print的指令是打印出須要修復數據的命令,不執行命令。sql
pt-table-sync 修復主從庫的表frame01數據 ,使主從庫表frame01數據一致:服務器
[root@kusou-es11 ~]# /usr/local/percona-toolkit/bin/pt-table-sync h=192.168.0.39,u=ptsum,p=ptchecksums,P=3306 --databases=test01 --tables=frame01 --replicate=percona.checksums --execute [root@kusou-es11 ~]#
提示: 命令末尾的 --execute 的指令是執行修復數據的指令,使master庫mysql.user表和slave庫的mysql.user表數據一致ide
pt-table-checksum 檢測主從庫的表frame01數據一致 (由於 DIFFS =0 )工具
[root@kusou-es11 ~]# /usr/local/percona-toolkit/bin/pt-table-checksum h=192.168.0.39,u=ptsum,p='ptchecksums',P=3306 --databases=test01 --tables=frame01 --replicate=percona.checksums --no-check-binlog-format --nocheck-replication-filters Checking if all tables can be checksummed ... Starting checksum ... TS ERRORS DIFFS ROWS DIFF_ROWS CHUNKS SKIPPED TIME TABLE 06-15T13:41:47 0 0 2 0 1 0 0.316 test01.frame01
slave庫查看,數據和主庫一致測試
mysql> select * from test01.frame01; +----+-----------+------------------------------------------+ | id | parent_id | dsn | +----+-----------+------------------------------------------+ | 1 | 1 | 192.168.0.22,u=pt22,p=ptchecksums,P=3307 | | 2 | 2 | 192.168.0.33,u=pt33,p=ptchecksums,P=3308 | +----+-----------+------------------------------------------+ 2 rows in set (0.00 sec)
提示:須要注意的是,須要同步的表上必需要有主鍵或者惟一索引,不然會出錯。
同時,pt-table-sync 修復數據時,會形成鎖表,要在業務低峯期來修復主庫的數據code
對找到的主從不一致的行,採用replace into語句,在主庫執行一遍以生成該行全量的binlog,並同步到從庫,這會以主庫數據爲基準來修復從庫;
對於主庫有的行而從庫沒有的行,採用replace在主庫上插入(必須不能是×××ert);
對於從庫有而主庫沒有的行,經過在主庫執行delete來刪除(pt-table-sync強烈建議全部的數據修復都只在主庫進行,而不建議直接修改從庫數據;可是也有特例,之後面會講到)。orm
在slave庫上的mysql user表上,新建一個用戶 qdtets@'192.168.0.%' 模擬master和slave庫數據不一致server
grant all on *.* to qdtets@'192.168.0.%' identified by 'DHWUOEdwerer';flush privileges;
[root@kusou-es11 ~]# /usr/local/percona-toolkit/bin/pt-table-checksum h=192.168.0.39,u=ptsum,p='ptchecksums',P=3306 --databases=mysql --replicate=percona.checksums --no-check-binlog-format --nocheck-replication-filters Checking if all tables can be checksummed ... Starting checksum ... TS ERRORS DIFFS ROWS DIFF_ROWS CHUNKS SKIPPED TIME TABLE 06-15T13:32:27 0 0 0 0 1 0 0.317 mysql.columns_priv 06-15T13:32:28 0 0 2 0 1 0 0.318 mysql.db 06-15T13:32:28 0 0 2 0 1 0 0.316 mysql.engine_cost 06-15T13:32:28 0 0 0 0 1 0 0.317 mysql.event 06-15T13:32:29 0 0 0 0 1 0 0.316 mysql.func 06-15T13:32:29 0 0 41 0 1 0 0.317 mysql.help_category 06-15T13:32:29 0 0 699 0 1 0 0.318 mysql.help_keyword 06-15T13:32:30 0 0 1413 0 1 0 0.319 mysql.help_relation 06-15T13:32:30 0 0 643 0 1 0 0.325 mysql.help_topic 06-15T13:32:30 0 0 0 0 1 0 0.316 mysql.ndb_binlog_index 06-15T13:32:31 0 0 0 0 1 0 0.316 mysql.plugin 06-15T13:32:31 0 1 48 0 1 0 0.317 mysql.proc 06-15T13:32:31 0 0 0 0 1 0 0.317 mysql.procs_priv 06-15T13:32:32 0 0 1 0 1 0 0.317 mysql.proxies_priv 06-15T13:32:32 0 0 6 0 1 0 0.317 mysql.server_cost 06-15T13:32:32 0 0 0 0 1 0 0.316 mysql.servers 06-15T13:32:33 0 0 2 0 1 0 0.317 mysql.tables_priv 06-15T13:32:33 0 0 0 0 1 0 0.316 mysql.time_zone 06-15T13:32:33 0 0 0 0 1 0 0.316 mysql.time_zone_leap_second 06-15T13:32:33 0 0 0 0 1 0 0.316 mysql.time_zone_name 06-15T13:32:34 0 0 0 0 1 0 0.318 mysql.time_zone_transition 06-15T13:32:34 0 0 0 0 1 0 0.317 mysql.time_zone_transition_type **06-15T13:32:34 0 1 6 1 1 0 0.319 mysql.user**
在slave庫上pt-table-sync 修復數據:
slave庫上操做:
[root@kusou-es11 ~]# /usr/local/percona-toolkit/bin/pt-table-sync h=192.168.0.39,u=ptsum,p=ptchecksums,P=3306 --databases=mysql --tables=user --replicate=percona.checksums --print Access denied for user 'ptsum'@'192.168.0.%' to database 'mysql' [for Statement "LOCK TABLES `mysql`.`user` WRITE"] at line 6172 while doing mysql.user on 192.168.0.11
報錯,提示沒lock tables 權限
解決辦法:登陸master庫從新受權,添加lock tables權限
grant update,×××ert,select,create,drop,delete,index,execute,lock tables,super,process,replication slave on *.* to ptsum@'192.168.0.%' identified by 'ptchecksums'; flush privileges;
再次操做不在報錯br/>**輸出提示master庫的mysql.user表和slave庫的mysql.user表的數據不一致。slave庫的mysql.user表多了一個用戶qdtets@'192.168.0.%'。須要刪除這個用戶,才能保證主庫和從庫數據的一致
換句話說:
因爲從庫只是比主庫多了一條數據,pt-table-sync將以主庫以準,在主庫執行一個刪除操做的事件,而後slave應用此事件完成同步**
[root@kusou-es11 ~]# /usr/local/percona-toolkit/bin/pt-table-sync h=192.168.0.39,u=ptsum,p=ptchecksums,P=3306 --databases=mysql --tables=user --replicate=percona.checksums --print DELETE FROM `mysql`.`user` WHERE `host`='192.168.0.%' AND `user`='qdtets' LIMIT 1 /*percona-toolkit src_db:mysql src_tbl:user src_dsn:P=3306,h=192.168.0.39,p=...,u=ptsum dst_db:mysql dst_tbl:user dst_dsn:P=3306,h=192.168.0.11,p=...,u=ptsum lock:1 transaction:0 changing_src:percona.checksums replicate:percona.checksums bidirectional:0 pid:137319 user:root host:kusou-es11*/;
提示: 命令末尾的--print的指令是打印出須要修復數據的命令,不執行命令。
使用pt-table-checksum檢測mysql的user表,DIFFS =1 事實證實master和slave的mysql user表數據確實不一致:
[root@kusou-es11 ~]# /usr/local/percona-toolkit/bin/pt-table-checksum h=192.168.0.39,u=ptsum,p='ptchecksums',P=3306 --databases=mysql --tables=user --no-check-binlog-format --nocheck-replication-filters Checking if all tables can be checksummed ... Starting checksum ... TS ERRORS DIFFS ROWS DIFF_ROWS CHUNKS SKIPPED TIME TABLE 06-15T09:58:37 0 1 6 1 1 0 0.318 mysql.user
執行修復命令pt-table-sync 修復master和slave的mysql user表數據:
[root@kusou-es11 ~]# /usr/local/percona-toolkit/bin/pt-table-sync h=192.168.0.39,u=ptsum,p=ptchecksums,P=3306 --databases=mysql --tables=user --replicate=percona.checksums --execute [root@kusou-es11 ~]#
提示: 命令末尾的 --execute 的指令是執行修復數據的指令,使master庫mysql.user表和slave庫的mysql.user表數據一致
slave庫上檢查master庫的mysql.user表 和slave庫的mysql.user 表數據是否一致:
[root@kusou-es11 ~]# /usr/local/percona-toolkit/bin/pt-table-checksum h=192.168.0.39,u=ptsum,p='ptchecksums',P=3306 --databases=mysql --tables=user --no-check-binlog-format --nocheck-replication-filters Checking if all tables can be checksummed ... Starting checksum ... TS ERRORS DIFFS ROWS DIFF_ROWS CHUNKS SKIPPED TIME TABLE 06-15T09:46:52 0 0 6 0 1 0 0.319 mysql.user
能夠看到DIFFS =0 ,說明數據已經修復完成
將master 上的全部數據同步到slave:
[root@kusou-es11 ~]# /usr/local/percona-toolkit/bin/pt-table-sync --execute h=192.168.0.39,u=ptsum,p=ptchecksums,P=3306 --databases=mysql --tables=user h=192.168.0.11,u=ptsum,p='ptchecksums',P=3306 --no-check-slave --print DELETE FROM `mysql`.`user` WHERE `host`='10.0.0.1' AND `user`='dhrue' LIMIT 1 /*percona-toolkit src_db:mysql src_tbl:user src_dsn:P=3306,h=192.168.0.39,p=...,u=ptsum dst_db:mysql dst_tbl:user dst_dsn:P=3306,h=192.168.0.11,p=...,u=ptsum lock:0 transaction:0 changing_src:0 replicate:0 bidirectional:0 pid:12565 user:root host:kusou-es11*/;
將master 上的全部數據同步到slave1和slave2:
[root@kusou-es11 ~]# /usr/local/percona-toolkit/bin/pt-table-sync --execute h=192.168.0.39,u=ptsum,p=ptchecksums,P=3306 --databases=mysql --tables=user h=192.168.0.11,u=ptsum,p='ptchecksums',P=3307 h=192.168.0.22,u=ptsum,p='ptchecksums',P=3308 --no-check-slave --print
對pt-table-checksum和pt-table-sync這一組工具進行了最簡單的測試,其實運行這一組命令不必定須要在主從結構的主庫上進行,網段內的任何服務器均可以運行,前提就是安裝好這套工具就好。
pt-table-checksum/pt-table-sync原理介紹能夠參考以下博文:
http://blog.sina.com.cn/s/blog_a1e9c7910102vnsd.html