pt-table-checksum 的使用(2个案列)
- 2019 年 10 月 4 日
- 筆記
pt-table-checksum 的用法案例
原理&注意事项:
1 使用的时候应选择在业务低峰期运行,因为运行的时候会造成表的部分记录被锁定。虽然操作是对trunk逐个进行的,但是它会对每个trunk做SELECT FOR UPDATE,这样做主要是担心做checksum的时候会有写入,所以各个trunk都不适合太大。
2 pt-table-checksum提供了多种手段以确保尽量不会对生产环境造成影响,你可以使用–max-load来指定最大负载,如果达到最大负载,就暂停运行。你也可以设置超时时间innodb_lock_wait_timeout。
3 如果发现有不一致的数据,则可以使用pt-table-sync工具来进行修复。
4 如果表中没有主键或唯一索引,或者没有合适的索引,或者处于其他不适合检查的情况下,那么工具可能会忽略这个表。
5 pt-table-checksum 会忽略掉test库下的表
6 测试发现 pt-table-checksum 3.0.4 版本有bug, 不要用这个版本
参数说明:
–host=主节点的IP地址 –no-check-binlog-format :因为我们的日志用的MIXED格式,所有这里要加上不检查复制的binlog模式 –replicate-check-only :只显示不同步的信息,有时加该参数导致修复后明明数据已经一致了,但是使用pt-table-checksum 还会报不一致,因此不太建议加这个参数 –replicate=percona.checksums :把checksum的信息写入到指定库的指定表中,可以写到test库,或者建议直接写到被检查的数据库当中。 –databases=db1,db2 :指定需要被检查的数据库,多个则用逗号隔开。 –tables= :指定需要被检查的表,多个用逗号隔开[不写就是检查给出的库里涉及到的所有表] –replicate=percona.checksums 存放checksum表的库名 表名 –truncate-replicate-table 每次执行前 先清空下checksum表的内容 –quiet 只列出校验有问题的表
主库:10.1.21.14 端口:3306
从库:10.1.21.13 端口:3306
主库:
create database db1; CREATE TABLE `t1` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) DEFAULT NULL, `createdate` datetime DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; 在主库创建个checksum用的库、账号: CREATE DATABASE IF NOT EXISTS percona; use percona ; CREATE TABLE IF NOT EXISTS checksums ( db CHAR(64) NOT NULL, tbl CHAR(64) NOT NULL, chunk INT NOT NULL, chunk_time FLOAT NULL, chunk_index VARCHAR(200) NULL, lower_boundary TEXT NULL, upper_boundary TEXT NULL, this_crc CHAR(40) NOT NULL, this_cnt INT NOT NULL, master_crc CHAR(40) NULL, master_cnt INT NULL, ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (db,tbl,chunk), INDEX ts_db_tbl(ts,db,tbl) ) ENGINE=InnoDB; GRANT ALL on percona.* to rdpops_checksum@'10.1.20.%' IDENTIFIED BY 'checksum_pass'; GRANT SELECT,LOCK TABLES,PROCESS,SUPER,REPLICATION SLAVE,REPLICATION CLIENT on *.* to rdpops_checksum@'10.1.20.%';
下面是我们的主库数据:
mysql> select * from t1; +----+------+---------------------+ | id | name | createdate | +----+------+---------------------+ | 1 | aa | 2017-02-12 11:00:00 | | 2 | bb | 2017-02-12 11:00:00 | | 3 | cc | 2017-02-12 11:00:00 | +----+------+---------------------+
从库数据:
mysql> select * from t1; +----+------+---------------------+ | id | name | createdate | +----+------+---------------------+ | 1 | aa | 2017-02-12 11:00:00 | | 2 | bb | 2017-02-12 11:00:00 | | 3 | cc | 2017-02-12 11:00:00 | | 4 | dd | 2017-02-12 11:00:00 | +----+------+---------------------+
在主库执行检查操作:
pt-table-checksum h=10.1.21.13,u=rdpops_checksum,p='checksum_pass',P=3306 --databases=testdb --tables=students,scores --replicate=percona.checksums --truncate-replicate-table --nocheck-replication-filters --no-check-binlog-format --replicate-check-only --quiet TS ERRORS DIFFS ROWS DIFF_ROWS CHUNKS SKIPPED TIME TABLE 07-19T14:06:02 0 1 14 226 1 0 0.025 testdb.coc 07-19T14:06:02 0 1 15 0 1 0 0.020 testdb.scores 07-19T14:06:02 0 1 25 0 1 0 0.027 testdb.students
结果显示:
TS :完成检查的时间。
ERRORS :检查时候发生错误和警告的数量。
DIFFS :0表示一致,1表示不一致。当指定–no-replicate-check时,会一直为0,当指定–replicate-check-only会只显示不同的信息。
ROWS :表的行数。
CHUNKS :被划分到表中的块的数目。
SKIPPED :由于错误或警告或过大,则跳过块的数目。
TIME :执行的时间。
TABLE :被检查的表名。
对于一种复制情况下, 主库是10.1.21.13:3306 从库是10.1.21.14:3306 和 10.1.21.15:3307 ,
这样不同的端口,使用pt工具默认的–recursion-method=processlsit就无法识别出3307这个从库。
这时候,只能采用dsn的方式配置从库的连接,如下示例:
在某一个中控机器(例如 10.1.20.110)执行:
GRANT select on percona.* to rdpops_checksum@'10.1.20.%' IDENTIFIED BY 'checksum_pass'; create database percona ; CREATE TABLE `percona`.`dsns` ( `id` int(11) NOT NULL AUTO_INCREMENT, `parent_id` int(11) DEFAULT NULL, `dsn` varchar(255) NOT NULL, PRIMARY KEY (`id`) );
— 将2个从库的信息插入到 percona.dsns里面:
insert into percona.dsns(dsn) values('h=10.1.21.15,P=3307,u=ops_checksum,p=checksum_pass');
insert into percona.dsns(dsn) values('h=10.1.21.14,P=3306,u=ops_checksum,p=checksum_pass');
然后,在中控机器上执行如下命令:
## 之前已经创建好checksum检测用的账号
pt-table-checksum h=10.1.21.13,u=ops_checksum,p='checksum_pass',P=3306
–databases=testdb –replicate=percona.checksums –empty-replicate-table
–nocheck-replication-filters –no-check-binlog-format –replicate-check-only
–recursion-method dsn=h=10.1.20.110,u=ops_checksum,p='checksum_pass',P=3306,D=percona,t=dsns
结果如下,可以看到如下2个实例 都存在异常的地方:
Checking if all tables can be checksummed …
Starting checksum …
Differences on ops_db-21-15.uat
TABLE CHUNK CNT_DIFF CRC_DIFF CHUNK_INDEX LOWER_BOUNDARY UPPER_BOUNDARY
testdb.students 1 -3 1
testdb.teachers 1 0 1
Differences on ops_db-21-14.uat
TABLE CHUNK CNT_DIFF CRC_DIFF CHUNK_INDEX LOWER_BOUNDARY UPPER_BOUNDARY
testdb.coc 1 226 1
testdb.scores 1 -2 1
testdb.students 1 0 1
说明:DSN的部分选项如下:
D DSN表所在的数据库名。
h 从库的host。
p 小写p,从库的密码。当密码包括逗号(,)时,需要使用反斜杠转义。
P 大写P,从库的端口。
S 连接使用的socket文件。
t 存储DSN信息的DSN表名。
u 从库的MySQL用户名。