mysql中如何运用pt-table-checksum和pt-table-sync
发布时间:2021-12-24 13:25:13 所属栏目:MySql教程 来源:互联网
导读:这篇文章给大家分享的是有关mysql中如何使用pt-table-checksum和pt-table-sync的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 pt-table-checksum和pt-table-sync是percona-toolkit工具中的功能,用来检测主从数据一致性和修复
这篇文章给大家分享的是有关mysql中如何使用pt-table-checksum和pt-table-sync的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 pt-table-checksum和pt-table-sync是percona-toolkit工具中的功能,用来检测主从数据一致性和修复主从不一致。 下面通过一组实验学习这两个功能的使用 1、主库创建表并插入数据 CREATE TABLE `NewTable` ( `id` int(8) NULL , `name` varchar(32) NULL , PRIMARY KEY (`id`) ) ; insert into newtable values(1,'leo'); insert into newtable values(2,'mike'); insert into newtable values(3,'jack'); 2、从库执行下面语句,让主从不一致 insert into newtable values(4,'lucy'); insert into newtable values(5,'petter'); update newtable set name='john' where id =1 3 rows in set (0.00 sec) 从库: mysql> select * from test.newtable; +----+--------+ | id | name | +----+--------+ | 1 | john | | 2 | mike | | 3 | jack | | 4 | lucy | | 5 | petter | +----+--------+ 5 rows in set (0.00 sec) 4、pt-table-checksum参数介绍、使用 --port= 主库端口 --host= 主库IP --databases= 校验的数据库 --tables= 校验 的表名,只指定数据库不指定表名,校验数据库下所有表 --user= 用户名(该用户在从库上也要有,同时需要权限) 校验: [root@trcloud ~]# pt-table-checksum --port=3306 --host=192.168.129.15 --databases=test --tables=newtable --user=root --password='123456' --replicate=test.check --no-check-binlog-format --no-check-replication-filters TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE 12-13T13:44:07 0 1 3 1 0 0.059 test.newtable 注:检查的时候会向表加S锁 TS: 完成的检查时间 ERRORS:检查时候发生的错误和告警数量 DIFFS: 0表示一致,1表示不一致 ROWS: 表行数 CHUNKS:被划分到表中的块数量 SKIPPED: 由于错误跳过的数目 TIME: 执行时间 TABLE: 表名 5、使用pt-table-sync修复不一致 --replicate= 指定pt-table-checksum得到的表 h= 主库IP u= 用户名 p= 密码 --execute 执行修复 --print 打印出sql语句 --help 更多更详细的参数请见--help帮助文档 [root@trcloud ~]# pt-table-sync --replicate=test.check h=192.168.129.15,u=root,p='123456' --execute --print DELETE FROM `test`.`newtable` WHERE `id`='4' LIMIT 1 /*percona-toolkit src_db:test src_tbl:newtable src_dsn:h=192.168.129.15,p=...,u=root dst_db:test dst_tbl:newtable dst_dsn:h=172.30.249.5,p=...,u=root lock:1 transaction:1 changing_src:test.check replicate:test.check bidirectional:0 pid:19211 user:root host:trcloud*/; DELETE FROM `test`.`newtable` WHERE `id`='5' LIMIT 1 /*percona-toolkit src_db:test src_tbl:newtable src_dsn:h=192.168.129.15,p=...,u=root dst_db:test dst_tbl:newtable dst_dsn:h=172.30.249.5,p=...,u=root lock:1 transaction:1 changing_src:test.check replicate:test.check bidirectional:0 pid:19211 user:root host:trcloud*/; REPLACE INTO `test`.`newtable`(`id`, `name`) VALUES ('1', 'leo') /*percona-toolkit src_db:test src_tbl:newtable src_dsn:h=192.168.129.15,p=...,u=root dst_db:test dst_tbl:newtable dst_dsn:h=172.30.249.5,p=...,u=root lock:1 transaction:1 changing_src:test.check replicate:test.check bidirectional:0 pid:19211 user:root host:trcloud*/; 从打印的sql来看,如果从库数据多了使用delete删除,其他情况修复主从不一致使用的是REPLACE INTO。所以表上一定要有主键,不然不仅会报错,也会导致主从同步失败(因为在从库执行REPLACE INTO执行不过去) (编辑:上海站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |