使用pt-table-checksum進行主從資料一致性比對
阿新 • • 發佈:2019-01-10
使用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)
x86_64
安裝部署
134主庫執行:
134、189主庫,從庫均執行
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主庫
現在我們針對表來進行比對
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庫中所有的表
引數的意義:
--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 --execute
[[email protected] percona-toolkit-2.2.5]#
下面,我們再來檢視主庫和從庫中的資料,發現已經一致了。
134主庫
主從資料庫環境:
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)
# archx86_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