1. 程式人生 > >使用pt-table-checksum進行主從資料一致性比對

使用pt-table-checksum進行主從資料一致性比對

使用pt-table-checksum進行主從資料一致性比對

主從資料庫環境:
master db 192.168.17.134 host134  replicate db:bhtest test
slave  db 192.168.17.189 host189  replicate db:bhtest test

作業系統:
# cat /etc/issue
CentOS release 5.6 (Final)

Kernel \r on an \m


CentOS release 5.9 (Final)

# arch
x86_64

安裝部署
134主庫執行:
# mv percona-toolkit-2.2.5.tar.gz  /usr/local/
# tar xzvf percona-toolkit-2.2.5.tar.gz 
# cd percona-toolkit-2.2.5
# perl Makefile.PL 
# make;make install
# pt-table-     //按Tab補齊鍵,能夠看到我們即將使用的工具pt-table-checksum  pt-table-sync
pt-table-checksum  pt-table-sync      pt-table-usage  
賦權
134、189主庫,從庫均執行
GRANT SELECT, PROCESS, SUPER, REPLICATION SLAVE ON *.* TO 'checksumer'@'192.168.17.134' IDENTIFIED BY '123';
GRANT ALL PRIVILEGES ON `bhtest`.* TO 'checksumer'@'192.168.17.134';                                                                                     
GRANT ALL PRIVILEGES ON `test`.* TO 'checksumer'@'192.168.17.134';   
建立從庫資訊
134主庫   //在Master機的test庫加入
use test;
 
CREATE TABLE `dsns` ( `id` int(11) NOT NULL AUTO_INCREMENT, `parent_id`
int(11) DEFAULT NULL, `dsn` varchar(255) NOT NULL, PRIMARY KEY (`id`) );
 
//寫入從庫資訊
 
INSERT INTO dsns (parent_id,dsn)
values(1,'h=192.168.17.189,u=checksumer,p=123,P=3307');

(在134主庫測試是否能使用checksumer賬號登陸17.189從庫:mysql -uchecksumer -p123 -P3307 -h192.168.17.189,要求能正確登陸。否則請檢查許可權和網路) 

//如果有多個從庫,就插入多條記錄.

現在我們構建不一致的表來進行測試
134主庫
@test 08:46:15>select * from bhtest.test90;
+-------------+
| id          |
+-------------+
|  2147483647 | 
|  2147483647 | 
|  2147483647 | 
| -2147483648 | 
| -2147483647 | 
| -2147483648 | 
| -2147483648 | 
| -2147483647 | 
|  2147483647 | 
+-------------+
9 rows in set (0.00 sec)

189從庫
mysql>insert into bhtest.test90 values(20141105);

mysql> select * from bhtest.test90;
+-------------+
| id          |
+-------------+
|  2147483647 |
|  2147483647 |
|  2147483647 |
| -2147483648 |
| -2147483647 |
| -2147483648 |
| -2147483648 |
| -2147483647 |
|  2147483647 |
|    20141105 |
+-------------+
10 rows in set (0.00 sec)
現在,bhtest庫中的test90表在主從是不一致的,從庫比主庫中多一條記錄

現在我們針對表來進行比對
134主庫
pt-table-checksum  --nocheck-replication-filters --replicate=test.checksums --no-check-binlog-format --databases=bhtest --tables=test90 h=192.168.17.134,u=checksumer,p=123,P=3307 --recursion-method=dsn=h=192.168.17.134,D=test,t=dsns

# 2 software updates are available:
#   * The current version for MySQL Community Server (GPL) is 5.6.21.
#   * The current version for Percona::Toolkit is 2.2.11.

            TS ERRORS  DIFFS     ROWS  CHUNKS SKIPPED    TIME TABLE
11-05T20:45:24      0      1        9       1       0   0.047 bhtest.test90
//DIFFS值非0,表示主從不一致

現在我們比對bhtest庫中所有的表
pt-table-checksum --nocheck-replication-filters --replicate=bhtest.checksums --no-check-binlog-format --databases=bhtest h=192.168.17.134,u=checksumer,p=123,P=3307 --recursion-method=dsn=h=192.168.17.134,D=test,t=dsns

            TS ERRORS  DIFFS     ROWS  CHUNKS SKIPPED    TIME TABLE
11-05T20:51:05      0      0        1       1       0   0.279 bhtest.accounts
11-05T20:51:05      0      0       92       1       0   0.012 bhtest.audit
11-05T20:51:05      0      0        1       1       0   0.010 bhtest.bh_test2
11-05T20:51:05      0      0        8       1       0   0.013 bhtest.bhtest
11-05T20:51:05      0      0        3       1       0   0.011 bhtest.bhtest1
11-05T20:51:05      0      0        0       1       0   0.009 bhtest.bhtest10
11-05T20:51:05      0      0        0       1       0   0.011 bhtest.com_base_info
11-05T20:51:05      0      0        1       1       0   0.009 bhtest.ms_test
11-05T20:51:05      0      0        0       1       0   0.009 bhtest.prod_product_cat_search
11-05T20:51:05      0      0        3       1       0   0.010 bhtest.test
11-05T20:51:05      0      1        9       1       0   0.009 bhtest.test90
11-05T20:51:05      0      0        7       1       0   0.009 bhtest.test900
11-05T20:51:05      0      0        4       1       0   0.008 bhtest.test9000

檢查出表test90存在資料不一致的現象,那麼我們通過工具pt-table-sync來進行修復
重新構建環境
134主庫

[email protected] 11:29:14>select * from test90;                                      
+----+
| id |
+----+
| 30 | 
| 31 | 
| 32 | 
| 33 | 
+----+
4 rows in set (0.00 sec)

189從庫
mysql> select * from bhtest.test90;    
+------+
| id   |
+------+
|   30 |
|   31 |
|   32 |
|   33 |
| 1111 |
+------+
5 rows in set (0.00 sec)
# pt-table-sync
引數的意義:
--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     :執行命令。
更多的引數請見官網


# pt-table-sync --sync-to-master h=192.168.17.189,u=checksumer,p=123,P=3307 --databases=bhtest --tables=test90 --print
Can't make changes on the master because no unique index exists at /usr/bin/pt-table-sync line 10666.  while doing bhtest.test90 on 192.168.17.189

134主庫
alter table bhtest.test90 add primary key(id);

列印差異資料
# pt-table-sync --sync-to-master h=192.168.17.189,u=checksumer,p=123,P=3307 --databases=bhtest --tables=test90 --print
DELETE FROM `bhtest`.`test90` WHERE `id`='1111' LIMIT 1 /*percona-toolkit src_db:bhtest src_tbl:test90 src_dsn:P=3307,h=192.168.17.134,p=...,u=checksumer dst_db:bhtest dst_tbl:test90 dst_dsn:P=3307,h=192.168.17.189,p=...,u=checksumer lock:1 transaction:1 changing_src:1 replicate:0 bidirectional:0 pid:18970 user:root host:host4*/;
打印出來了修復資料的sql語句,可以手動的去從行執行,讓他們資料保持一致性。那能否直接執行?當然可以,通過(--execute):
執行差異資料
# pt-table-sync --sync-to-master h=192.168.17.189,u=checksumer,p=123,P=3307 --databases=bhtest --tables=test90 --execute
[[email protected] percona-toolkit-2.2.5]# 
下面,我們再來檢視主庫和從庫中的資料,發現已經一致了。
134主庫
[email protected] 11:29:14>select * from test90;                                      
+----+
| id |
+----+
| 30 | 
| 31 | 
| 32 | 
| 33 | 
+----+
4 rows in set (0.00 sec)

189從庫
[email protected] 11:29:14>select * from test90;                                      
+----+
| id |
+----+
| 30 | 
| 31 | 
| 32 | 
| 33 | 
+----+
4 rows in set (0.00 sec)
遇到的問題彙總

1,mysql module is not installed or not found

# pt-table-checksum  --nocheck-replication-filters --replicate=test.checksums --no-check-binlog-format --databases=umc --tables=test90 h=192.168.65.211,u=checksum,p=check123,P=3306 --recursion-method=dsn=h=192.168.65.211,D=test,t=dsns
11-07T11:39:44 Cannot connect to MySQL because the Perl DBD::mysql module is not installed or not found.  Run 'perl -MDBD::mysql' to see the directories that Perl searches for DBD::mysql.  If DBD::mysql is not installed, try:
  Debian/Ubuntu  apt-get install libdbd-mysql-perl
  RHEL/CentOS    yum install perl-DBD-MySQL
  OpenSolaris    pgk install pkg:/SUNWapu13dbd-mysql
解決

# yum install perl-DBD-MySQL