简介
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-host
和report-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