文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何使用percona-toolkit工具检查及修复MySQL数据库的主从不一致

2024-04-02 19:55

关注

下文主要给大家带来如何使用percona-toolkit工具检查及修复MySQL数据库的主从不一致,希望这些内容能够带给大家实际用处,这也是我如何使用percona-toolkit工具检查及修复MySQL数据库的主从不一致编辑这篇文章的主要目的。好了,废话不多说,大家直接看下文吧。

如何使用percona-toolkit工具检查及修复MySQL数据库的主从不一致

pt-table-checksum是Percona-Toolkit的组件之一,用于检测MySQL主、从库的数据是否一致。其原理是在主库执行基于statement的sql语句来生成主库数据块的checksum,把相同的sql语句传递到从库执行,并在从库上计算相同数据块的checksum,最后,比较主从库上相同数据块的checksum值,由此判断主从数据是否一致。检测过程根据唯一索引将表按row切分为块(chunk),以为单位计算,可以避免锁表。检测时会自动判断复制延迟、 master的负载, 超过阀值后会自动将检测暂停,减小对线上服务的影响。

pt-table-checksum默认情况下可以应对绝大部分场景,官方说,即使上千个库、上万亿的行,它依然可以很好的工作,这源自于设计很简单,一次检查一个表,不需要太多的内存和多余的操作;必要时,pt-table-checksum 会根据云服务器负载动态改变chunk大小,减少从库的延迟。

为了减少对数据库的干预,pt-table-checksum还会自动侦测并连接到从库,当然如果失败,可以指定--recursion-method选项来告诉从库在哪里。它的易用性还体现在,复制若有延迟,在从库checksum会暂停直到赶上主库的计算时间点(也通过选项--设定一个可容忍的延迟最大值,超过这个值也认为不一致)。

2、工作过程

3、环境

IPPort主机名作用
192.168.1.1013306node1master
192.168.1.1023306node2slave

4、下载

打开官网:https://www.percona.com/downloads/percona-toolkit/LATEST/
选择软件版本:Version,一般默认最新版即可;
选择系统版本:Software,也可以源码编译;我的CentOS6
系统架构:Hardware;我的64位;

我的下载为:
https://www.percona.com/downloads/percona-toolkit/3.0.13/binary/redhat/6/x86_64/percona-toolkit-debuginfo-3.0.13-1.el6.x86_64.rpm
https://www.percona.com/downloads/percona-toolkit/3.0.13/binary/redhat/6/x86_64/percona-toolkit-3.0.13-1.el6.x86_64.rpm

5、安装

yum install percona-toolkit-3.0.13-1.el6.x86_64.rpm -y
yum install percona-toolkit-debuginfo-3.0.13-1.el6.x86_64.rpm -y

查看安装的文件:

[root@node1 ~]# rpm -ql percona-toolkit
/usr/bin/pt-align
/usr/bin/pt-archiver
/usr/bin/pt-config-diff
/usr/bin/pt-deadlock-logger
/usr/bin/pt-diskstats
/usr/bin/pt-duplicate-key-checker
/usr/bin/pt-fifo-split
/usr/bin/pt-find
/usr/bin/pt-fingerprint
/usr/bin/pt-fk-error-logger
/usr/bin/pt-heartbeat
/usr/bin/pt-index-usage
/usr/bin/pt-ioprofile
/usr/bin/pt-kill
/usr/bin/pt-mext
/usr/bin/pt-mongodb-query-digest
/usr/bin/pt-mongodb-summary
/usr/bin/pt-mysql-summary
/usr/bin/pt-online-schema-change
/usr/bin/pt-pmp
/usr/bin/pt-query-digest
/usr/bin/pt-secure-collect
/usr/bin/pt-show-grants
/usr/bin/pt-sift
/usr/bin/pt-slave-delay
/usr/bin/pt-slave-find
/usr/bin/pt-slave-restart
/usr/bin/pt-stalk
/usr/bin/pt-summary
/usr/bin/pt-table-checksum     # 校验数据一致性;
/usr/bin/pt-table-sync         # 修复不一致数据;
/usr/bin/pt-table-usage
/usr/bin/pt-upgrade
/usr/bin/pt-variable-advisor
/usr/bin/pt-visual-explain
... ...
[root@node1 ~]#

6、创建演示数据

6.1、主库master:

root@node1 10:56:  [(none)]> create database pt_check;
Query OK, 1 row affected (0.04 sec)

root@node1 10:57:  [(none)]> use pt_check
Database changed
root@node1 10:58:  [pt_check]> create table test1(id int auto_increment primary key,name varchar(20) not null);
Query OK, 0 rows affected (0.86 sec)

root@node1 11:03:  [pt_check]> insert into test1 values(null,'will');
Query OK, 1 row affected (0.00 sec)

root@node1 11:03:  [pt_check]> insert into test1 values(null,'jim');
Query OK, 1 row affected (0.00 sec)

root@node1 11:03:  [pt_check]> insert into test1 values(null,'tom');
Query OK, 1 row affected (0.05 sec)

root@node1 11:03:  [pt_check]> select * from pt_check.test1;
+----+------+
| id | name |
+----+------+
|  1 | will |
|  2 | jim  |
|  3 | tom  |
+----+------+
3 rows in set (0.00 sec)

root@node1 11:04:  [pt_check]>

6.2、从库slave:

root@node1 11:03:  [pt_check]> select * from pt_check.test1;
+----+------+
| id | name |
+----+------+
|  1 | will |
|  2 | jim  |
|  3 | tom  |
+----+------+
3 rows in set (0.00 sec)

root@node1 11:04:  [pt_check]> delete from pt_check.test1 where id='2';
Query OK, 1 row affected (0.02 sec)

root@node2 12:23:  [(none)]> select * from pt_check.test1;
+----+------+
| id | name |
+----+------+
|  1 | will |
|  3 | tom  |
+----+------+
2 rows in set (0.00 sec)

root@node2 12:23:  [(none)]>

6.3、创建校验用户

root@node1 12:28:  [pt_check]> GRANT CREATE,INSERT,SELECT,DELETE,UPDATE,LOCK TABLES,PROCESS,SUPER,REPLICATION SLAVE ON *.* TO 'ptuser'@'192.168.1.101' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.00 sec)

root@node1 12:29:  [pt_check]>  flush privileges;
Query OK, 0 rows affected (0.00 sec)

root@node1 12:29:  [pt_check]> select Host,User  from mysql.user;
+----------------+---------------+
| Host           | User          |
+----------------+---------------+
| localhost      | root          |
| localhost      | mysql.session |
| localhost      | mysql.sys     |
| 172.16.156.%   | rep           |
| %              | java          |
| 192.168.1.101 | ptuser        |
+----------------+---------------+
9 rows in set (0.00 sec)

root@node1 12:29:  [pt_check]>
root@node2 12:48:  [(none)]> select Host,User  from mysql.user;
+----------------+---------------+
| Host           | User          |
+----------------+---------------+
| localhost      | root          |
| localhost      | mysql.session |
| localhost      | mysql.sys     |
| 172.16.156.%   | rep           |
| %              | java          |
| 192.168.1.101 | ptuser        |
+----------------+---------------+
8 rows in set (0.00 sec)

root@node2 12:48:  [(none)]>

7、pt-table-checksum校验

7.1、pt-table-checksum参数解释

我比较倾向使用DSN的方式。这个dsns表只需要在执行 pt-table-checksum 命令的云服务器上能够访问到就行。这里纠正一个认识,网上很多人说 pt-table-checksum 要在主库上执行,其实不是的,我的mysql实例比较多,只需在某一台云服务器上安装percona-toolkit,这台服务能够同时访问主库和从库就行了。具体用法见后面实例。

7.2、在主库上执行数据检查命令

[root@node1 ~]# pt-table-checksum --nocheck-replication-filters --replicate=test.checksums --databases=pt_check --tables=test1 h=192.168.1.101,u=ptuser,p=123456,P=3306
Checking if all tables can be checksummed ...
Starting checksum ...
Replica node2 has binlog_format ROW which could cause pt-table-checksum to break replication.  Please read "Replicas using row-based replication" in the LIMITATIONS section of the tool's documentation.  If you understand the risks, specify --no-check-binlog-format to disable this check.
[root@node1 ~]#

从库node2的bbinlog日志为ROW,这可能导致pt-table-checksum中断复制。可以指定--no-check-binlog-format以禁用此检查。

[root@node1 ~]# pt-table-checksum --nocheck-replication-filters --replicate=test.checksums --databases=pt_check --tables=test1 h=192.168.1.101,u=ptuser,p=123456,P=3306 --no-check-binlog-format
Checking if all tables can be checksummed ...
Starting checksum ...
            TS ERRORS  DIFFS     ROWS  DIFF_ROWS  CHUNKS SKIPPED    TIME TABLE
02-19T18:23:22      0      1        3          0       1       0   0.045 pt_check.test1
[root@node1 ~]#
表示说明:

看到已经检查出主从数据有不一致了,DIFFS下的值为1,怎么不一致呢? 通过指定--replicate=test.checksums 参数,就说明把检查信息都写到了checksums表中

7.3、master的test.checksums表:

root@node1 09:19:  [(none)]> select * from test.checksums \G
*************************** 1. row ***************************
            db: pt_check
           tbl: test1
         chunk: 1
    chunk_time: 0.005212
   chunk_index: NULL
lower_boundary: NULL
upper_boundary: NULL
      this_crc: b9a54161
      this_cnt: 3                   # 本机 3行数据
    master_crc: b9a54161
    master_cnt: 3                   # master 3行数据
            ts: 2019-02-20 09:18:01
1 row in set (0.00 sec)

root@node1 09:19:  [(none)]>

7.4、slave的test.checksums表:

root@node2 09:20:  [(none)]> select * from test.checksums \G
*************************** 1. row ***************************
            db: pt_check
           tbl: test1
         chunk: 1
    chunk_time: 0.005212
   chunk_index: NULL
lower_boundary: NULL
upper_boundary: NULL
      this_crc: d49ddeb7
      this_cnt: 2                   # 本机 2行数据
    master_crc: b9a54161
    master_cnt: 3                   # master 3行数据
            ts: 2019-02-20 09:18:01
1 row in set (0.01 sec)

root@node2 09:20:  [(none)]>

8、pt-table-sync修复

8.1、打印数据的不同之处

master库用pt-table-sync命令和--print选项打印出master下的check_sum.test1和slave库的check_sum.test1的不一致的数据,如下:

[root@node1 ~]# pt-table-sync --replicate=test.checksums h=192.168.1.101,u=ptuser,p=123456,P=3306 h=192.168.1.102,u=ptuser,p=123456,P=3306 --print
REPLACE INTO `pt_check`.`test1`(`id`, `name`) VALUES ('2', 'jim') ;
[root@node1 ~]#
--replicate=    :指定通过pt-table-checksum得到的表.
--databases=    : 指定执行同步的数据库,多个用逗号隔开。
--tables=       :指定执行同步的表,多个用逗号隔开。
--sync-to-master :指定一个DSN,即从的IP,他会通过show processlist或show slave status 去自动的找主。
h=127.0.0.1     :云服务器地址,命令里有2个ip,第一次出现的是Master的地址,第2次是Slave的地址。
u=root          :帐号。
p=123456        :密码。
--print         :打印,但不执行命令。
--execute       :执行命令。

8.2、pt-table-sync修复不同数据

接下的操作就是把slave上少的数据,从master同步过去(master操作);通过(--execute),让它们数据保持一致性:

[root@node1 ~]# pt-table-sync --replicate=test.checksums h=192.168.1.101,u=ptuser,p=123456,P=3306 h=192.168.1.102,u=ptuser,p=123456,P=3306 --execute

9、验证

9.1、使用pt-table-checksum重新校验:

[root@node1 ~]# pt-table-checksum --nocheck-replication-filters --replicate=test.checksums --databases=pt_check --tables=test1 h=192.168.1.101,u=ptuser,p=123456,P=3306 --no-check-binlog-format
Checking if all tables can be checksummed ...
Starting checksum ...
            TS ERRORS  DIFFS     ROWS  DIFF_ROWS  CHUNKS SKIPPED    TIME TABLE
02-20T10:03:02      0      0        3          0       1       0   0.083 pt_check.test1
[root@node1 ~]#

可以看到再次检查的时候,DIFFS已经是0了;

9.2、主库master:

root@node1 10:05:  [(none)]> select * from pt_check.test1;
+----+------+
| id | name |
+----+------+
|  1 | will |
|  2 | jim  |
|  3 | tom  |
+----+------+
3 rows in set (0.00 sec)

root@node1 10:05:  [(none)]>

9.3、从库slave:

root@node2 10:02:  [(none)]> select * from pt_check.test1;
+----+------+
| id | name |
+----+------+
|  1 | will |
|  2 | jim  |
|  3 | tom  |
+----+------+
3 rows in set (0.00 sec)

root@node2 10:05:  [(none)]>

已经跟master上的数据一致了。

10、报错

10.1、用户权限问题

没有创建CREATE表的权限;

[root@node1 ~]# pt-table-checksum --nocheck-replication-filters --replicate=test.checksums --databases=pt_check --tables=test1 h=192.168.1.101,u=ptuser,p=123456,P=3306 --no-check-binlog-format
Checking if all tables can be checksummed ...
Starting checksum ...
02-19T18:08:22 --create-replicate-table failed: DBD::mysql::db do failed: CREATE command denied to user 'ptuser'@'node1' for table 'checksums' [for Statement "  CREATE TABLE IF NOT EXISTS `test`.`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 DEFAULT CHARSET=utf8"] at /usr/bin/pt-table-checksum line 12272.
02-19T18:08:22 --replicate table checksums does not exist and it cannot be created automatically.  You need to create the table.
[root@node1 ~]#

10.2、Diffs cannot be detected because no slaves were found

不能自动找到从库,确认processlist或host或dsns方式用对了。

10.3、Cannot connect to h=slave1.*.com,p=...,u=percona_user

可以在pt-table-checksum命令前加PTDEBUG=1来看详细的执行过程,如端口、用户名、权限错误。

10.4、Waiting for the --replicate table to replicate to XXX

问题出在 percona.checksums 表在从库不存在,根本原因是没有从主库同步过来,所以看一下从库是否延迟严重。

10.5、Pausing because Threads_running=25

反复打印出类似上面停止检查的信息。这是因为当前数据库正在运行的线程数大于默认25,pt-table-checksum 为了减少对库的压力暂停检查了。等数据库压力过了就好了,或者也可以直接 Ctrl+C 终端,下一次加上--resume继续执行,或者加大--max-load=值。

10.6、字符集问题

对于以上关于如何使用percona-toolkit工具检查及修复MySQL数据库的主从不一致,大家是不是觉得非常有帮助。如果需要了解更多内容,请继续关注我们的行业资讯,相信你会喜欢上这些内容的。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯