利用pt-table-checksum和pt-table-sync检查和修复MySQL主从同步一致

简介

pt-table-checksum可以用来检查主从数据是否一致
pt-table-sync可以用来修复不一致的主从数据

常用参数

通用参数

连接相关

主库连接方式

和mysql客户端连接方式相同,只是--password需要直接在后面接密码,如果要交互式输入密码的话需要使用--ask-pass选项

--host,h
--port,P
--socket,S
--user,u
--password,p
--ask-pass

筛选相关参数

带regex的表示使用正则表达式进行筛选,需要使用引号括起来。
不带regex的表示匹配指定的信息,多个信息之间使用,分隔。

# 指定库表
--databases=db1,db2 
--tables=t1,t2
--databases-regex="mysql*"
--tables-regex="table*"
# 忽略库表
--ignore-databases=mysql,sys
--ignore-tables
--ignore-databases-regex
--ignore-tables-regex
# 忽略存储引擎
--ignore-engines
  默认值 FEDERATED,MRG_MyISAM
--ignore-columns

其他共同参数

--replicate
指定检查信息记录位置

pt-table-checksum 特定参数

发现从库的方式

--recursion-method 指定发现从库的方式

  • processlist
    当主库的端口为默认3306时,默认使用该选项,通过SHOW PROCESSLIST获取从库的地址和端口
    当从库端口与主库不同,或者从库连接时使用了DNS解析,但是执行操作的机器无法解析时会出现问题,无法正确发现从库
  • hosts
    当从库不是默认的3306端口时,默认使用该选项,通过SHOW SLAVE HOST获取从库的地址和端口
    注意:需要在从库上设置report-hostreport-port才能正确获取从库信息,否则只能获取端口号,从库的host值为空,也会出现问题。
  • cluster
    通过SHOW STATUS LIKE 'wsrep\_incoming\_addresses'获取从库信息
  • dsn=DSN
    通过在表中指定DSN信息来获取从库的信息,需要事先创建DSN表并且在表中记录从库的连接信息
# 创建DSN表 
# DSN表可以在任意可连接的数据库中创建,不一定在要检查的数据库中
# --recursion-method dsn=h=host,D=percona,t=dsns
CREATE TABLE `dsns` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `parent_id` int(11) DEFAULT NULL,
  `dsn` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
);
# 在DSN表中插入从库信息
# 账号密码等不需要使用引号括起来
INSERT INTO dsns (dsn) values (h=replica_host,u=repl_user,p=repl_pass)
  • none
    不发现从库

--slave-user
连接从库的用户名,当从库和主库账号不一致时需要设置,用户必须在所有从库身上存在
--slave-password
连接从库的密码,当从库和主库密码不一致时需要设置,密码必须在所有从库上相同

--[no]check-binlog-format
检查所有从库的binlog_format是否一致,当binlog_format不为STATEMENT时,需要使用--nocheck-binlog-format
--[no]check-replication-filters
当复制存在过滤器时,需要使用--nocheck-replication-filters

pt-table-sync 特定参数

--print
打印修复sql
--execute
执行修复sql
--sync-to-master
当连接从库时,使用该选项

示例

# 通过processlist检查主从是否一致 连接主库
pt-table-checksum h='192.168.0.12',u='user',p='password',P=3306 --databases='pandora_auth' --no-check-binlog-format --nocheck-plan --recursion-method=processlist

# 通过dsns指定从库地址检查主从是否一致  方便起见,可以把结果写入到一个文件
pt-table-checksum h='192.168.0.12',u='temp0923',p='password',P=3306  --no-check-binlog-format --nocheck-plan --recursion-method=dsn=h=10.250.5.230,D=test,t=dsns,u=user,p=password > 192.168.0.12.log
# 然后从文件中提取不一致的表名
awk -F " " '$3>0{print $3,$9}' 192.168.0.12.log

# 查看修复要执行的语句-连接主库
pt-table-sync  h='IP',u='user',p='password',P=port  --print   --replicate='percona.checksums' --databases=database --tables=table >ip_port_repair.sql

# 执行修复语句-连接从库
pt-table-sync h='IP',u='user',p='password',P=port  --print --replicate=percona.checksums --sync-to-master --databases=database --tables=table

# 直接同步某个表数据 不需要主从关系 前面是源数据地址,后面是同步到的地址,在后面的地址上执行语句
pt-table-sync  h='soure_ip',u='user',p='password',P=port  h='result_ip',u='user',p='password',P=port --print --verbose  --tables tables  > result_ip.sql

你可能感兴趣的:(利用pt-table-checksum和pt-table-sync检查和修复MySQL主从同步一致)