pt –table -checksum
percona-toolkit系列工具中的一个
用途: 可以用来检测主、 从数据库中数据的一致性。
原理: 在主库上运行, 对同步的表进行checksum, 记录下来。 然后对比主从中各个表的checksum是否一致, 从而判断数据是否一致。
pt-table-sync
用途:用来修复多个实例之间数据的不一致,它可以让主从的数据修复到最终一致,也可以使通过应用双写或多写的多个不相关的数据库实例修复到一致。同时它还内部集成了pt-table-checksum的校验功能,可以一边校验一边修复,也可以基于pt-table-checksum的计算结果来进行修复。
原理:
行计算:
先检查表,然后获取每列的数据类型,然后把类型转化为字符串,利用concat_wa()函数进行连接,然后以crc32校验计算出checksum值;
块计算:
如果table的数据比较多,会把表拆分成多个块,然后以chunk为单位,将chunk内的所有数据拼接成在一起,进行行计算,从而得到chunk的checksum;(第一次会设为100,然后根据性能自动增加或者减少块的大小)
坏块检测和修复:
pt-table-checksum只校验,然后把结果存储到表,执行过的sql语句记录到binlog。不在意从库延时,延迟多少,计算的校验值都一样;
pt-table-sync首先完成chunk的checksum计算,如果数据不一致,则深入到chunk内部,进行逐行比较,并修复。
对每个从库、每个表,循环校验和修复。对每个块,在校验的时候加上for update锁。
执行checksum,比较主从的值,如果一致,则比较下一个chunk;
如果checksum不相同,则证明主从不一致,则深入chunk内部,逐行计算checksum并比较;单行的比较过程和chunk一样,单行实际是chunk为1的情况;
如果发现不一致,则标记下来,继续往下检测,直到检测完毕该chunk;
对于找到主从不一致的行,采用replace into语句,主库执行一遍生成全量binlog,并同步到从库,这会以主库为基准,修复数据;
对于主库没有,而从库有的行,通过在主库执行delete删除多余数据;(强烈建议,pt-table-sync修复所有的数据在主库修复,不建议在从库修复)
直到完成这一个chunk的修复,再继续检查修复下一个块,直到所有的表都修复结束;
安装:
依赖包:yuminstall perl perl-devel perl-Time-HiRes perl-DBI perl-DBD-MySQL
工具包:percona-toolkit
wget http://www.percona.com/get/percona-toolkit.tar.gz
tar zxvf percona-toolkit-2.2.13.tar.gz
cd percona-toolkit-2.2.13
perl Makefile.PL
make && make install
GRANT UPDATE,INSERT,DELETE,SELECT,PROCESS,SUPER,REPLICATIONSLAVE ON *.* TO 'tony'@'10.8.135.148';
赋予权限;
GRANT ALL ON percona.* to'tony'@'10.8.135.148' IDENTIFIED BY 'jsddwcc';
ln -s /tmp/download/percona-toolkit-3.0.6./percona-toolkit
PATH=$PATH:/usr/local/percona-toolkit/bin
校验:
pt-table-checksum --nocheck-binlog-format--nocheck-plan --nocheck-replication-filters --set-varsinnodb_lock_wait_timeout=120 --recursion-method=processlist --databases=books -u'root' -p'root01' -h10.8.135.148
--nocheck-binlog-format 不检查日志格式
--nocheck-plan 不检查安全的查询执行计划
-nocheck-replication-filters 不马上检查赋值结果,后续使用 –replicate-check-only输出数据库不一致的信息DIFF结果;
--set-vars innodb_lock_wait_timeout=120
--recursion-method=processlist
--databases=books 指定被检查数据库
-u username
-p password
-h hostaddr
yum install -yhttp://www.percona.com/downloads/percona-release/redhat/latest/percona-release-0.1-4.noarch.rpm
yum install percona-toolkit
pt-table-checksum --nocheck-binlog-format --nocheck-plan--nocheck-replication-filters --replicate=pt.checksums --set-varsinnodb_lock_wait_timeout=120 --recursion-method=processlist --databases books -u'test' -p'jsddwcc' –h192.168.8.134
依然报错
处理报错:
1, 卸载 DBD : yum remove perl-DBD-MySQL;
2, 安装DBD: yum install –y perl-DBD-MySQL;
3, 再次安装工具包: yuminstall percona-toolkit
测试:
证明安装成功;
配置好主备Server:
Master IP: 192.168.8.135
Slave IP: 192.168.8.111
Version: 5.6.36
实例:books
校验:
pt-table-checksum--nocheck-binlog-format --nocheck-plan --nocheck-replication-filters --set-vars innodb_lock_wait_timeout=120--recursion-method=processlist --databases books -u copy -p jsddwcc -h192.168.8.135
参数:
--nocheck-binlog-format 不检查binlog日志,默认yes检查;
--nocheck-plan 检查 query的执行计划(优先选择能够对表进行chunk 分组的索引)
--nocheck-replication-filters 不检查复制过滤器
--set-varsinnodb_lock_wait_timeout=120锁的超时设定, 默认为1
--recursion-method=processlist其参数有四:processlist/hosts/dsn=DSN/no,用来决定查找slave的方式是show full processlist还是show slave hosts还是命令行直接指定还是压根就不准备找从库;
--databases books 指定库名
-u copy 用户名
-p jsddwcc 密码
-h 192.168.8.135 指定MASTER的地址;
TS: 完成检查的日期时间
ERRORS: 检查的时候发生错误和告警的数量
DIFFS: 0表示一致,1表示不一致;当指定--no-replicate-check时,会一直为0,当指定--replicate-check-only会显示不同的信息。
ROWS: 表的行数
CHUNKS: 被检查的表被划分块的数量
SKIPPED: 由于错误或者告警过大,跳过块的数目;
TIME: checksum花费时间
TABLES: 表名
pt-table-checksum会默认将结果写入到表percona.checksums;
所以需要事先创建库和表;
或者如果不用默认的表,也可以自己指定数据库,使用参数:
--replicate=pt.checksums
验证另一个库itdb:
这次检查,可以看到一个error,提示在本机(slave)中没有这个表;
经检查,确实从库中没有该表;
还原生产环境数据库;
1, 准备工作:
将文件上传到Linux服务器,然后解压,gzip -dv backupall_20180125020055.gz
2, 保持主备同步的情况下,在主库执行source /tmp/backupall_20180125020055 还原数据;
3, 可以看到已创建数据库jshop_kepler和light_shop_cms
校验2个库:
经校验,两个库Master和Slave数据一致;
模拟数据不一致:
从库的表light_shop_cms.invoice_model中插入一行数据;
可以看到从库有这行数据,主库没有;
这个时候可以看到有一个不一样DIFFS
pt-table-sync修复数据不一致
pt-table-sync --print --verbose --execute--sync-to-master h=192.168.8.111,P=3306,u=copy,p='jsddwcc'--databases=jshop_kepler;
--print 每次修复前,需要用户确认;
--execute 执行查询,使表具有相同数据;
--sync-to-master Treat the DSN as a slave and sync it to itsmaster
--verbose 输出明细
SLAVE多了一行,会被DELETE;
数据已被修复,现在数据两边恢复一致;
问题:
source恢复后,无法登陆,经分析dump文件,它将系统所有的实例都删除,并重新创建了,导致密码和账号不是我原来的;
在my.cnf中skip-grant-tables跳过密码验证
updatemysql.user password=password(‘newpasswd’) where user=’root’;重置密码
flush logs; 刷新
注释skip-grant-tables 使用验证
service mysqldrestart
使用新密码登陆即可;
备份的时候应该指定database:
mysqldump–databases db_name > bakfile.sql