前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >pt-table-checksum 的使用(2个案列)

pt-table-checksum 的使用(2个案列)

作者头像
保持热爱奔赴山海
发布2019-09-18 09:40:53
1.1K0
发布2019-09-18 09:40:53
举报
文章被收录于专栏:数据库相关数据库相关

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

主库:

代码语言:javascript
复制
 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.%';

下面是我们的主库数据:

代码语言:javascript
复制
    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 |
    +----+------+---------------------+

从库数据:

代码语言:javascript
复制
    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 |
    +----+------+---------------------+

在主库执行检查操作:

代码语言:javascript
复制
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)执行:

代码语言:javascript
复制
 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用户名。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018/11/10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档