各位新朋友~记得先点蓝字关注我哦~
场 景
本文主要以本案例恢复去介绍percona-toolkit工具检查主从数据一致性以及数据恢复的相关功能。
percona-toolkit工具
percona-toolkit工具包含多种组件,这次主要介绍是pt-table-checksum和pt-table-sync两个组件。
pt-table-checksum用于校验主从数据的一致性,其原理是在主库上运行,对同步的表进行checksum,记录下来,然后对比主从中各个表的checksum是否一致,从而判断数据是否一致。
其次该组件需要注意的是:
根据测试,需要一个既能登录主库,也能登录从库的账号 只能指定一个host,必须为主库的IP 在检查时会向表加S锁 如果master和slave的binlog日志不是STATEMENT格式,要用--no-check-binlog-format选项 运行之前需要从库的同步IO和SQL进程是YES状态 表要有主键索引或唯一键索引
恢复数据案例
1、安装pt-table-checksum和pt-table-sync
需要的依赖包shell> yum -y install perl perl-devel perl-Time-HiRes perl-DBI perl-DBD-MySQL perl-Digest-MD5shell> tar zxvf percona-toolkit.tar.gzshell> cd percona-toolkit-3.3.1shell> perl Makefile.PLshell> make && make installshell> vi root/.bash_profilePATH=$PATH:/percona-toolkit-3.3.1/binshell> source root/.bash_profile
2、创建检查用户
shell> create user 'check'@'%' identified by 'check';shell> grant SELECT,PROCESS, SUPER, REPLICATION SLAVE,Replication client ON *.* TO 'check'@'%';赋予testdb测试库的所有权限,便于后面检查内容写入该库shell> grant all on testdb.* to 'check_user'@'%';
3、主从数据一致性检测
创建dns库mysql> CREATE TABLE `dsns` ( `id` int(11) NOT NULL AUTO_INCREMENT, `parent_id` int(11) DEFAULT NULL, `dsn` varchar(255) NOT NULL, PRIMARY KEY (`id`) );mysql> INSERT INTO dsns (parent_id,dsn) values(1, "h=192.168.26.121,u=check,p=check,P=3307");shell> pt-table-checksum --nocheck-binlog-format --nocheck-replication-filters --replicate=testdb.checksums --databases=testdb --host=192.168.26.120 --port=3307 --user=check --password=check --recursion-method=dsn=h=192.168.26.121,D=dns,t=dsnsTS ERRORS DIFFS ROWS DIFF_ROWS CHUNKS SKIPPED TIME TABLE07-05T15:44:38 0 1 256 5 1 0 0.035 testdb.tb107-05T15:44:38 0 0 3 0 1 0 0.028 testdb.tb2
结论:testdb.tb1 的 DIFFS 为 1,主从有5行数据不一致。
| TS | 工具完成表格校验和时的时间戳(不含年份) |
ERRORS | 对表检查时发生的错误和警告数。 |
DIFFS | 0表示一致,1表示不一致。当指定--no-replicate-check时,会一直为0,当指定--replicate-check-only会显示不同的信息。 |
ROWS | 从表中选择并进行校验和的行数。如果使用–where选项,它可能与表中的行数不同。 |
DIFF_ROWS | 每个块的最大差异数。如果一个块有 2 个不同的行,而另一个块有 3 个不同的行,则该值为 3。 |
CHUNKS | 表被划分成的块数 |
SKIPPED | 由于错误或警告或过大,则跳过块的数目。 |
TIME | 执行的时间 |
TABLE | 检查的数据库和表。 |
4、pt-table-sync主从一致性恢复
shell> pt-table-sync --replicate=testdb.checksums --sync-to-master h=192.168.26.121,u=check,p=check,P=3307 --print --executeREPLACE INTO `testdb`.`tb1`(`id`, `a`) VALUES ('1', '1') *percona-toolkit src_db:testdb src_tbl:tb1 src_dsn:P=3307,h=192.168.26.120,p=...,u=check dst_db:testdb dst_tbl:tb1 dst_dsn:P=3307,h=192.168.26.121,p=...,u=check lock:1 transaction:1 changing_src:testdb.checksums replicate:testdb.checksums bidirectional:0 pid:54011 user:root host:localhost.localdomain*/;REPLACE INTO `testdb`.`tb1`(`id`, `a`) VALUES ('2', '2') *percona-toolkit src_db:testdb src_tbl:tb1 src_dsn:P=3307,h=192.168.26.120,p=...,u=check dst_db:testdb dst_tbl:tb1 dst_dsn:P=3307,h=192.168.26.121,p=...,u=check lock:1 transaction:1 changing_src:testdb.checksums replicate:testdb.checksums bidirectional:0 pid:54011 user:root host:localhost.localdomain*/;REPLACE INTO `testdb`.`tb1`(`id`, `a`) VALUES ('3', '3') *percona-toolkit src_db:testdb src_tbl:tb1 src_dsn:P=3307,h=192.168.26.120,p=...,u=check dst_db:testdb dst_tbl:tb1 dst_dsn:P=3307,h=192.168.26.121,p=...,u=check lock:1 transaction:1 changing_src:testdb.checksums replicate:testdb.checksums bidirectional:0 pid:54011 user:root host:localhost.localdomain*/;REPLACE INTO `testdb`.`tb1`(`id`, `a`) VALUES ('4', '4') *percona-toolkit src_db:testdb src_tbl:tb1 src_dsn:P=3307,h=192.168.26.120,p=...,u=check dst_db:testdb dst_tbl:tb1 dst_dsn:P=3307,h=192.168.26.121,p=...,u=check lock:1 transaction:1 changing_src:testdb.checksums replicate:testdb.checksums bidirectional:0 pid:54011 user:root host:localhost.localdomain*/;REPLACE INTO `testdb`.`tb1`(`id`, `a`) VALUES ('5', '5') /*percona-toolkit src_db:testdb src_tbl:tb1 src_dsn:P=3307,h=192.168.26.120,p=...,u=check dst_db:testdb dst_tbl:tb1 dst_dsn:P=3307,h=192.168.26.121,p=...,u=check lock:1 transaction:1 changing_src:testdb.checksums replicate:testdb.checksums bidirectional:0 pid:54011 user:root host:localhost.localdomain*/;
结论:可以从打印结果中看出来数据已经插入了
各项参数解释
参数 | 参数说明 | 备注 |
--[no]check-replication-filters | 不检查复制过滤器,建议启用。后面可以用--databases来指定需要检查的数据库。 | 默认不检查 |
--no-check-binlog-format | 不检查复制的binlog模式,要是binlog模式是ROW,则会报错。 | 默认是监测,使用默认值,如果添加该参数可能导致diff不出来 |
--replicate-check-only | 只显示不同步的信息。 | 开启这个,可以减少输出并且显示不一致的从库主机名 不过这个只是显示已经检测过的不一致信息,并不能显示当前的。 |
--replicate= | 把checksum的信息写入到指定表中,建议直接写到被检查的数据库当中。 | 默认会创建percona库下checksum表 |
-h -u -p -P | masterIP 监测账号 密码 端口 | |
--databases= | 指定需要被检查的数据库,多个则用逗号隔开。 | |
--tables= | 指定需要被检查的表,多个用逗号隔开 | |
--recursion-method | 指定监测从库的模式,默认使用processlist(仅监测3306端口),也可以指定dsn | 多个从库可以这样指定。--recursion-method=dsn=h=host,D=pt,t=dsns D 库名 t 表名 |
--quiet | 安静模式,最小化打印,纸打印错误行 | 与--replicate-check-only类似,但不显示从库信息 |
参数 | 参数说明 | 备注 |
--replicate= | 指定通过pt-table-checksum得到的表 | 默认会创建percona库下checksum表时不需要指定 |
--databases= | 指定执行同步的数据库 | 在只修复指定的库时使用 |
--tables= | 指定需要被修复的表,多个用逗号隔开 | |
--sync-to-master | 指定一个DSN,即从的IP | 会通过show processlist或show slave status 去自动的找主。报错找不到主库时使用 |
h= u= p= | 服务器地址,账号,密码 | 命令里有2个ip,第一次出现的是Master的地址,第2次是Slave的地址。 |
打印修复的sql语句 | 只打印不执行。 | |
--exec 或 --execute | 执行修复 | |
--algorithms=c | 指定修复算法 | default Chunk,Nibble,GroupBy,Stream 在报错算法问题的时候需要指定算法 |
--charset= | 指定默认字符集 | 如果数据中包含中文不指定次字符集的话修复不成功 |
美创是国内领先的数据库服务提供商。服务团队拥有PG ACED 1名、Oracle&PG ACE 3人、DSI智库专家5名、DSMM测评师7名、OCM 20余人、数十名Oracle OCP、MySQL OCP、TDSQL TCP、OceanBase OBCP、TiDB PTCP、达梦 DCP、人大金仓、红帽RHCA、中间件weblogic、tuxedo、CISP-DSG、CISSP、CDGA、CDPSE、CZTP、CDSP等认证人员,著有《DBA攻坚指南:左手Oracle,右手MySQL》,《Oracle数据库性能优化方法和最佳实践》,《Oracle内核技术揭秘》,《Oracle DBA实战攻略》等多本数据库书籍。运维各类数据库合计5000余套,精通Oracle、MySQL、SQLServer、DB2、PostgreSQL、MongoDB、Redis、TDSQL、OceanBase、达梦、人大金仓等主流商业和开源数据库。美创拥有完善的运维体系和人员培养体系,并同时提供超融合、私有云整体服务解决方案、数据安全咨询及运营服务方案等,已为金融、政府、企业、能源等多个行业的客户提供量身定制的各类服务,赢得了客户的高度赞誉和广泛认可。






