mysql 主从一致性检查以及修复_第1张图片


一.简介:

wKiom1PPDCjwkAWZAABZWCVHBxI966.jpg

 

该软件是由由领先的MySQL咨询公司Percona发布的

Percona的很多软件我只能说是强!!!改公司开发的部分工具软件甚至已经超越oracle 自身所开发的工具软件

因此不用怀疑这个公司开发的软件会不会带来什么风险


pt-table-checksum,pt-table-sync

percona-toolkit工 具集的工具之一用来检查与修复主从不一致数据之用。它通过在主库执行基于statement模式的sql语句来生成主库数据块的总和校验,把相同的sql语句传递到从库,并在从库上计 算相同数据块的总和校验,最后,比较主从库上相同数据块的总和校验值,由此判断主从数据是否一致。这种校验是分表进行的,在每个表内部又 是分块进行的,而且pt工具本身提供了非常多的限流选项,因此对线上服务的冲击较小


二.环境

主 192.168.186.138   [root@mysql2 ~]  mysql2.com

192.168.186.140   [root@dbserver1 ]  dbserver1.com


三.安装

(1).安装相关依赖包:

[root@mysql2 opt]# yum -y install perl-DBI perl-DBD-MySQL 
perl-TermReadKey


(2).安装percona-toolkit

可以rpm 方式也可以源代码编译

我这里用源代码编译

[root@mysql2 opt]# tar -xf percona-toolkit-2.2.2.tar.gz 
[root@mysql2 percona-toolkit-2.2.2]# perl Makefile.PL
[root@mysql2 percona-toolkit-2.2.2]# make && make install


四:授权

主机mysql 上授权

mysql> GRANT SELECT, PROCESS, SUPER, REPLICATION SLAVE ON *.* TO 'opt'@'192.168.186.138' IDENTIFIED BY '123';
Query OK, 0 rows affected (0.03 sec)
 
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)


五.检测

[root@mysql2 local]#  pt-table-checksum h='192.168.186.138',u='opt',p='123',P=3306 -d lisi --nocheck-replication-filters --no-check-binlog-format --replicate=test.wocao
Diffs cannot be detected because no slaves were found.  Please read the --recursion-method documentation for information.
            TS ERRORS  DIFFS     ROWS  CHUNKS SKIPPED    TIME TABLE
07-20T18:41:58      0      0   655360      10       0   4.498 lisi.book
Checksumming lisi.haowutest:  52% 00:27 remain
Checksumming lisi.haowutest:  92% 00:04 remain
07-20T18:43:05      0      0  7676940      70       0  66.694 lisi.haowutest
07-20T18:43:05      0      0        2       1       0   0.118 lisi.j
07-20T18:43:05      0      0        2       1       0   0.099 lisi.l
07-20T18:43:05      0      0        0       1       0   0.145 lisi.lisi
07-20T18:43:05      0      0        3       1       0   0.134 lisi.o
07-20T18:43:05      0      0        0       1       0   0.057 lisi.wanger
07-20T18:43:06      0      0        7       1       0   0.166 lisi.wanger1
07-20T18:43:06      0      0        0       1       0   0.144 lisi.ww


在这里还引申出了一个知识点

我本来想在从上删除lisi.haowutest表的一部分数据 然后跳过错误 再做一次检查 既然发现slave_skip_errors =1045 没有用 这是怎么回事呢

原来myql 表授权信息变了   

[root@dbserver1 data]# cat master.info  发现授权给slave的连接密码已经和mysql.user表里面的不一致了

所以我建议mysql库还是不要同步的好 省的发生乱起八糟 不可思议的问题。关于授权在线上曾经发生过很多奇葩的问题在此不做讨论了


实验继续

现在haowu.test表数据时不一致的情况下检测 DIFFS为0表示一致为1表示不一致

[root@mysql2 data]# pt-table-checksum h='192.168.186.138',u='opt',p='123',P=3306 -d lisi --nocheck-replication-filters --no-check-binlog-format --replicate=test.wocao
            TS ERRORS  DIFFS     ROWS  CHUNKS SKIPPED    TIME TABLE
07-20T21:04:44      0      0   655360      10       0   7.600 lisi.book
Checksumming lisi.haowutest:  74% 00:10 remain
07-20T21:05:28      0      1  7676940      58       0  43.484 lisi.haowutest
07-20T21:05:28      0      0        2       1       0   0.069 lisi.j
07-20T21:05:28      0      0        2       1       0   0.061 lisi.l
07-20T21:05:28      0      0        0       1       0   0.083 lisi.lisi
07-20T21:05:28      0      0        3       1       0   0.063 lisi.o
07-20T21:05:28      0      0        0       1       0   0.074 lisi.wanger
07-20T21:05:28      0      0        7       1       0   0.064 lisi.wanger1
07-20T21:05:28      0      0        0       1       0   0.063 lisi.ww



 

可以看出lisi.haowutest 有记录数不一致 上去看看是不是这样

[root@mysql2 data]# mysql -phaowu123
mysql> select count(*) from lisi.haowutest;
+----------+
| count(*) |
+----------+
|  7676940 |
+----------+
1 row in set (10.35 sec)
 
[root@dbserver1 data]# mysql -phaowu123
mysql> select count(1) from lisi.haowutest;
+----------+
| count(1) |
+----------+
|  7676632 |
+----------+
1 row in set (7.22 sec)


果然不一致

六.修复

[root@mysql2 data]# pt-table-sync --print --sync-to-master  h=192.168.186.140,D=lisi,t=haowutest -uopt -p123

  查看下

解释:


pt-table-sync --print --sync-to-master h=1.1.1.1,D=test,t=test1 -uxxx -p123(其中这个xxx用户密码要机能登录到master也能登录到slave,需要的权限select,super,replication client,process


 修复从库1.1.1.1test库的test表上的数据 


如果把--print换成--execute则是直接执行  建议先用--print保存下看看再--execute  这样看到sql执行比较放心


可以打开gengral log很容易看到masterslave上执行的操作,分别去一段段的数据做对比校验 ,有不同的立刻用replace intomaster去执行



[root@mysql2 data]# pt-table-sync --execute --sync-to-master  h=192.168.186.140,D=lisi,t=haowutest -uopt -p123

 这就是修复了

话虽如此但是要是不行的话 还是在两边都授个全部权限吧

mysql> grant all on *.* to we@'%' identified by '123';
Query OK, 0 rows affected (0.03 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> \q
Bye
[root@mysql2 data]# pt-table-sync --execute --sync-to-master  h=192.168.186.138,h=192.168.186.140,D=lisi,t=haowutest -uwe -p123
OK 至此结束
[root@dbserver1 data]# mysql -phaowu123
mysql> select count(*) from lisi.haowutest;
+----------+
| count(*) |
+----------+
|  7676940 |
+----------+
1 row in set (7.25 sec)
[root@mysql2 data]# mysql -phaowu123
 
mysql> select count(*) from lisi.haowutest;
+----------+
| count(*) |
+----------+
|  7676940 |
+----------+
1 row in set (7.25 sec)


修复完成

 

七.命令参数详解

不指定参数,表示对本地的所有数据库的表进行检查。[root@mysql2 Desktop]#pt-table-checksum u=root,p=haowu123

参数说明:

TS            :完成检查的时间。

ERRORS        :检查时候发生错误和警告的数量。

DIFFS         :0表示一致,1表示不一致

ROWS          :行数。

CHUNKS        :被划分到表中的块的数目。

SKIPPED       :由于错误或警告或过大,则跳过块的数目。

TIME          :执行的时间。

TABLE         :被检查的表名。

参数意义:

--nocheck-replication-filters :不检查复制过滤器,建议启用。后面可以用--databases来指定需要检查的数据库。

--no-check-binlog-format      : 不检查复制的binlog模式,要是binlog模式是ROW,则会报错。就是说如果是row模式必须加上这玩意

--replicate-check-only :只显示不同步的信息。

--replicate=   :把checksum的信息写入到指定表中,建议直接写到被检查的数据库当中。

--databases=   :指定需要被检查的数据库,多个则用逗号隔开。

--tables=      :指定需要被检查的表,多个用逗号隔开

更多的参数请见官网

如有疑问建议请提出,谢谢!!