06_pt-table-sync 工具解决 MySQL 主从数据不一致

发布于:2025-07-17 ⋅ 阅读:(23) ⋅ 点赞:(0)

06_pt-table-sync 工具解决 MySQL 主从数据不一致

pt-table-sync 是 Percona Toolkit 中用于修复 MySQL 主从数据不一致的同步工具。


一、准备工作

1. 安装 Percona Toolkit

# 安装 Perl 依赖环境(以 CentOS/RHEL 为例)
yum install -y perl-ExtUtils-CBuilder perl-CPAN perl-devel gcc make perl-DBI perl-DBD-MySQL

# 下载 Percona Toolkit 源码
git clone https://github.com/percona/percona-toolkit.git

# 编译安装
cd percona-toolkit
perl Makefile.PL
make && make install

如果执行 pt-query-digest --help 出错提示缺少模块 Digest/MD5.pm,执行:

bash


复制编辑
yum install perl-Digest-MD5 -y

2. 创建 pt_user 用户及权限

建议在主库和从库都创建 pt_user 用户,并赋予必要权限:

CREATE USER 'pt_user'@'%' IDENTIFIED BY '123456';

GRANT SELECT, PROCESS, REPLICATION SLAVE, REPLICATION CLIENT, SUPER ON *.* TO 'pt_user'@'%';
GRANT REPLICATION CLIENT ON *.* TO 'pt_user'@'%';

FLUSH PRIVILEGES;

二、pt-table-checksum 使用要求及说明

1. 主库必须启用 binlog,且 binlog_format 为 ROW

因为 pt-table-checksum 依赖 binlog 来将校验 SQL 同步到从库。


2. 从库信息必须对主库可见

  • 从库必须正常运行复制线程(SHOW SLAVE STATUS\GSlave_IO_RunningSlave_SQL_RunningYes
  • 主库能通过 SHOW SLAVE HOSTS; 命令看到从库信息(包含 Server_idHostPort

3. pt-table-checksum 发现从库的方式

  • 默认通过主库 processlist 查找复制连接
  • 或者通过 SHOW SLAVE HOSTS 查找,从库必须正确配置 report_hostreport_port 变量

4. 如果主库可以发现从库,且 pt_user 权限充足,使用以下命令即可校验:

pt-table-checksum \
  --user=pt_user \
  --password='123456' \
  --host=主库IP \
  --port=主库端口 \
  --databases=数据库名 \
  --replicate=percona.checksums \
  --no-check-binlog-format \
  --no-check-replication-filters \
  --recursion-method=processlist

5. 如果无法自动发现从库(比如 SHOW SLAVE HOSTS 无从库记录,或者从库信息不可达),可用 --recursion-method=dsn 手动指定从库 DSN(主从库均需有对应 pt_user 用户和权限):

pt-table-checksum \
  --user=pt_user \
  --password='123456' \
  --host=主库IP \
  --port=主库端口 \
  --databases=数据库名 \
  --replicate=percona.checksums \
  --no-check-binlog-format \
  --no-check-replication-filters \
  --recursion-method=dsn=h=从库IP,P=从库端口,u=pt_user,p=123456

三、pt_user 对 percona 库的权限(存储校验结果)

pt-table-checksum 默认会在主库创建一个名为 percona 的库和 checksums 表,用于存储校验结果。

请确保 pt_user 有权限创建和操作该库:

CREATE DATABASE IF NOT EXISTS percona;

GRANT ALL PRIVILEGES ON percona.* TO 'pt_user'@'%';

FLUSH PRIVILEGES;

四、总结

  • 确保主库 binlog 格式为 ROW,复制正常
  • 确保主从库 pt_user 用户权限完整
  • 确保主库能通过 SHOW SLAVE HOSTS 或复制连接发现从库
  • 使用 pt-table-checksum 校验数据一致性
  • 如需修复不一致,使用 pt-table-sync(需同时连接主从库)

网站公告

今日签到

点亮在社区的每一天
去签到