第一部分-简介
pt-table-checksum通过SQL在主库执行数据块的校验,再将相同的语句传送到从库,并在从库上计算数据块的校验,最后将主从库相同块的校验值进行对比,辨别主从数据是否不一致。
做网站、网站设计,成都做网站公司-创新互联已向上千企业提供了,网站设计,网站制作,网络营销等服务!设计与技术结合,多年网站推广经验,合理的价格为您打造企业品质网站。
pt-table-sync用来修复主从复制数据的不一致,使得它们修复到最终一致,也可以实现多个实例或者是应用双写或多写的多个不相关的数据库实例修复到一致。同时它还内部集成了pt-table-checksum的校验功能,可以一边校验一边修复,也可以基于pt-table-checksum的计算结果来进行修复。
第二部分-工具的安装
方法1-RPM安装
1.软件下载:
[root@MySQL-01 ~]# wget http://www.percona.com/downloads/percona-toolkit/LATEST/RPM/percona-toolkit-2.2.7-1.noarch.rpm
2.安装该工具依赖的软件包:
[root@MySQL-01 ~]# yum install perl-IO-Socket-SSL perl-DBD-MySQL perl-Time-HiRes -y
3.软件安装:
[root@MySQL-01 ~]# rpm -ivh percona-toolkit-2.2.7-1.noarch.rpm
Preparing... ########################################### [100%]
1:percona-toolkit ########################################### [100%]
方法2-源码安装
1.软件下载:
这两个工具均包含在percona-toolkit里,线上下载地址: https://www.percona.com/downloads/percona-toolkit/2.2.2/。
在设备上直接下载的指令如下,下载后解压使用:wget https://www.percona.com/downloads/percona-toolkit/2.2.2/percona-toolkit-2.2.2.tar.gz
2、安装依赖软件包
yum install perl perl-devel perl-Time-HiRes perl-DBI perl-DBD-MySQL
3、软件安装
tar zxvf percona-toolkit-2.2.13.tar.gz
cd percona-toolkit-2.2.13
perl Makefile.PL
make && make install
第三部分-使用checksum检验数据一致性
1、 主库创建如下对象
创建数据库
CREATE DATABASE IF NOT EXISTS percona
创建表
use percona
Create Table: CREATE TABLE `checksums` (
`db` char(64) NOT NULL,
`tbl` char(64) NOT NULL,
`chunk` int(11) NOT NULL,
`chunk_time` float DEFAULT NULL,
`chunk_index` varchar(200) DEFAULT NULL,
`lower_boundary` text,
`upper_boundary` text,
`this_crc` char(40) NOT NULL,
`this_cnt` int(11) NOT NULL,
`master_crc` char(40) DEFAULT NULL,
`master_cnt` int(11) DEFAULT NULL,
`ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`db`,`tbl`,`chunk`),
KEY `ts_db_tbl` (`ts`,`db`,`tbl`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
如果使用系统自动创建的表
mysql> alter table checksums modify ts timestamp not null default current_timestamp
如果使用已存在的数据库,则把此表创建到此库下。使用--replicate=test.checksums 进行指定即可
2、主库创建需要的用户及授权
此用户的是作为pt-table-checksum连接主备库,进行数据校验使用的,所已主备库必须存在相同的且能登录的用户
GRANT UPDATE,INSERT,DELETE,SELECT, PROCESS, SUPER, REPLICATION SLAVE ON . TO 'procheck'@'172.31.150.37' identified by 'Mysql.37';
GRANT ALL ON percona.* TO 'procheck'@'172.31.150.37'
3、执行命令进行数据校验
执行命令
pt-table-checksum -u'procheck' -p'Mysql.37' -h272.31.150.37 -P 3316 --databases=agati --ignore-tables=sys_log --nocheck-binlog-format --nocheck-plan --nocheck-replication-filters --recursion-method=processlist
其他参数及备选参数解释
--u'lxh'
--p'Mysql.163'
--h 192.168.XXX.XX 主库IP地址
--P 3306 主库端口
--databases=db1 校验db1库里
--tables=tb1 的tb1表,若无此参数则校验全库全表。
--no-check-binlog-format 被检查的主从binlog_format必须为statement,如果不是statement-based就要添加此参数
--nocheck-plan 检查 query的执行计划(优先选择能够对表进行chunk 分组的索引)
--nocheck-replication-filters 不检查复制过滤器,建议启用。
--recursion-method="processlist" 其参数有四:processlist/hosts/dsn=DSN/no,用来决定查找slave的方式是show full processlist还是show slave hosts还是命令行直接指定还是压根就不准备找从库;
使用DNS方法
配置
CREATE TABLE `dsns` ( `id` int(11) NOT NULL AUTO_INCREMENT, `parent_id` int(11) DEFAULT NULL, `dsn` varchar(255) NOT NULL, PRIMARY KEY (`id`) );
列名的含义
parent_id:一个需要无特别意义
dsn:配置内容,h表示host指slave的ip,u表示user指创建的检查用户,p指此用户密码,P指备库端口
INSERT INTO dsns (parent_id,dsn) values(1,'h=172.31.150.36,u=procheck,p=Mysql.37,P=3316');
INSERT INTO dsns (parent_id,dsn) values(2,'h=172.29.147.32,u=procheck,p=Mysql.37,P=3376');
使用
--recursion-method=dsn=h=172.31.150.37,D=percona,t=dsns
D指:存放配置表的数据库名字
T指:存放配置的表名字
--set-varsinnodb_lock_wait_timeout=120锁的超时设定, 默认为1
--replicate=test.checksums 用来指定存放计算结果的表名,默认是percona.checksums,工具会默认自动创建库percona和表checksums并将checksum的检查结果输入到这个表中,如果自己用该参数去指定表的话,表结构必须是上面创建的表结构
4、查看校验结果哦
结果可以在执行命令后出现
也可以查询之前创建的表
检查结果各列含义
TS :完成检查的时间。
ERRORS :检查时候发生错误和警告的数量。
DIFFS :0表示一致,大于0表示不一致。主要看这一列有无不一致数据。
ROWS :表的行数。
CHUNKS :被划分到表中的块的数目。
SKIPPED :由于错误或警告或过大,则跳过块的数目。
TIME :执行的时间。
TABLE :被检查的表名。
第四部份-报错解决
问题(1)
01-07T15:19:02 Error checksumming table test.test1:
Error executing checksum query: DBD::mysql::st execute failed: Field 'ts' doesn't have a default value
[for Statement "REPLACE INTO `percona`.`checksums` (db, tbl, chunk, chunk_index, lower_boundary, upper_boundary, this_cnt, this_crc)
SELECT ?, ?, ?, ?, ?, ?, COUNT(*) AS cnt, COALESCE(LOWER(CONV(BIT_XOR(CAST(CRC32(CONCAT_WS('#', `host`, `user`, `select_priv`, `insert_priv`,
`update_priv`, `delete_priv`, `create_priv`, `drop_priv`, `reload_priv`, `shutdown_priv`, `process_priv`, `file_priv`, `grant_priv`,
`references_priv`, `index_priv`, `alter_priv`, `show_db_priv`, `super_priv`, `create_tmp_table_priv`, `lock_tables_priv`, `execute_priv`,
`repl_slave_priv`, `repl_client_priv`, `create_view_priv`, `show_view_priv`, `create_routine_priv`, `alter_routine_priv`, `create_user_priv`,
`event_priv`, `trigger_priv`, `create_tablespace_priv`, `ssl_type`, `ssl_cipher`, `x509_issuer`, `x509_subject`, `max_questions`,
`max_updates`, `max_connections`, `max_user_connections`, `plugin`, `authentication_string`, `password_expired`,
`password_last_changed` + 0, `password_lifetime`, `account_locked`, CONCAT(ISNULL(`authentication_string`),
ISNULL(`password_last_changed`), ISNULL(`password_lifetime`)))) AS UNSIGNED)), 10, 16)), 0) AS crc
FROM `test`.`test1` /*checksum table*/" with ParamValues: 0='test', 1='test1', 2=1, 3=undef, 4=undef, 5=undef]
at /usr/local/bin/pt-table-checksum line 10305.
解决
mysql> alter table checksums modify ts timestamp not null default current_timestamp