工具运行

  1. 建库和表。

    登录主库,创建用于保存检查信息的库pt和表checksums(从库可以自动复制)

    /usr/local/mysql/bin/mysql -uroot -p123456 -S /data/mysql/run/mysql.sock
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    create database pt;
    show databases;
    use pt;
    create table 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;
    show tables;
    

  2. 创建用户并授权。

    1. 主库执行命令创建用户,并为该用户授权(从库可以自动复制)。
      1
      2
      3
      4
      5
      create user 'checksums'@'%' identified by '123456';
      grant select,process,super,replication slave on *.* to 'checksums'@'%';
      grant all on pt.* to 'checksums'@'%';
      flush privileges;
      select user,host from mysql.user;
      
    2. 查看用户checksums的权限。
      show grants for checksums;
      select * from mysql.user where user='checksums' \G;

  3. 确认主从同步完成后,登录客户端执行一致性校验。

    1. 客户端执行如下命令,对比主库和从库中tpcc的所有表的数据,默认情况下,pt-table-checksum会自动发现并连接所有从库。
      1
      pt-table-checksum h=192.168.220.58,u=checksums,p=123456,P=3306 --databases=tpcc --no-check-binlog-format --replicate=pt.checksums --max-lag=3 --recursion-method=hosts
      
    2. 客户端执行如下命令,对比主库和从库中tpcc的表bmsql_district的数据。
      1
      pt-table-checksum h=192.168.220.58,u=checksums,p=123456,P=3306 --databases=tpcc --tables=bmsql_district --no-check-binlog-format --replicate=pt.checksums --max-lag=3 --recursion-method=hosts
      

      如果客户端执行一致性校验报错“Cannot connect to P=3307,h=,p=...,u=checksums.Diffs cannot be detected because no slaves were found”,参考no slaves were found解决后,重新登录客户端执行一致性校验。

      表1 参数说明

      参数项

      说明

      h=192.168.220.58

      主库的IP地址。

      u=checksums

      用户名。

      p=123456

      密码。

      P=3306

      数据库端口。

      --databases

      指定需要被检查的数据库,多个则用逗号隔开。

      --tables

      指定需要被检查的表,多个用逗号隔开。

      --no-check-binlog-format

      不检查主从复制的binlog模式。如果binlog模式是row模式,需要启用该参数。

      --replicate=pt.checksums

      把检查信息都写到了checksums表中。

      --max-lag=3

      如果发现延迟最大的从库延迟超过max-lag秒,pt-table-checksum工具在这里将暂停。

      --nocheck-replication-filters

      表示不需要检查主库配置里是否指定了Filter。

      --replicate-check-only

      只显示主从不一致的信息,如果主从一致就不会有信息显示。

  4. 查看一致性校验结果。

    1. 直接查看上一步执行对比的打印结果,DIFFS列0表示一致性校验结果一致,1表示一致性校验结果不一致。
      图1 主库和从库tpcc所有表的数据对比结果
      表2 结果说明

      参数项

      说明

      TS

      完成检查的时间。

      ERRORS

      检查时候发生错误和警告的数量。

      DIFFS

      0表示一致,1表示不一致。

      ROWS

      表的行数。

      CHUNKS

      被划分到表中的块的数目。

      SKIPPED

      由于错误或警告或过大,则跳过块的数目。

      TIME

      执行的时间。

      TABLE

      被检查的表名。

    2. 登录数据库,检查一致性校验结果是否一致。

      分别登录主库和从库。

      1
      /usr/local/mysql/bin/mysql -uroot -p123456 -S /data/mysql/run/mysql.sock
      

      分别查看主库和从库的检查信息。

      1
      select * from pt.checksums;
      

      分别查看主库和从库的检查结果。

      1
      select * from pt.checksums where master_cnt <> this_cnt or master_crc <> this_crc or isnull(master_crc) <> isnull(this_crc);
      

      如果结果为空说明主库和从库数据一致,否则说明主库和从库数据不一致。