Step 1. pt-table-chum 原理mysql
pt-table-checksum用于在线检测MySQL主从一致性,其原理是在主库执行checksum查询,而后与从库进行结果的比对,从而得出是否一致性的报告.sql
pt-table-checksum checksum每张表,而后得出每一个从库的一致性报告。pt-table-checksum 工具只关注数据的不一致,修复数据一致性须要用到 pt-table-sync 工具.数据库
pt-table-checksum 链接指定的主库,而后查找数据库和表(若是指定了过滤条件,则按过滤条件查找)。它同一时间只checksum 一张表,因此不会消耗过多的内存和资源。对于大数据库的数据库来讲,这是一个很是有用的设计,不管数据库有多大,好比一个server中有几百个数据库和表,数万亿(trillions)的行,咱们都无需担忧,pt-table-checksum均可以胜任。bash
能够胜任的缘由是, pt-table-checksum 将每张表都拆分红行块(chunks of rows),默认是1000行。而后对每一个行块使用单独的REPLACE…SELECT 进行checksum 查询。行块(chunks of rows)大小随着设定的–chunk-time 时间(默认0.5秒)动态调节。每次 checksum 查询执行完毕后,下次checksum 查询会根据上次执行的时间调整 行块(chunks of rows)大小,也就是经过学习系统的负载状况来调节行块大小。 若是不设定 –chunk-time ,行块大小则不会自动调整。这样就不会造成一个大的checkum 查询操做,确保了主从复制不会产生大的延迟或者负载服务器
pt-table-checksum
是 Percona-Toolkit 的组件之一,用于检测MySQL主、从库的数据是否一致。其原理是在主库执行基于statement的sql语句来生成主库数据块的checksum,把相同的sql语句传递到从库执行,并在从库上计算相同数据块的checksum,最后,比较主从库上相同数据块的checksum值,由此判断主从数据是否一致。检测过程根据惟一索引将表按row切分为块(chunk),觉得单位计算,能够避免锁表。检测时会自动判断复制延迟、 master的负载, 超过阀值后会自动将检测暂停,减少对线上服务的影响。工具
pt-table-checksum
默认状况下能够应对绝大部分场景,官方说,即便上千个库、上万亿的行,它依然能够很好的工做,这源自于设计很简单,一次检查一个表,不须要太多的内存和多余的操做;必要时,pt-table-checksum
会根据服务器负载动态改变 chunk 大小,减小从库的延迟。学习为了减小对数据库的干预,
pt-table-checksum
还会自动侦测并链接到从库,固然若是失败,能够指定--recursion-method
选项来告诉从库在哪里。它的易用性还体如今,复制如有延迟,在从库 checksum 会暂停直到遇上主库的计算时间点(也经过选项--
设定一个可容忍的延迟最大值,超过这个值也认为不一致。大数据
Step 2.安装 pt-table-checksum设计
$ wget https://www.percona.com/redir/downloads/percona-release/redhat/latest/percona-release-0.1-6.noarch.rpm $ rpm -ivh percona-release-0.1-6.noarch.rpm $ yum install percona-toolkit -y
至此pt-table-checksum 命令已安装完成!code
Step 3.建立一个专门用于checksum的用户,它须要有链接到从库的权限
mysql> GRANT SELECT, PROCESS, SUPER, REPLICATION SLAVE ON *.* TO 'checksum'@'%' IDENTIFIED BY 'checksum'; Query OK, 0 rows affected (0.00 sec) mysql> GRANT ALL PRIVILEGES ON *.* TO 'checksum'@'%' IDENTIFIED BY 'checksum'; Query OK, 0 rows affected (0.01 sec)
Step 4. 只检查cnail一个库数据是否一致,使用–databases参数
TS :完成检查的时间戳。
ERRORS :检查时候发生错误和警告的数量。
DIFFS :不一致的chunk数量。当指定
--no-replicate-check
即检查完但不当即输出结果时,会一直为0;当指定--replicate-check-only
即不检查只从checksums表中计算crc32,且只显示不一致的信息(毕竟输出的大部分应该是一致的,容易形成干扰)。ROWS :比对的表行数。
CHUNKS :被划分到表中的块的数目。
SKIPPED :因为错误或警告或过大,则跳过块的数目。
TIME :执行的时间。
TABLE :被检查的表名
$ pt-table-checksum --user=checksum --password=checksum --host=192.168.1.120 --databases=anna --replicate=cnail.checksums --create-replicate-table --no-check-binlog-format Checking if all tables can be checksummed ... Starting checksum ... TS ERRORS DIFFS ROWS DIFF_ROWS CHUNKS SKIPPED TIME TABLE 01-29T12:10:17 0 0 0 0 1 0 0.026 anna.tb1
Step 5.检查全部库是否一致
$ pt-table-checksum --user=checksum --password=checksum --host=192.168.1.100 --replicate=cnail.checksums --create-replicate-table --no-check-binlog-format Checking if all tables can be checksummed ... Starting checksum ... Diffs cannot be detected because no slaves were found. Please read the --recursion-method documentation for information. TS ERRORS DIFFS ROWS DIFF_ROWS CHUNKS SKIPPED TIME TABLE 01-29T15:50:55 0 0 0 0 1 0 0.011 anna.tb1 01-29T15:50:55 0 0 0 0 1 0 0.011 dong.tb1 01-29T15:50:55 0 0 0 0 1 0 0.010 mysql.columns_priv 01-29T15:50:55 0 0 2 0 1 0 0.011 mysql.db 01-29T15:50:55 0 0 0 0 1 0 0.012 mysql.event 01-29T15:50:55 0 0 0 0 1 0 0.012 mysql.func 01-29T15:50:55 0 0 40 0 1 0 0.013 mysql.help_category 01-29T15:50:55 0 0 614 0 1 0 0.011 mysql.help_keyword 01-29T15:50:55 0 0 1225 0 1 0 0.009 mysql.help_relation 01-29T15:50:55 0 0 585 0 1 0 0.011 mysql.help_topic 01-29T15:50:55 0 0 0 0 1 0 0.013 mysql.ndb_binlog_index 01-29T15:50:55 0 0 0 0 1 0 0.012 mysql.plugin 01-29T15:50:55 0 0 0 0 1 0 0.012 mysql.proc 01-29T15:50:55 0 0 0 0 1 0 0.011 mysql.procs_priv 01-29T15:50:55 0 0 2 0 1 0 0.010 mysql.proxies_priv 01-29T15:50:55 0 0 0 0 1 0 0.011 mysql.servers 01-29T15:50:55 0 0 0 0 1 0 0.012 mysql.tables_priv 01-29T15:50:55 0 0 0 0 1 0 0.013 mysql.time_zone 01-29T15:50:55 0 0 0 0 1 0 0.014 mysql.time_zone_leap_second 01-29T15:50:55 0 0 0 0 1 0 0.013 mysql.time_zone_name 01-29T15:50:55 0 0 0 0 1 0 0.014 mysql.time_zone_transition 01-29T15:50:55 0 0 0 0 1 0 0.012 mysql.time_zone_transition_type 01-29T15:50:55 0 0 9 0 1 0 0.015 mysql.user 01-29T15:50:55 0 0 4 0 1 0 0.010 percona.checksums 01-29T15:50:55 0 0 2 0 1 0 0.015 percona.tb1 01-29T15:50:55 0 0 0 0 1 0 0.012 percona.tb2 01-29T15:50:55 0 0 0 0 1 0 0.014 percona.tb3
Step 6. –replicate-check-only 参数,只输出不一致的表的信息
$ pt-table-checksum --user=checksum --password=checksum --host=192.168.1.120 --replicate=cnail.checksums --create-replicate-table --no-check-binlog-format --max-load='Threads_connected=120' --replicate-check-only