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 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上去执行一次了