千家信息网

percona-toolkit之pt-table-checksum

发表于:2024-11-27 作者:千家信息网编辑
千家信息网最后更新 2024年11月27日,第一部分-简介pt-table-checksum通过SQL在主库执行数据块的校验,再将相同的语句传送到从库,并在从库上计算数据块的校验,最后将主从库相同块的校验值进行对比,辨别主从数据是否不一致。pt
千家信息网最后更新 2024年11月27日percona-toolkit之pt-table-checksum

第一部分-简介
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
0