原理: 在主库执行, 设置会话的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库校验