---
title: 校验一致性
description: "1. 建库和表。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengdbs/ecosystemEnable/MySQL/kunpengmysqlmasterslave_03_0031.html
sourcePath: /source/zh/kunpengdbs/ecosystemEnable/MySQL/kunpengmysqlmasterslave_03_0031.html
indexId: 72cd1ee1ef282ffb4f8093c1fa048c6a89712eddf0780c792d43c09dc1a8c7b980
---
# 校验一致性

1. 建库和表。
  登录主库，创建用于保存检查信息的库pt和表checksums（从库可以自动复制）。

  1 /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. 创建用户并授权。

  a. 主库执行命令创建用户，并为该用户授权（从库可以自动复制）。
    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;

  b. 查看用户checksums的权限。
    1 2 show grants for checksums; select * from mysql.user where user='checksums' \G;

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

  a. 客户端执行如下命令，对比主库和从库中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

  b. 客户端执行如下命令，对比主库和从库中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”，参考校验MySQL主从数据一致性时提示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. 查看一致性校验结果。

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

**表2 结果说明**

| 参数项 | 说明 |
| --- | --- |
| TS | 完成检查的时间。 |
| ERRORS | 检查时候发生错误和警告的数量。 |
| DIFFS | 0表示一致，1表示不一致。 |
| ROWS | 表的行数。 |
| CHUNKS | 被划分到表中的块的数目。 |
| SKIPPED | 由于错误或警告或过大，则跳过块的数目。 |
| TIME | 执行的时间。 |
| TABLE | 被检查的表名。 |


  b. 登录数据库，检查一致性校验结果是否一致。
    分别登录主库和从库。

    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);

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