MySQL-PT数据校验和修复

pt-table-checksum

注意事项(在做检验之前一定要先检查如下配置)

  • 只能指定一个host,必须为主库的IP;
  • 在检查时会向表加S锁
  • 如果master和slave的binlog日志不是STATEMENT格式,要用--no-check-binlog-format选项
  • 运行之前需要从库的同步IO和SQL进程是YES状态
  • 表要有主键索引或唯一键索引(行数不一样 没有主键或者唯一约束,可以校验出来;内容不一样 没有主键或者唯一约束,不能校验出来)
  • 需要一个能同时访问主库和从库的账号
  • slave需要配置了report_host和report_port, 否则可能执行不成功(Diffs cannot be detected because no slaves were found. Please read the --recursion-method documentation for information.)
METHOD       USES
===========  =============================================
processlist  SHOW PROCESSLIST
hosts        SHOW SLAVE HOSTS
cluster      SHOW STATUS LIKE 'wsrep\_incoming\_addresses'
dsn=DSN      DSNs from a table
none         Do not find slaves

常用参数

--nocheck-replication-filters :不检查复制过滤器,建议启用。后面可以用--databases来指定需要检查的数据库。
--no-check-binlog-format      : 不检查复制的binlog模式,要是binlog模式是ROW,则会报错。
--replicate-check-only :只显示不同步的信息。
--recursion-method     :发现从库的方式
--replicate=    :把checksum的信息写入到指定表中,建议直接写到被检查的数据库当中。
--databases=    :指定需要被检查的数据库,多个则用逗号隔开。
--tables=       :指定需要被检查的表,多个用逗号隔开
h=192.168.1.128 :Master的地址
u=root          :用户名
p=123456        :密码
P=3306          :端口

使用案例

授权用户

create database pt;
GRANT SELECT, PROCESS, SUPER, REPLICATION SLAVE ON *.* TO 'pt'@'192.168.79.%' IDENTIFIED BY 'mysql';
grant create,delete ,update,insert,select  on pt.* to 'pt'@'192.168.79.%';

主从校验

在master库操作

  • 注意--recursion-method的取值
pt-table-checksum  --nocheck-replication-filters --no-check-binlog-format --replicate=pt.checksums    --databases=test  h=192.168.79.112,u=percona,p=mysql,P=3311  --max-load  Threads_running=200
pt-table-checksum  --nocheck-replication-filters --no-check-binlog-format --replicate=pt.checksums  --recursion-method=hosts   --databases=test  h=192.168.79.112,u=percona,p=mysql,P=3311  --max-load  Threads_running=200 --chunk-size-limit=8

检查slave上校验信息表

SELECT db, tbl, SUM(this_cnt) AS total_rows, COUNT(*) AS chunks
FROM pt.checksums
WHERE (
 master_cnt <> this_cnt
 OR master_crc <> this_crc
 OR ISNULL(master_crc) <> ISNULL(this_crc))
GROUP BY db, tbl;
+------+------------+-------+------------+-------------+----------------+----------------+----------+----------+------------+------------+---------------------+
| db   | tbl        | chunk | chunk_time | chunk_index | lower_boundary | upper_boundary | this_crc | this_cnt | master_crc | master_cnt | ts                  |
+------+------------+-------+------------+-------------+----------------+----------------+----------+----------+------------+------------+---------------------+
| test | runoob_tbl |     1 |   0.002375 | NULL        | NULL           | NULL           | 14dc5712 |        3 | 14dc5712   |          3 | 2019-06-24 11:34:59 |
| test | tbosc      |     1 |    0.00312 | NULL        | NULL           | NULL           | 5476b1ca |        2 | a32d2ec6   |          3 | 2019-06-24 11:34:59 |
+------+------------+-------+------------+-------------+----------------+----------------+----------+----------+------------+------------+---------------------+
2 rows in set (0.00 sec)

以上的查询结果为空则表示校验的结果一致,主备库数据一致,否者表示校验结果不一致。
可以看到当前节点和master节点数据条目不一样

遇到的问题

pt-table-sync

  • 检测到主数据差异后,使用该工具修复主从不一致的数据
  • 注意权限问题,根据报错赋予相应权限即可
pt-table-sync --replicate=test.checksums h=192.168.79.112,u=percona,p=mysql,P=3311 h=192.168.79.112,u=percona,p=mysql,P=3312  --print

注意双主模式的修复

  • 双主模式master2修复自身数据
pt-table-sync --execute --sync-to-master h=master2,D=db,t=tbl
pt-table-sync --execute --sync-to-master  h=10.25.1.10,u=root,p='xxx' --databases=activity --tables=xxx --max-load thread_runing=20
posted @ 2024-03-25 16:38  数据库小白(专注)  阅读(24)  评论(0编辑  收藏  举报