安装
在132.224.133.5/2上安装Percona Toolkit,安装过程略,见Percona Toolkit学习文档
内建方法的局限
在理想情况,不考虑复制过滤等因素,备库的数据和主库应当是一致的,然而事实上,因为MySQL的复制没有块级SCN机制,二进制日志也相对不严谨,所以备库可能发生错误,或者根本没有错误的情况下,就与主库产生了不一致,MySQL的内建方法show slave status可以查看主从复制的运行状况,但是事实上根本意识不到主从的数据已经不再一致,做一个简单的实验如下:(展业测试环境132.224.133.5/2)
在主库的会话级别关闭二进制日志开关(看起来手工关闭二进制日志是愚蠢的,在生产上绝不会这么做,但事实上,包括mysqldump导出的默认文件在内,很多地方就有这样的写法,很多时候,维护人员和管理员,没有意识到就已经执行了这一语句),然后再插入数据并检查:
在从库上查看表的内容和复制状况:
可见表的数据是不一致的,没有刚刚在主库上新插入的数据行,但复制状况却没有任何问题,如下图所示:
MySQL事实上并没有内建的方法来比较一台服务器与别的服务器数据是否相同,如果使用pt-table-checksum工具,则可以方便地查看到表的数据差异:
简介
pt-table-checksum是当前最好的检测MySQL主从一致性的工具,也是截止《高性能MySQL(第三版)》一书出版时,唯一能够有效比较主备一致性的工具,该工具不但能够以灵活地方式来进行各种类别、范围的主备数据一致性比较,而且充分考虑了MySQL运行中负载、安全性等问题,避免因为工具的运行造成数据库的故障或者性能受损。
使用范例:
主库:132.224.133.5
从库:132.224.133.2
在主库服务器上执行:
pt-table-checksum --replicate=heg.checksum -h 132.224.133.5 -P 3306 -u heg --ask-pass --no-check-binlog-format --databases=heg
查看表:
注:
- 这里使用了heg账号,heg账号拥有ALL PRIVILEGES ON *.*的管理员级别权限,如果使用专门的账号来进行复制对比,可以新建账号,权限如下:
GRANT SELECT, PROCESS, SUPER, REPLICATION SLAVE,CREATE,DELETE,INSERT,UPDATE ON . TO ‘USER’@‘MASTER_HOST’ identified by ‘PASSWORD’;
这些权限都是必须的,否则后续执行时会报错,当然,如果不想授予这么多权限,那就需要把权限对应的活先自己干了或者直接在命令行指定,比如如果不想设create权限的话,需要自己指定库和表(具体参看下面的参数介绍:–replicate); - 主从的端口必须一致,如果不一致就需要用DSN方法进行指定,否则会报找不到从库的错误,如果能连到从库服务器但没有指定端口,默认会寻找3306端口;
- 被检查的主从binlog_format必须为statement,如果不是statement-based,那就添加参数–no-check-binlog-format来避开binlog格式检查;
- 检查结果会输出到指定的表,本例中是heg.checksum,如果没有指定,则是默认建立的percona库中的checksums表中,并会输出统计信息到屏幕,diffs列展示主从数据不一致的块的数目,如果都是0,则表明数据是一致的;
原理
pt-table-checksum运行在主库上,通过show processlist或者show slave hosts或者DSN的方式来确定从库并进行连接,默认使用crc32算法来进行数据校验,该工具之所以需要把binlog设置为statement格式,是因为该工具能得出主从是否一致所依赖的就是statement基础上同样的SQL语句在主从库上各自的执行结果,主库进行检查后sql语句传给从库,从库执行一遍后,也得到自己的结果,执行语句是:
SELECT COUNT(*) AS cnt, COALESCE(LOWER(CONV(BIT_XOR(CAST(CRC32(CONCAT_WS(’#’, 各种列名)) AS UNSIGNED)), 10, 16)), 0) AS crc FROM database
.table
FORCE INDEX(PRIMARY
) WHERE ((id
>= ‘1’)) AND ((id
<= ‘1000’))
注: where的条件是根据系统繁忙程度计算出的要执行的范围
cnt是目前检查的块包括的行数,unsigned是计算出的该块数据的校验值
如果主库和从库得出的这两个值都是一样的,那数据就是一致的,如果不一样,那就主从不一致,当然,字符集、浮点数之类的问题需要提前规避,以免错判。
工具将主从各自得到的结果处理后放到checksums表中并呈现一些结果在屏幕输出中。
安全性
pt-table-checksum采用了很多措施来保证检查过程中的安全性,默认参数是可以保障使用安全的,不过参数可以配置,所以需要详细了解参数的功能后再进行更改,否则最好采用默认值。
关于工具执行过程中,具体在主从库执行了哪些任务,可以详见参考文档,主要的点包括:
- 安全性相关设置,包括超时设置,