pt-table-checksum和pt-table-sync使用方法详解

本文详细介绍了如何使用pt-table-checksum工具检查并修复MySQL主从服务器间的数据一致性问题,包括安装、命令执行、结果解析及pt-table-sync修复步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    pt-table-checksum是一个很好用的用来检查mysql数据库中主服务器和备服务器数据是否一致的好工具,通常可以在主服务器上面运行下面的语句:
  pt-table-checksum --replicate = test.checksums <master_host>

    通过上述语句可以很好的检查主备的数据是否一致。该命令的原理就是检查指定需要检查的库或者表,并且把结果放到test.checksums中。然后当从库执行完毕的时候,就可以比较主库与从库的不同了。

    在我的服务器上主库的地址是192.168.1.106,备库上是192.168.1.104,现在已经主从同步成功。表中一共有2560跳记录,我们假设让其中id为1300的记录不同。

    现在在主库上指向pt-table-checksum命令,对于如何安装这个命令,其中有篇文章已经专门介绍过了。执行如下命令:  

 /usr/local/bin/pt-table-checksum --replicate=test.checksums --no-check- binlog-format --databases=test h=192.168.1.106,u=mysql,p=123456
    注意:要让上述命令生效,必须要确保从库已经连接到主库,并且从库的io和sql线程都为yes。其中--replicate就是要把数据插入到的表中,--no-check-binlog-format不对binlog的格式进行检查,--databases=就是要对那个数据库进行检查,当然也可以用--tables对其具体的表进行检查,h是主服务器的地址,u是同步的账号,p是同步的密码

     执行完成以后可以看到在user表中diffs的值为1,表明这个表中有数据是不同步。然后切换到从库,也就是192.168.1.104的这台机子上执行如下的sql语句:   

  SELECT db, tbl, SUM(this_cnt) AS total_rows, COUNT(*) AS chunks FROM test.checksums WHERE ( master_cnt <> this_cnt OR master_crc <> this_crc OR ISNULL(master_crc) <> ISNULL(this_crc)) GROUP BY db, tbl;
    会出来下面的结果:
+------+------+------------+--------+
| db   | tbl  | total_rows | chunks |
+------+------+------------+--------+
| test | user |       1000 |      1 |
+------+------+------------+--------+

   上面this_cns=1000的数据记录区有数据是不同步的,我们在从库上执行:
sleect * from checksums\G;找到this_cnt等于1000的值
*************************** 2. row ***************************
            db: test
           tbl: user
         chunk: 1
    chunk_time: 0.065049
   chunk_index: PRIMARY
lower_boundary: 1
upper_boundary: 1374
      this_crc: ab2b7998
      this_cnt: 1000
    master_crc: e438fc61
    master_cnt: 1000
            ts: 2013-08-18 19:27:31

   看到了吗?this_crc的值与master_crc的值是不相等的,说明在主键为1到1374这个区域有数据是不同的,给我们上面指定的id为1300的数据完全符合。

   下面来看下如何通过pt-table-sync修复主备数据的不一致

   主库上id为1300的数据为
  

   备库上id为1300的数据为

  

 
    执行如下的语句:
 /usr/local/bin/pt-table-sync --replicate=test.checksums h=192.168.1.106,u=mysql,p='123456' h=192.168.1.104,u=mysql,p='123456' --print
REPLACE INTO `test`.`user`(`id`, `name`) VALUES ('1300', '123123') /*percona-toolkit src_db:test src_tbl:user src_dsn:h=192.168.1.106,p=...,u=mysql dst_db:test dst_tbl:user dst_dsn:h=192.168.1.104,p=...,u=mysql lock:1 transaction:1 changing_src:test.checksums replicate:test.checksums bidirectional:0 pid:1655 user:root host:slave*/;

    test.checksums就是我们通过pt-table-checksums得到的表,前面的h,u,p是主库的信息,后面是备库的信息,--print是把要修改的sql语句打印出来。
然后在备库的user表中执行REPLACE INTO `test`.`user`(`id`, `name`) VALUES ('1300', '123123'),就把备库的数据和主库一致了。

### 关于 `pt-table-checksum` 的使用方法、参数说明及教程 #### 工具概述 `pt-table-checksum` 是 Percona Toolkit 中的一个工具,专门设计用来检测 MySQL 主从复制环境中可能存在的数据不一致问题。该工具通过计算并比较主服务器从服务器上的表校验来实现这一目标[^4]。 #### 安装准备 为了能够顺利执行此命令,需事先完成 Percona Toolkit 的安装工作。值得注意的是,Percona Toolkit 更适用于 Linux 平台;对于 Windows 用户而言,则建议借助 WSL (Windows Subsystem for Linux) 来搭建相应的运行环境。 #### 基本语法结构 以下是启动 `pt-table-checksum` 进行单个数据库表的数据一致性检验时所使用的典型命令格式: ```bash pt-table-checksum \ h=<主机地址>,u=<用户名>,p='<密码>',P=<端口号> \ --tables=<指定库名>.<指定表名> \ --replicate=<用于存储中间结果的目标库名>.<目标表名> ``` 具体到给定的例子中,完整的调用形式如下所示: ```bash pt-table-checksum \ h=10.192.168.51,u=checksum,p='123456',P=3306 \ --tables=test.t1 \ --replicate=percona_schema.checksums \ --no-check-binlog-format \ --nocheck-replication-filters \ --recursion-method dsn=t=percona_schema.dsns,h=10.192.168.52,u=checksum,p='123456',P=3306 ``` 上述指令不仅指定了待验证的具体表格位置以及辅助信息保存路径,还额外配置了一些可选参数以优化性能表现或规避潜在风险。例如,“--no-check-binlog-format”选项告知程序无需检查二进制日志格式是否匹配,而“--nocheck-replication-filters”则允许忽略任何已设置好的过滤规则[^1]。 #### 参数详解 - `-h, --host`: 指明目标 MySQL 实例所在的 IP 地址; - `-u, --user`: 登录账户名称; - `-p, --password`: 对应用户的访问凭证; - `-P, --port`: 数据库监听的服务端口,默认情况下为 3306; - `--tables`: 明确指出需要参与同步操作的对象范围,支持多个逗号分隔的组合表达方式; - `--replicate`: 设定一个专用的空间来暂存由 checksum 计算得出的结果集; - `--no-check-binlog-format`: 跳过对 binlog 格式的兼容性测试环节; - `--nocheck-replication-filters`: 不考虑现有的复制链路中存在的各种筛选条件限制; - `--recursion-method`: 当面对多层级联架构下的复杂场景时,提供了一种递归遍历机制以便更全面地覆盖所有节点[^2]。 #### 执行流程解析 当 `pt-table-checksum` 接收到有效的输入之后,便会按照预定逻辑依次开展以下几个阶段的工作: 1. 向源端发起请求读取原始记录,并据此生成唯一的 hash value; 2. 将这些散列值连同必要的元数据一并发往下游组件,在那里重复相同的处理过程; 3. 收集来自各个分支反馈回来的消息包,从中提取出关键字段做对比分析; 4. 输出最终报告文件,其中包含了发现差异的位置及其详情描述[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值