使用 pt-table-sync 修复MySQL主从数据不一致

Posted by Sunday on 2018-06-25

简介

pt-table-checksum是percona-toolkit系列工具中的一个, 可以用来检测主、 从数据库中数据的一致性。其原理是在主库上运行, 对同步的表进行checksum, 记录下来
在MySql主从复制架构的应用中,长时间运行的DB出现各种异常之后,可能会有主备不一致的情况产生,影响正常的业务。

pt-table-checksum用于校验主从数据的一致性,而pt-table-sync用于同步MySQL表之间的数据,它可以同步单个表,也可以同步整个库,但是不同步表结构、索引、或任何其他模式对象。

官方文档

https://www.percona.com/doc/percona-toolkit/3.0/installation.html
https://www.percona.com/doc/percona-repo-config/apt-repo.html

环境

操作系统:Ubuntu 16.04
Mysql版本:MySQL 5.7.18-15
主库:192.168.10.36
从库:192.168.10.37

安装(在主库操作)

1
2
3
4
wget https://repo.percona.com/apt/percona-release_0.1-4.$(lsb_release -sc)_all.deb
sudo dpkg -i percona-release_0.1-4.$(lsb_release -sc)_all.deb
sudo apt-get update
sudo apt-get install percona-toolkit

pt-table-checksum

场景:端口3306,只检查某一个库的关键表,一主一从,同网段复制,pt_checksums@’192.168.10.%’具备该有的权限(主从都需要设置)

1
2
GRANT SELECT,INSERT, DELETE,PROCESS,SUPER,REPLICATION SLAVE on *.* to pt_checksums@'192.168.10.%' IDENTIFIED BY 'BHJ1jRP79dgZ2LHd5LM3ytG5ZyjMi6';
GRANT ALL PRIVILEGES on percona.* to pt_checksums@'192.168.10.%' IDENTIFIED BY 'BHJ1jRP79dgZ2LHd5LM3ytG5ZyjMi6';

只检测xmusic单个数据库(在主库操作)

1
2
3
4
5
6
7
8
9
10
11
12
13
pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --databases=xmusic --replicate=percona.checksums h=192.168.10.36,u=pt_checksums,p='BHJ1jRP79dgZ2LHd5LM3ytG5ZyjMi6',P=3306

Checking if all tables can be checksummed ...
Starting checksum ...
TS ERRORS DIFFS ROWS DIFF_ROWS CHUNKS SKIPPED TIME TABLE
06-25T15:41:59 0 0 9 0 1 0 0.236 xmusic.star_archives
06-25T15:41:59 0 0 3 0 1 0 0.337 xmusic.star_categories
06-25T15:41:59 0 0 9 0 1 0 0.153 xmusic.star_category
06-25T15:42:00 0 0 8 0 1 0 0.246 xmusic.star_news
06-25T15:42:00 0 0 0 0 1 0 0.613 xmusic.star_occupation
06-25T15:42:00 0 0 160 0 1 0 0.336 xmusic.tags
06-25T15:42:02 0 1 10 0 1 0 1.284 xmusic.type
06-25T15:42:02 0 0 102 0 1 0 0.437 xmusic.users

如果是首次运行,会在主库自动创建 percona.checksums 表。

执行时显示的结果参数说明

  • TS :完成检查的时间戳。
  • ERRORS :检查时候发生错误和警告的数量。
  • DIFFS :0表示一致,1表示不一致。当指定--no-replicate-check时,会一直为0,当指定--replicate-check-only会显示不同的信息
  • ROWS :比对的表行数。
  • CHUNKS :被划分到表中的块的数目。
  • SKIPPED :由于错误或警告或过大,则跳过块的数目。
  • TIME :执行的时间。
  • TABLE :被检查的表名

命令选项

--nocheck-replication-filters:不检查复制过滤器,建议启用。后面可以用--databases来指定需要检查的数据库。
--no-check-binlog-format :不检查复制的binlog模式,要是binlog模式是ROW,则会报错。
--replicate-check-only:只显示不同步的信息。(注意:要谨慎使用,此参数不会生成新的checksums数据,只会根据checksums表已经有的数据来显示。)
--replicate=:把checksum的信息写入到指定表中,建议直接写到被检查的数据库当中。
--databases=:指定需要被检查的数据库,多个则用逗号隔开。
--tables=:指定需要被检查的表,多个用逗号隔开

pt-table-checksum 其工作原理是通过计算每个表的散列值 并将计算过程在服务器上重放从而拿到主从各自的散列值做比较
但是pt-table-checksum 不是直接计算整个表的散列值,而是分块计算避免服务器长时间延时,因此在计算散列过程重放时是基于statement 不能基于row

只检测xmusic.type单张表

1
2
3
4
5
6
7
pt-table-checksum h=192.168.10.36,u=pt_checksums,p='BHJ1jRP79dgZ2LHd5LM3ytG5ZyjMi6',P=3306 --databases=xmusic --tables=type \
--nocheck-replication-filter --no-check-binlog-format

Checking if all tables can be checksummed ...
Starting checksum ...
TS ERRORS DIFFS ROWS DIFF_ROWS CHUNKS SKIPPED TIME TABLE
06-25T15:54:26 0 1 10 0 1 0 1.143 xmusic.type

pt-table-sync

pt-table-sync可以高效的同步MySQL表之间的数据,他可以做单向和双向同步的表数据。他可以同步单个表,也可以同步整个库。它不同步表结构、索引、或任何其他模式对象。所以在修复一致性之前需要保证他们表存在。

执行前可以使用--dry-run或--print打印下不一致信息

1
pt-table-sync --replicate=percona.checksums h=192.168.10.36,u=pt_checksums,p='BHJ1jRP79dgZ2LHd5LM3ytG5ZyjMi6',P=3306 h=192.168.10.37,u=pt_checksums,p='BHJ1jRP79dgZ2LHd5LM3ytG5ZyjMi6',P=3306 --print
1
pt-table-sync --replicate=percona.checksums h=192.168.10.36,u=pt_checksums,p='BHJ1jRP79dgZ2LHd5LM3ytG5ZyjMi6',P=3306 h=192.168.10.37,u=pt_checksums,p='BHJ1jRP79dgZ2LHd5LM3ytG5ZyjMi6',P=3306 --execute

命令选项

1
2
3
4
--replicate:指定通过pt-table-checksum得到的表,这2个工具差不多都会一直用。
--databases:指定执行同步的数据库,多个用逗号隔开。
--tables:指定执行同步的表,多个用逗号隔开。
--sync-to-master:指定一个DSN,即从的IP,他会通过show processlist或show slave status 去自动的找主。

http://m.itboth.com/d/NNbqya/mysql
http://seanlook.com/2015/12/29/mysql_replica_pt-table-checksum/