新素材网站,基于php mysql的网站开发,云南昆明做网站,网上怎么找人去推广广告pt-table-checksum 是 Percona-Toolkit的组件之一#xff0c;用于检测MySQL主、从库的数据是否一致。其原理是在主库执行基于statement的sql语句来生成主库数据块的checksum#xff0c;把相同的sql语句传递到从库执行#xff0c;并在从库上计算相同数据块的checksum#xf…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要求主从复制是基于STATEMENT格式进行的复制并且会在主库执行binlog_formatSTATEMENT语句。由于MySQL的限制这一设置并不会传递到从库进行。因此当从库的binlog格式是ROW时无法直接对从库的从库进行校验操作。工具在进行校验操作时都会检查所有从库的binlog_format可以使用选项--[no]check-binlog-format进行控制工具假设主从数据库中SCHEMA和表结构都是一致的。如果从库上不存在主库的SCHEMA或者是从库上表结构与主库不一致则有可能导致主从复制中断
为了减少对数据库的干预pt-table-checksum还会自动侦测并连接到从库当然如果失败可以指定--recursion-method
默认情况pt-table-checksum工具会对所有连接到的从库进行检查从库连接策略由选项--recursion-method和--recurse控制检查项目如下--[no]check-replication-filters
工具检查每个从库上是否有存在主从复制过滤器如果发现有复制过滤器则校验操作会中止工具会退出。--replicate指定的表
工具检查每个从库上是否都存在选项--replicate指定保存校验结果的表。如果有从库没有这张表时校验操作有可能导致主从复制中断。这项检查无法被关闭如果从库不存在表则工具会一直等待直到从库存在该表。单个chunk大小
工具检查主库上表的是否可以在单个chunk范围内进行校验。具体说明可以参考官方说明REPLICA CHECKS。主从复制延迟
工具在每次校验完一个chunk之后都会检查每个从库是否有延迟或者通过选项--check-slave-lag指定需要检查的从库。校验块
工具在主库校验完每张表之后都会等待每个从库最后一个校验块的完成再执行选项--[no]replicate-check指定的操作。pt-table-checksum在主master上通过执行校验的查询对复制的一致性进行检查对比主从的校验值从而产生结果。DSN指向的是主的地址该工具的退出状态不为零如果发现有任何差别或者如果出现任何警告或错误.CREATE TABLE dsns ( id int(11) NOT NULL AUTO_INCREMENT, parent_id int(11) DEFAULT NULL, dsn varchar(255) NOT NULL, PRIMARY KEY (id) );INSERT INTO dsns (parent_id,dsn) values(1, h192.168.1.129,uadmin,p123456,P3307); pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicatetest.checksums --databasescheck_sum h192.168.1.128,uadmin,p123456,P3306--recursion-methoddsnh192.168.1.128,
Dtest,tdsns在等号的两侧不能有空格出现并且区分大小写多个选项之前以,(逗号)隔开主要选项如下A
指定字符集
D
指定DSN表所在数据库
t
指定DSN表
h
指定要连接的HOST
P
指定要连接的PORT
S
指定连接所使用的SOCKET文件(Unix systems)
u
指定连接的用户名
p
指定连接的用户名密码
选项来告诉从库在哪里。它的易用性还体现在复制若有延迟在从库 checksum 会暂停直到赶上主库的计算时间点也通过选项--设定一个可容忍的延迟最大值超过这个值也认为不一致。
为了保证主数据库服务的安全该工具实现了许多保护措施 1自动设置 innodb_lock_wait_timeout 为1s避免引起 2默认当数据库有25个以上的并发查询时pt-table-checksum会暂停。可以设置 --max-load 选项来设置这个阀值 3当用 CtrlC 停止任务后工具会正常的完成当前 chunk 检测下次使用 --resume 选项启动可以恢复继续下一个 chunk 常用参数解释
--ask-pass
命令行提示密码输入保护密码安全前提需安装模块perl-TermReadKey。--[no]check-binlog-format
默认值yes
指定检查所有服务器上的binlog_format系统参数是否相同。--check-interval
默认值1s
指定因为选项--max-lag检查之间休眠时间。--[no]check-replication-filters
默认值yes
指定检测主从复制是否有设置复制过滤器。默认如果有设置复制过滤器则工具不进行检查校验操作。--check-slave-lag
指定主从复制延迟大于选项--max-lag指定的值之后暂停检查校验操作。默认情况下工具会检查所有的从库但该选项只作用于指定的从库(通过DSN连接方式)。--chunk-index
指定使用哪个索引对表进行chunk分块操作。默认情况下会选择最优的索引工具会在SQL语句中添加FORCE INDEX子句。--chunk-index-columns
指定使用选项--chunk-index的索引使用最左前缀几个索引字段只适用于复合索引。--chunk-size
默认值1000
指定表分块的chunk大小每个chunk需要校验的表行数允许的后缀单位为k、M、G。
当指定了这个选项会覆盖工具默认动态调整chunk块大小以便在选项--chunk-time指定时间内完成行的校验。所以在大多数情况下不建议使用该选项应该使用选项--chunk-time来调整。--chunk-size-limit
默认值2.0
指定chunk的行数最多可以超过选项--chunk-size指定的行数的多少倍。最小值是1表示chunk的行数不能超过选项--chunk-size指定的值。由于行数是通过explain估算的所以不建议指定为1。当参数值为0时则不会检查是否超过指定的行数。--chunk-time
默认值0.5
动态调整每个chunk的大小使相应的表行数都在指定的时间内完成校验操作。
如果该选项值设置为0则不会动态调整chunk的大小就有可能造成每次校验操作的时间不同但每个chunk大小还是一致的。--columns-c
指定只需要校验的字段如有多个则用,(逗号)隔开。该选项一般只针对检验一张表时有效除非有多张表具有相同的字段。--[no]create-replicate-table
默认值yes
创建选项--replicate指定的数据库和表。表结构与选项--replicate指定的结构相同。--replicate
默认值percona.checksums
指定保存校验结果的表。创建表的结构如下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)
) ENGINEInnoDB DEFAULT CHARSETutf8;因为选项--[no]create-replicate-table默认值为true所以默认情况下如果数据库和表之前不存在则会自动创建percona库和checksums表。除非另有选项指定。选项--replicate指定的表不会进行校验操作指定的表默认加入选项--ignore-tables。--[no]replicate-check
默认值yes
指定在校验完每张表后检查主从当前表是否出现不一致。工具通过连接到从库执行简单的SELECT语句查询校验结果与主库的校验结果进行差异对比结果显示在输出中的DIFF字段中。--replicate-check-only
指定仅仅执行检查主从数据是否一致而不进执行真正的校验操作(主要通过查询之前保留的校验结果)。该选项只适用于同时指定选项--no-replicate-check。--replicate-check-retries
默认值1
指定当校验出主从数据不一致重试校验的次数。--replicate-database
指定工具在执行校验操作时在哪个数据库下进行相当于执行了语句USE [DB_NAME]。--resume
指定从最后完成校验的chunk开始恢复校验。适用于还未完成所有表的校验就工具就中断的情况。--retries
默认值2
指定当出现非严重性错误时重复校验一个块的次数。非严重性错误指的是如锁等待超时或长查询被kill的情况。--run-time
指定校验操作运行的时间。默认情况需要校验完所有的表数据后停止可以指定时间单位为s(秒)、m(分钟)、h(小时)、d(天)。--skip-check-slave-lag
DSN类型可重复使用
指定DSN连接从库时跳过主从延迟检查可以指定多个从库检查。--set-vars
默认wait_timeout10000innodb_lock_wait_timeout1lock_wait_timeout60
运行检查时指定参数值如有多个用,(逗号)分隔。如--set-varswait_timeout5000。--[no]empty-replicate-table
默认值yes
指定进行当前校验之前删除之前每张表的校验记录。该选项并不是对保存校验结果的表进行truncate而是在校验每张表之前删除当前表之前的校验结果因此当校验操作过早停止则有可能还有表没有校验数据如果是从之前校验操作恢复也不会清空保存校验结果的表。如果想清空保存校验结果的表则在校验操作进行之前手动对表执行truncate操作。--databases-d
指定只需要校验的数据库如有多个则用,(逗号)隔开。--engines-e
指定只需要校验的指定存储引擎类型的表。--explain
指定显示校验查询语句但不执行真正的校验操作。该选项会禁用选项--[no]empty-replicate-table如果指定两次则工具实际使用的是迭代的chunk算法打印出每个块的上边界和下边界值但不执行真正的校验。--fail-on-stopped-replication
指定当主从复制停止时校验中止操作并提示错误而不是等待主从复制恢复之后再进行。--function
默认值CRC32
指定校验操作使用的哈希函数。可选函数有SHA1、MD5等。--ignore-columns
指定需要忽略校验的字段如有多个则用,(逗号)隔开。--ignore-databases
指定需要忽略校验的数据库如有多个则用,(逗号)隔开。--ignore-databases-regex
指定采用正则表达式匹配忽略校验的数据库。--ignore-engines
默认值FEDERATEDMRG_MyISAM
指定需要忽略校验的存储引擎类型的表如有多个则用,(逗号)隔开。--ignore-tables
指定需要忽略校验的表如有多个则用,(逗号)隔开。表名称可以使用数据库名加以限定。--ignore-tables-regex
指定采用正则表达式匹配忽略校验的表。--max-lag
默认值1s
指定允许主从复制延迟时长的最大值单位秒。如果在每次校验查询之后主从延迟超过指定的值则校验操作将暂停执行暂停休眠时间为选项--check-interval指定的值。待休眠时间结束之后再次检查主从延迟时长检查方法是通过从库查询的Seconds_Behind_Master值来确定。如果主从复制延迟一直大于该参数指定值或者从库停止复制则操作将一直等待直到从库重新启动并且延迟小于该参数指定值。--max-load
数组类型默认值Threads_running 25
在校验要询完每个chunk数据之后运行SHOW GLOBAL STATUS检查所指定变量值高于该参数指定变量的阈值时将暂停校验操作。如果有多个变量阈值可以用,(逗号)进行分隔参数指定形式可以为变量名MAX_VALUE或变量名:MAX_VALUE。
如果只是指定变量名没有为其指定阈值则检查当前值并增加20%作为阈值。如--max-loadThreads_running没有指定具体值以当前查询值增加20%作为阈值如当前为100阈值为120--max-loadThreads_running:10以当前指定值为阈值。--host-h
指定连接的数据库IP地址。--port-P
指定连接的数据库Port端口。--user-u
指定连接的数据库用户。--password-p
指定连接的数据库用户密码。--database-d
指定连接的数据库。--socket-S
指定使用SOCKET文件连接。--progress
打印工具执行过程的进度提示到STDERR。选项值有两部分组成用逗号进行分隔第一部分为百分比时间和迭代。第二部分为根据第一部分数据更新频率也分为百分比时间和迭代。--quiet-q
不打印工具执行过程的信息到STDOUT(禁用--progress)。但错误和警告还是打印到STDERR。--recurse
指定搜寻从库的层级默认无限级。--recursion-method
默认值processlisthosts
指定获取从库的方式。pt-table-checksum在执行校验操作时会执行多次REPLICA CHECKS操作。
METHOD USESprocesslist SHOW PROCESSLIST
hosts SHOW SLAVE HOSTS
cluster SHOW STATUS LIKE wsrep\_incoming\_addresses
dsnDSN DSNs from a table
none Do not find slavesprocesslist通过SHOW PROCESSLIST方式找到slave为默认方式当SHOW SLAVE HOSTS不可用时。一旦实例运行在非3306端口上时hosts方式就会变为默认方式
hosts通过SHOW SLAVE HOSTS方式找到slavehosts方式要求从库配置--report_host和--report_port这两个参数
cluster基于集群版本Galera 23.7.3及更新版本
dsn通过读取表中从库的DSN信息进行连接。--tables-t
指定只需要校验的表如有多个则用,(逗号)隔开。表名称可以使用数据库名加以限定。--tables-regex
指定采用正则表达式匹配校验的表。--where
指定通过where条件确定表中需要校验的数据。--truncate-replicate-table
指定在执行校验操作之前对保存校验结果的表执行truncate操作。注意与选项--[no]empty-replicate-table的区分。--version
显示工具的版本并退出。--[no]version-check
默认值yes
检查Percona Toolkit、MySQL和其他程序的最新版本。
最重要的一点就是 要在主库上授权能让主库ip访问。这一点不能忘记实验证明从库上可以不授权但最好还是从库也授权 注意 1根据测试需要一个即能登录主库也能登录从库的账号 2只能指定一个host必须为主库的IP 3在检查时会向表加S锁 4运行之前需要从库的同步IO和SQL进程是YES状态。表要有主键索引或唯一键索引
工作过程 1\. 连接到主库pt工具连接到主库然后自动发现主库的所有从库。默认采用show full processlist来查找从库但是这只有在主从实例端口相同的情况下才有效。 3\. 查找主库或者从库是否有复制过滤规则这是为了安全而默认检查的选项。你可以关闭这个检查但是这可能导致checksum的sql语句要么不会同步到从库要么到了从库发现从库没有要被checksum的表这都会导致从库同步卡库。 5\. 开始获取表一个个的计算。 6\. 如果是表的第一个chunk那么chunk-size一般为1000如果不是表的第一个chunk那么采用19步中分析出的结果。 7\. 检查表结构进行数据类型转换等生成checksum的sql语句。 8\. 根据表上的索引和数据的分布选择最合适的split表的方法。 9\. 开始checksum表。 10\. 默认在chunk一个表之前先删除上次这个表相关的计算结果。除非–resume。 14\. 根据explain的结果判断chunk的size是否超过了你定义的chunk-size的上限。如果超过了为了不影响线上性能这个chunk将被忽略。 15\. 把要checksum的行加上for update锁并计算。 17-18\. 把计算结果存储到master_crc master_count列中。 19\. 调整下一个chunk的大小。 20\. 等待从库追上主库。如果没有延迟备份的从库在运行最好检查所有的从库如果发现延迟最大的从库延迟超过max-lag秒pt工具在这里将暂停。 21\. 如果发现主库的max-load超过某个阈值pt工具在这里将暂停。 22\. 继续下一个chunk直到这个table被chunk完毕。 23-24\. 等待从库执行完checksum便于生成汇总的统计结果。每个表汇总并统计一次。 25-26\. 循环每个表直到结束。 校验结束后在每个从库上执行如下的sql语句即可看到是否有主从不一致发生
select * from percona.checksums where master_cnt this_cnt OR master_crc this_crc OR
ISNULL(master_crc) ISNULL(this_crc) \G
命令
pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicatebim.checksums --create-replicate-table --databasesbim h103.32.132.166,uroot,p0202,P3306
Cannot connect to P3306,h10.2.132.160,p...,uroot TS ERRORS DIFFS ROWS DIFF_ROWS CHUNKS SKIPPED TIME TABLE 08-03T10:17:52 0 0 1829 0 1 0 0.445 bim.a20200911 08-03T10:17:53 0 0 0 0 1 0 0.358 bim.a_pwd_change 08-03T10:17:53 0 0 0 0 1 0 0.361 bim.act_evt_log 08-03T10:17:53 0 0 0 0 1 0 0.360 bim.act_ge_bytearray 08-03T10:17:54 0 0 3 0 1 0 0.359 bim.act_ge_property 08-03T10:17:54 0 0 0 0 1 0 0.382 bim.act_hi_actinst 08-03T10:17:55 0 0 0 0 1 0 0.356 bim.act_hi_attachment 08-03T10:17:55 0 0 0 0 1 0 0.365 bim.act_hi_comment 08-03T10:17:55 0 0 0 0 1 0 0.392 bim.act_hi_detail 08-03T10:17:56 0 0 0 0 1 0 0.350 bim.act_hi_identitylink 08-03T10:17:56 0 0 0 0 1 0 0.483 bim.act_hi_procinst 08-03T10:17:56 0 0 0 0 1 0 0.310 bim.act_hi_taskinst 08-03T10:17:57 0 0 0 0 1 0 0.316 bim.act_hi_varinst 08-03T10:17:57 0 0 0 0 1 0 0.299 bim.act_re_deployment 08-03T10:17:57 0 0 0 0 1 0 0.376 bim.act_re_model 08-03T10:17:58 0 0 0 0 1 0 0.366 bim.act_re_procdef 08-03T10:17:58 0 0 0 0 1 0 0.352 bim.act_ru_event_subscr 08-03T10:17:59 0 0 0 0 1 0 0.378 bim.act_ru_execution 08-03T10:17:59 0 0 0 0 1 0 0.345 bim.act_ru_identitylink 08-03T10:17:59 0 0 0 0 1 0 0.347 bim.act_ru_job 08-03T10:18:00 0 0 0 0 1 0 0.476 bim.act_ru_task
解释 TS 完成检查的时间。 ERRORS 检查时候发生错误和警告的数量。 DIFFS 0表示一致1表示不一致。当指定--no-replicate-check时会一直为0当指定--replicate-check-only会显示不同的信息。 ROWS 表的行数。 CHUNKS 被划分到表中的块的数目。 SKIPPED 由于错误或警告或过大则跳过块的数目。 TIME 执行的时间。 TABLE 被检查的表名。
在主库里添加pt-table-checksum检查的权限从库可以不授权后进行数据一致性检查操作会在操作的库实例中是huanqiu、huanpc下产生一个checksums表 这张checksums表是pt-table-checksum检查过程中产生的。这张表一旦产生了默认是删除不了的并且这张表所在的库也默认删除不了删除后过一会儿就又会出来。
要想删除的话一定要先把pt-table-checksum检查前添加的权限收回checksums表一旦产生不仅这张表默认删除不了连同它所在的库要是想删除它们只能如上操作先撤销权限。