原理: 在主库执行, 设置会话的binlog格式为statement格式, 设置会话的隔离级别为RR, 执行show processlist或show slave hosts确定从库的连接方式,把校验SQL先在master执行,再传到slave执行,如果主从分别执行的结果一样,那数据就是一致性,否则数据不一致。
其核心原理是把表的所有字段拼成一个值,做hash code运算,得到一个crc32的值,记录到master_cnc和master_cnt
create database percona;
create user checksum@'172.16.123.%' identified by 'chk123!@#';
GRANT SELECT, PROCESS, SUPER, REPLICATION SLAVE, REPLICATION CLIENT ON . TO 'checksum'@'172.16.123.%';
GRANT ALL PRIVILEGES ON percona.* TO 'checksum'@'172.16.123.%';
[root@vdb_172_16_123_101 14:04:39 /root]#
shell> pt-table-checksum --host=172.16.123.101 --port=3306 --user=checksum --password='chk123!@#' --no-check-binlog-format
TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE
04-12T14:05:22 0 1 2 1 0 0.020 db3306.t1
04-12T14:05:22 0 0 0 1 0 0.024 mysql.columns_priv
04-12T14:05:22 0 0 2 1 0 0.024 mysql.db
04-12T14:05:22 0 0 2 1 0 0.025 mysql.engine_cost
04-12T14:05:22 0 0 0 1 0 0.026 mysql.event
04-12T14:05:22 0 0 0 1 0 0.027 mysql.func
04-12T14:05:22 0 1 1 1 0 0.024 mysql.gtid_executed
04-12T14:05:22 0 0 40 1 0 0.027 mysql.help_category
04-12T14:05:22 0 0 682 1 0 0.034 mysql.help_keyword
04-12T14:05:22 0 0 1340 1 0 0.024 mysql.help_relation
04-12T14:05:22 0 0 637 1 0 0.030 mysql.help_topic
04-12T14:05:22 0 0 0 1 0 0.015 mysql.ndb_binlog_index
04-12T14:05:22 0 0 0 1 0 0.029 mysql.procs_priv
04-12T14:05:22 0 0 1 1 0 0.022 mysql.proxies_priv
04-12T14:05:22 0 0 6 1 0 0.025 mysql.server_cost
04-12T14:05:22 0 0 0 1 0 0.023 mysql.servers
04-12T14:05:22 0 0 1 1 0 0.018 mysql.tables_priv
04-12T14:05:22 0 0 0 1 0 0.023 mysql.time_zone
04-12T14:05:22 0 0 0 1 0 0.034 mysql.time_zone_leap_second
04-12T14:05:22 0 0 0 1 0 0.038 mysql.time_zone_name
04-12T14:05:24 0 0 0 1 0 1.028 mysql.time_zone_transition
04-12T14:05:25 0 0 0 1 0 1.033 mysql.time_zone_transition_type
04-12T14:05:25 0 0 4 1 0 0.036 mysql.user
[root@vdb_172_16_123_101 14:27:39 /root]#
shell> pt-table-checksum --host=172.16.123.101 --port=3306 --user=checksum --password='chk123!@#' --no-check-binlog-format --databases=db3306
TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE
04-12T14:31:21 0 1 2 1 0 0.022 db3306.t1
[root@vdb_172_16_123_101 14:31:21 /root]#
shell> pt-table-checksum --host=172.16.123.101 --port=3306 --user=checksum --password='chk123!@#' --no-check-binlog-format --ignore-databases=mysql
TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE
04-12T14:31:43 0 1 2 1 0 0.023 db3306.t1
输出解读
TS 省略年份的日期时间
ERRORS 发生错误的次数
DIFFS 发生了几个chunk里的数据不一致,(chuk默认为1000条记录)
ROWS 表的总行数
CHUNKS 表划分多少个CHUNK
SKIPPED 发生错误跳过的
TIME 校验数据占用的时间
TABLE 校验的表名
使用pt-table-checksum的注意事项:
(1) 在主库执行
(2) 一般忽略mysql库校验