http://www.percona.com/redir/downloads/percona-toolkit/ 可下载pt软件包

它需要依赖包,所以提前安装一下依赖包

yum install perl perl-DBI perl-DBD-MySQL perl-IO-Socket-SSL perl-Time-HiRes -y

解压

tar -zxvf percona-toolkit-2.1.3.tar.gz

cd  percona-toolkit-2.1.3

perl Makefile.PL

make

make install

(这里需要校验的表,都必须有主键或者唯一索引)

二,赋权

1,在master和slave上都要创建一个用户(随意)权限很重要

grant all on *.* to 'pt'@'%' identified by '123';


2,开始校验


在master上

create database pincer;

use pincer;

create table p(id int primary key);

insert into p values(1);

[root@localhost bin]# ./pt-table-checksum --user=pt --password=123 --no-check-replication-filters 
TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE 
10-12T14:15:46 0 0 0 1 0 0.006 mysql.columns_priv 
10-12T14:15:46 0 0 4 1 0 0.005 mysql.db 
10-12T14:15:46 0 0 0 1 0 0.009 mysql.event 
10-12T14:15:46 0 0 0 1 0 0.005 mysql.func 
10-12T14:15:46 0 0 39 1 0 0.005 mysql.help_category 
10-12T14:15:46 0 0 464 1 0 0.007 mysql.help_keyword 
10-12T14:15:46 0 0 1028 1 0 0.007 mysql.help_relation 
10-12T14:15:46 0 0 508 1 0 0.016 mysql.help_topic 
10-12T14:15:46 0 0 0 1 0 0.006 mysql.host 
10-12T14:15:46 0 0 0 1 0 0.007 mysql.ndb_binlog_index 
10-12T14:15:46 0 0 0 1 0 0.005 mysql.plugin 
10-12T14:15:46 0 0 0 1 0 0.005 mysql.proc 
10-12T14:15:46 0 0 0 1 0 0.010 mysql.procs_priv 
10-12T14:15:46 0 0 2 1 0 0.009 mysql.proxies_priv 
10-12T14:15:46 0 0 0 1 0 0.009 mysql.servers 
10-12T14:15:46 0 0 0 1 0 0.009 mysql.tables_priv 
10-12T14:15:46 0 0 0 1 0 0.009 mysql.time_zone 
10-12T14:15:46 0 0 0 1 0 0.009 mysql.time_zone_leap_second 
10-12T14:15:46 0 0 0 1 0 0.009 mysql.time_zone_name 
10-12T14:15:46 0 0 0 1 0 0.009 mysql.time_zone_transition 
10-12T14:15:46 0 0 0 1 0 0.009 mysql.time_zone_transition_type 
10-12T14:15:46 0 0  9 1 0 0.010 mysql.user 
10-12T14:15:46 0 0 1 1 0 0.008 pincer.p

上面是执行后打印出来的信息,展示了每个表的行数 ,和是否有不一致

执行完后,会在本地创建一个库percona

查看这个库中的表

root@localhost|(none)>use percona; 
Database changed 
root@localhost|percona>show tables; 
+-------------------+ 
| Tables_in_percona | 
+-------------------+ 
| checksums | 
+-------------------+ 
1 row in set (0.00 sec) 

root@localhost|percona>desc checksums; 
+----------------+--------------+------+-----+-------------------+-----------------------------+ 
| Field | Type | Null | Key | Default | Extra | 
+----------------+--------------+------+-----+-------------------+-----------------------------+ 
| db | char(64) | NO | PRI | NULL | | 
| tbl | char(64) | NO | PRI | NULL | | 
| chunk | int(11) | NO | PRI | NULL | | 
| chunk_time | float | YES | | NULL | | 
| chunk_index | varchar(200) | YES | | NULL | | 
| lower_boundary | text | YES | | NULL | | 
| upper_boundary | text | YES | | NULL | | 
| this_crc | char(40) | NO | | NULL | | 
| this_cnt | int(11) | NO | | NULL | | 
| master_crc | char(40) | YES | | NULL | | 
| master_cnt | int(11) | YES | | NULL | | 
| ts | timestamp | NO | MUL | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | 
+----------------+--------------+------+-----+-------------------+-----------------------------+ 
12 rows in set (0.04 sec)



在slave上执行

[root@localhost bin]# ./pt-table-checksum --user=pt --password=123 --no-check-replication-filters 
TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE 
10-12T14:15:46 0 0 0 1 0 0.006 mysql.columns_priv 
10-12T14:15:46 0 0 4 1 0 0.005 mysql.db 
10-12T14:15:46 0 0 0 1 0 0.009 mysql.event 
10-12T14:15:46 0 0 0 1 0 0.005 mysql.func 
10-12T14:15:46 0 0 39 1 0 0.005 mysql.help_category 
10-12T14:15:46 0 0 464 1 0 0.007 mysql.help_keyword 
10-12T14:15:46 0 0 1028 1 0 0.007 mysql.help_relation 
10-12T14:15:46 0 0 508 1 0 0.016 mysql.help_topic 
10-12T14:15:46 0 0 0 1 0 0.006 mysql.host 
10-12T14:15:46 0 0 0 1 0 0.007 mysql.ndb_binlog_index 
10-12T14:15:46 0 0 0 1 0 0.005 mysql.plugin 
10-12T14:15:46 0 0 0 1 0 0.005 mysql.proc 
10-12T14:15:46 0 0 0 1 0 0.010 mysql.procs_priv 
10-12T14:15:46 0 0 2 1 0 0.009 mysql.proxies_priv 
10-12T14:15:46 0 0 0 1 0 0.009 mysql.servers 
10-12T14:15:46 0 0 0 1 0 0.009 mysql.tables_priv 
10-12T14:15:46 0 0 0 1 0 0.009 mysql.time_zone 
10-12T14:15:46 0 0 0 1 0 0.009 mysql.time_zone_leap_second 
10-12T14:15:46 0 0 0 1 0 0.009 mysql.time_zone_name 
10-12T14:15:46 0 0 0 1 0 0.009 mysql.time_zone_transition 
10-12T14:15:46 0 0 0 1 0 0.009 mysql.time_zone_transition_type 
10-12T14:15:46 0 0  9 1 0 0.010 mysql.user 
10-12T14:15:46 0 0 1 1 0 0.008 pincer.p

可以看到此时2边的

DIFFS  下都是0,没有不同步的


下面到slave 制造不同步

use pincer;

insert  into p values(2);


然后执行

[root@localhost bin]# ./pt-table-checksum --user=pt --password=123 --no-check-replication-filters 
TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE 
10-12T14:23:54 0 0 0 1 0 0.011 mysql.columns_priv 
10-12T14:23:54 0 0 4 1 0 0.020 mysql.db 
10-12T14:23:55 0 0 0 1 0 0.025 mysql.event 
10-12T14:23:55 0 0 0 1 0 0.015 mysql.func 
10-12T14:23:55 0 0 39 1 0 0.009 mysql.help_category 
10-12T14:23:55 0 0 464 1 0 0.009 mysql.help_keyword 
10-12T14:23:55 0 0 1028 1 0 0.010 mysql.help_relation 
10-12T14:23:55 0 0 508 1 0 0.014 mysql.help_topic 
10-12T14:23:55 0 0 0 1 0 0.011 mysql.host 
10-12T14:23:55 0 0 0 1 0 0.012 mysql.ndb_binlog_index 
10-12T14:23:55 0 0 0 1 0 0.010 mysql.plugin 
10-12T14:23:55 0 0 0 1 0 0.007 mysql.proc 
10-12T14:23:55 0 0 0 1 0 0.010 mysql.procs_priv 
10-12T14:23:55 0 0 2 1 0 0.009 mysql.proxies_priv 
10-12T14:23:55 0 0 0 1 0 0.009 mysql.servers 
10-12T14:23:55 0 0 0 1 0 0.009 mysql.tables_priv 
10-12T14:23:55 0 0 0 1 0 0.010 mysql.time_zone 
10-12T14:23:55 0 0 0 1 0 0.008 mysql.time_zone_leap_second 
10-12T14:23:55 0 0 0 1 0 0.008 mysql.time_zone_name 
10-12T14:23:55 0 0 0 1 0 0.008 mysql.time_zone_transition 
10-12T14:23:55 0 0 0 1 0 0.009 mysql.time_zone_transition_type 
10-12T14:23:55 0 0 9 1 0 0.019 mysql.user 
10-12T14:23:55 0 2 1 0 0.006 pincer.p 可以看到p表中2条数据了

在master上执行

[root@localhost bin]# ./pt-table-checksum --user=pt --password=123 --no-check-replication-filters 
TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE 
10-12T14:23:54 0 0 0 1 0 0.011 mysql.columns_priv 
10-12T14:23:54 0 0 4 1 0 0.020 mysql.db 
10-12T14:23:55 0 0 0 1 0 0.025 mysql.event 
10-12T14:23:55 0 0 0 1 0 0.015 mysql.func 
10-12T14:23:55 0 0 39 1 0 0.009 mysql.help_category 
10-12T14:23:55 0 0 464 1 0 0.009 mysql.help_keyword 
10-12T14:23:55 0 0 1028 1 0 0.010 mysql.help_relation 
10-12T14:23:55 0 0 508 1 0 0.014 mysql.help_topic 
10-12T14:23:55 0 0 0 1 0 0.011 mysql.host 
10-12T14:23:55 0 0 0 1 0 0.012 mysql.ndb_binlog_index 
10-12T14:23:55 0 0 0 1 0 0.010 mysql.plugin 
10-12T14:23:55 0 0 0 1 0 0.007 mysql.proc 
10-12T14:23:55 0 0 0 1 0 0.010 mysql.procs_priv 
10-12T14:23:55 0 0 2 1 0 0.009 mysql.proxies_priv 
10-12T14:23:55 0 0 0 1 0 0.009 mysql.servers 
10-12T14:23:55 0 0 0 1 0 0.009 mysql.tables_priv 
10-12T14:23:55 0 0 0 1 0 0.010 mysql.time_zone 
10-12T14:23:55 0 0 0 1 0 0.008 mysql.time_zone_leap_second 
10-12T14:23:55 0 0 0 1 0 0.008 mysql.time_zone_name 
10-12T14:23:55 0 0 0 1 0 0.008 mysql.time_zone_transition 
10-12T14:23:55 0 0 0 1 0 0.009 mysql.time_zone_transition_type 
10-12T14:23:55 0 0 9 1 0 0.019 mysql.user 
10-12T14:23:55 0 1 1 1 0 0.006 pincer.p

可以看到master的p表上只有1跳数据,diff列显示为1 ,表示有数据不一致

查看下具体是什么数据不一致

在master上执行

[root@localhost bin]# pt-table-sync --print --sync-to-master h=192.168.92.129,u=pt,p=123,P=2433(这里的129为slave的ip)

DELETE FROM `pincer`.`p` WHERE `id`='2' LIMIT 1 /*percona-toolkit src_db:pincer src_tbl:p src_dsn:P=2433,h=192.168.92.130,p=...,u=pt dst_db:pincer dst_tbl:p dst_dsn:P=2433,h=192.168.92.129,p=...,u=pt lock:1 transaction:1 changing_src:1 replicate:0 bidirectional:0 pid:29667 user:root host:localhost.localdomain*/;

下面开始修复同步

[root@localhost bin]# pt-table-sync --execute --sync-to-master h=192.168.92.129,u=pt,p=123,P=2433

再次查看同步

[root@localhost bin]# ./pt-table-checksum --user=pt --password=123 --no-check-replication-filters 
TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE 
10-12T14:30:37 0 0 0 1 0 0.018 mysql.columns_priv 
10-12T14:30:37 0 0 4 1 0 0.010 mysql.db 
10-12T14:30:37 0 0 0 1 0 0.009 mysql.event 
10-12T14:30:37 0 0 0 1 0 0.010 mysql.func 
10-12T14:30:37 0 0 39 1 0 0.010 mysql.help_category 
10-12T14:30:37 0 0 464 1 0 0.009 mysql.help_keyword 
10-12T14:30:37 0 0 1028 1 0 0.015 mysql.help_relation 
10-12T14:30:38 0 0 508 1 0 0.266 mysql.help_topic 
10-12T14:30:38 0 0 0 1 0 0.018 mysql.host 
10-12T14:30:38 0 0 0 1 0 0.016 mysql.ndb_binlog_index 
10-12T14:30:38 0 0 0 1 0 0.009 mysql.plugin 
10-12T14:30:38 0 0 0 1 0 0.010 mysql.proc 
10-12T14:30:38 0 0 0 1 0 0.011 mysql.procs_priv 
10-12T14:30:38 0 0 2 1 0 0.009 mysql.proxies_priv 
10-12T14:30:38 0 0 0 1 0 0.290 mysql.servers 
10-12T14:30:38 0 0 0 1 0 0.022 mysql.tables_priv 
10-12T14:30:38 0 0 0 1 0 0.011 mysql.time_zone 
10-12T14:30:38 0 0 0 1 0 0.023 mysql.time_zone_leap_second 
10-12T14:30:38 0 0 0 1 0 0.010 mysql.time_zone_name 
10-12T14:30:38 0 0 0 1 0 0.010 mysql.time_zone_transition 
10-12T14:30:38 0 0 0 1 0 0.008 mysql.time_zone_transition_type 
10-12T14:30:38 0 0 9 1 0 0.009 mysql.user 
10-12T14:30:38 0 0 1 1 0 0.009 pincer.p

这里可以看到没有数据不同步的了

到slave上看下

[root@localhost percona-toolkit-2.1.3]# pt-table-checksum --user=pt --password=123 --no-check-replication-filters 
TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE 
10-12T09:56:02 0 0 0 1 0 0.003 mysql.columns_priv 
10-12T09:56:02 0 0 4 1 0 0.006 mysql.db 
10-12T09:56:02 0 0 0 1 0 0.009 mysql.event 
10-12T09:56:02 0 0 0 1 0 0.005 mysql.func 
10-12T09:56:02 0 0 39 1 0 0.008 mysql.help_category 
10-12T09:56:02 0 0 464 1 0 0.017 mysql.help_keyword 
10-12T09:56:02 0 0 1028 1 0 0.006 mysql.help_relation 
10-12T09:56:02 0 0 508 1 0 0.008 mysql.help_topic 
10-12T09:56:02 0 0 0 1 0 0.006 mysql.host 
10-12T09:56:02 0 0 0 1 0 0.006 mysql.ndb_binlog_index 
10-12T09:56:02 0 0 0 1 0 0.005 mysql.plugin 
10-12T09:56:02 0 0 0 1 0 0.004 mysql.proc 
10-12T09:56:02 0 0 0 1 0 0.006 mysql.procs_priv 
10-12T09:56:02 0 0 2 1 0 0.007 mysql.proxies_priv 
10-12T09:56:02 0 0 0 1 0 0.006 mysql.servers 
10-12T09:56:02 0 0 0 1 0 0.006 mysql.tables_priv 
10-12T09:56:02 0 0 0 1 0 0.005 mysql.time_zone 
10-12T09:56:02 0 0 0 1 0 0.006 mysql.time_zone_leap_second 
10-12T09:56:02 0 0 0 1 0 0.006 mysql.time_zone_name 
10-12T09:56:02 0 0 0 1 0 0.006 mysql.time_zone_transition 
10-12T09:56:02 0 0 0 1 0 0.005 mysql.time_zone_transition_type 
10-12T09:56:02 0 0 8 1 0 0.004 mysql.user 
10-12T09:56:02 0 0 2 1 0 0.005 pincer.p

这里可以看到已经跟master一样了


需要特别注意的是这两个命令执行的过程中,会对表上共享锁,所以生产环境要慎重选择执行时间。

这里为了方便,我们可以在校验的时候加上--host ,那么久可以直接在slave上对本地和master都进行一次校验

不用再登陆到master上去执行一次了