校验一致性
- 建库和表。
登录主库,创建用于保存检查信息的库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;
- 创建用户并授权。
- 主库执行命令创建用户,并为该用户授权(从库可以自动复制)。
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;
- 查看用户checksums的权限。
1 2
show grants for checksums; select * from mysql.user where user='checksums' \G;
- 主库执行命令创建用户,并为该用户授权(从库可以自动复制)。
- 确认主从同步完成后,登录客户端执行一致性校验。
- 客户端执行如下命令,对比主库和从库中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
- 客户端执行如下命令,对比主库和从库中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
只显示主从不一致的信息,如果主从一致就不会有信息显示。
- 客户端执行如下命令,对比主库和从库中tpcc的所有表的数据,默认情况下,pt-table-checksum会自动发现并连接所有从库。
- 查看一致性校验结果。
- 直接查看上一步执行对比的打印结果,DIFFS列0表示一致性校验结果一致,1表示一致性校验结果不一致。
图1 主库和从库tpcc所有表的数据对比结果
表2 结果说明 参数项
说明
TS
完成检查的时间。
ERRORS
检查时候发生错误和警告的数量。
DIFFS
0表示一致,1表示不一致。
ROWS
表的行数。
CHUNKS
被划分到表中的块的数目。
SKIPPED
由于错误或警告或过大,则跳过块的数目。
TIME
执行的时间。
TABLE
被检查的表名。
- 登录数据库,检查一致性校验结果是否一致。
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);
如果结果为空说明主库和从库数据一致,否则说明主库和从库数据不一致。
- 直接查看上一步执行对比的打印结果,DIFFS列0表示一致性校验结果一致,1表示一致性校验结果不一致。