一、用途
pt-table-checksum通过在 master 上执行校验和查询来执行在线复制一致性检查,这会在与 master 不一致的副本上产生不同的结果。可选的 DSN 指定主控主机。如果发现任何差异,或者出现任何警告或错误,则该工具的“退出状态”为非零值,该工具专注于有效地查找数据差异。如果有任何数据不同,您可以使用 pt-table-sync 解决问题。
二、基本使用
1.使用示例
pt-table-checksum h='host',u='user',p='password',P=port --nocheck-replication-filters --replicate=test.checksums --recursion-method=hosts --no-check-binlog-format
ps: recursion-method:因为我配置了单机多实例,从库端口为3307,processlist找不到从库,这时候就需要使用host或者dsn,
使用host则需要修改从库的配置
[mysqld]
report-host = *******
report-port = 3307
dsn用法:
--recursion-method dsn=h=host,D=percona,t=dsns
CREATE TABLE `dsns` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`parent_id` int(11) DEFAULT NULL,
`dsn` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
);
# dsn字段的内容:"h=replica_host,u=repl_user,p=repl_pass"
2.从库全局日志
2021-09-26T03:33:55.478992Z 8 Query SHOW TABLES FROM `test_1` LIKE 'a'
2021-09-26T03:33:55.488784Z 8 Query /*!40101 SET @OLD_SQL_MODE := @@SQL_MODE, @@SQL_MODE := '', @OLD_QUOTE := @@SQL_QUOTE_SHOW_CREATE, @@SQL_QUOTE_SHOW_CREATE := 1 */
2021-09-26T03:33:55.497333Z 8 Query USE `test_1`
2021-09-26T03:33:55.506029Z 8 Query SHOW CREATE TABLE `test_1`.`a`
2021-09-26T03:33:55.515042Z 8 Query /*!40101 SET @@SQL_MODE := @OLD_SQL_MODE, @@SQL_QUOTE_SHOW_CREATE := @OLD_QUOTE */
2021-09-26T03:33:55.524401Z 8 Query EXPLAIN SELECT * FROM `test_1`.`a` WHERE 1=1
2021-09-26T03:33:55.562799Z 1 Query BEGIN
2021-09-26T03:33:55.563079Z 1 Query DELETE FROM `test`.`checksums` WHERE db = 'test_1' AND tbl = 'a'
2021-09-26T03:33:55.563138Z 1 Query COMMIT /* implicit, from Xid_log_event */
2021-09-26T03:33:55.605247Z 1 Query BEGIN
# 得到从库的表的信息
2021-09-26T03:33:55.615740Z 1 Query REPLACE INTO `test`.`checksums` (db, tbl, chunk, chunk_index, lower_boundary, upper_boundary, this_cnt, this_crc) SELECT 'test_1', 'a', '1', NULL, NULL, NULL, COUNT(*) AS cnt, COALESCE(LOWER(CONV(BIT_XOR(CAST(CRC32(CONCAT_WS('#', `id`, convert(`name` using utf8mb4), CONCAT(ISNULL(`name`)))) AS UNSIGNED)), 10, 16)), 0) AS crc FROM `test_1`.`a` /*checksum table*/
2021-09-26T03:33:55.615796Z 1 Query COMMIT /* implicit, from Xid_log_event */
2021-09-26T03:33:55.642320Z 1 Query BEGIN
# 把主库的master信息更改到从库的checksums表
2021-09-26T03:33:55.642652Z 1 Query UPDATE `test`.`checksums` SET chunk_time = '0.025988', master_crc = '9bf4b9e7', master_cnt = '10001' WHERE db = 'test_1' AND tbl = 'a' AND chunk = '1'
2021-09-26T03:33:55.642688Z 1 Query COMMIT /* implicit, from Xid_log_event */
2021-09-26T03:33:55.658313Z 8 Query SHOW SLAVE STATUS
2021-09-26T03:33:55.694870Z 8 Query SHOW SLAVE STATUS
2021-09-26T03:33:55.703848Z 8 Query SHOW VARIABLES LIKE 'version%'
2021-09-26T03:33:55.714159Z 8 Query SHOW ENGINES
2021-09-26T03:33:55.722964Z 8 Query SHOW VARIABLES LIKE 'innodb_version'
2021-09-26T03:33:55.733449Z 8 Query SELECT MASTER_POS_WAIT('mysql-bin.000002', 3474110, 60 )
2021-09-26T03:33:55.742120Z 8 Query SELECT MAX(chunk) FROM `test`.`checksums` WHERE db='test_1' AND tbl='a' AND master_crc IS NOT NULL
# 查看数据是否同步
2021-09-26T03:33:55.751125Z 8 Query SELECT CONCAT(db, '.', tbl) AS `table`, chunk, chunk_index, lower_boundary, upper_boundary, COALESCE(this_cnt-master_cnt, 0) AS cnt_diff, COALESCE(this_crc <> master_crc OR ISNULL(master_crc) <> ISNULL(this_crc), 0) AS crc_diff, this_cnt, master_cnt, this_crc, master_crc FROM `test`.`checksums` WHERE (master_cnt <> this_cnt OR master_crc <> this_crc OR ISNULL(master_crc) <> ISNULL(this_crc)) AND (db='test_1' AND tbl='a')
2021-09-26T03:33:55.768591Z 8 Quit
三、参数详解
参数 | 意义 |
---|---|
--binary-index | 此选项修改 --create-replicate-table 的行为,以便使用 BLOB 数据类型创建复制表的上下边界列 |
--channel=s | 多远复制管道名称 |
--[no]check-binlog-format | 检查binlog-format在所有服务器是否一致 |
--[no]check-plan | 检查执行计划的安全性 |
--chunk-index=s | 指定分块的索引 |
--chunk-index-columns=I | 在复合索引中指定分块字段 |
--chunk-size=z | 为每个校验和查询选择的行数。允许的后缀为 k、M、G。在大多数情况下不应使用此选项 |
--chunk-time=f | 动态调整块大小,以便每个校验和查询都需要这么长时间来执行,默认0.5s |
--create-replicate-table | 如果表不存在则创建 |
--disable-qrt-plugin | 禁用qrt插件 |
--[no]empty-replicate-table | 在对表进行校验和之前,删除每个表的先前校验和。 |
--fail-on-stopped-replication | 如果复制停止,则失败并显示错误(退出状态 128),而不是等到复制重新启动 |
--float-precision=I | FLOAT 和 DOUBLE 数字到字符串转换的精度,如果指定值 2,则值 1.008 和 1.009 将四舍五入为 1.01,并且校验和相等 |
--function=s | 校验和的散列函数(FNV1A_64、MURMUR_HASH、SHA1、MD5、CRC32 等) |
--pause-file=s | 当此参数指定的文件存在时,执行将暂停 |
--pid=s | 创建给定的 PID 文件。如果 PID 文件已存在且其中包含的 PID 与当前 PID 不同,则该工具将不会启动。但是,如果 PID 文件存在并且其中包含的 PID 不再运行,则该工具将使用当前 PID 覆盖 PID 文件。工具退出时,PID 文件会自动删除 |
--plugin=s | 定义pt_table_checksum_plugin类的Perl 模块文件 |
--progress=a | 向 STDERR 打印进度报告。该值是一个包含两部分的逗号分隔列表。第一部分可以是百分比、时间或迭代;第二部分指定更新的打印频率,以百分比、秒或迭代次数为单位。 |
--quiet | 仅打印最重要的信息(禁用–progress) |
--recurse=i | 发现副本时要在层次结构中递归的级别数 |
--recursion-method=a | 发现副本的首选递归方法 |
--replicate=s | 将校验和结果写入此表 |
--[no]replicate-check | 完成每个表后检查副本的数据差异 |
--replicate-check-only | 在不执行校验和查询的情况下检查副本的一致性 |
--replicate-check-retries=i | 遇到差异时,多次重试校验和比较 |
--replicate-database=s | 仅使用此数据库,避免基于语句复制并复制过滤时造成从库checksum报错 |
--resume | 从最后一个完成的块恢复校验和 |
--retries=i | 当出现非致命错误时,多次重试块 |
--run-time=m | 跑多久。默认是运行直到所有表都被校验和 |
--separator=s | 用于 CONCAT_WS() 的分隔符。该字符用于在校验和时连接列的值 |
--skip-check-slave-lag=d | 检查从设备滞后时要跳过的 DSN。它可以多次使用。示例:–skip-check-slave-lag h=127.1,P=12345 –skip-check-slave-lag h=127.1,P=12346 |
--slave-password=s | 从库密码 |
--slave-skip-tolerance=f | 当主表被标记为仅在一个块中进行校验和但从表超过了最大可接受大小时,该表将被跳过。由于行数通常是粗略估计,因此很多时候由于非常小的差异而不必要地跳过表。此选项提供最大行过量容差以防止出现这种情况。例如,值 1.2 将允许从表最多有 20% 的多余行。 |
--slave-user=s | 从库用户 |
--trim | 将 TRIM() 添加到 VARCHAR 列(有助于将 4.1 与 >= 5.0 进行比较) |
--truncate-replicate-table | 在开始校验和之前截断复制表。此参数与 –empty-replicate-table 不同,后者仅在启动该表的校验和时删除被校验和的表的行,而 –truncate-replicate-table 将在进程开始时截断复制表,因此,所有即使进程因错误而停止,先前的校验和信息也将丢失 |
--[no]version-check | 检查 Percona Toolkit、MySQL 和其他程序的最新版本 |
--where=s | 仅执行与此 WHERE 子句匹配的行。 |
--config=A | 个逗号分隔的配置文件列表;如果指定,这必须是命令行上的第一个选项 |
--ask-pass | 输入密码 |
--defaults-file=s | 仅从给定文件中读取 mysql 选项。您必须提供绝对路径名。 |
--host=s | host |
--password=s | 密码 |
--port=i | 端口 |
--set-vars=A | 在这个以逗号分隔的variable=value对列表中设置 MySQL 变量。例:--set-vars wait_timeout=500 |
--socket=s | socket文件 |
--user=s | 用户 |
--columns=a | 校验时指定的字段,逗号分隔 |
--databases=h | 校验时指定的库,逗号分隔 |
--databases-regex=s | 只校验和名称与此 Perl 正则表达式匹配的数据库。 |
--engines=h | 只校验和这些存储引擎的表 |
--tables=H | 校验指定的表,逗号分隔 |
--tables-regex= | 校验名称与 Perl 正则表达式匹配的表 |
--ignore-columns=H | 校验时忽略的字段,逗号分隔 |
--ignore-databases=H | 校验时忽略的库,逗号分隔 |
--ignore-databases-regex=s | 忽略验和名称与此 Perl 正则表达式匹配的数据库 |
--ignore-engines=H | 忽略校验和这些存储引擎的表 |
--ignore-tables=H | 校验时忽略的表,逗号分隔 |
--ignore-tables-regex= | 忽略名称与 Perl 正则表达式匹配的表 |
--[no]check-replication-filters | 检查所有副本上的复制过滤器,因为它们会使校验和过程复杂化或中断。默认情况下,如果找到任何复制过滤器,该工具将退出,但可以通过指定禁用此检查–no-check-replication-filters。 |
--[no]check-slave-tables | 检查从站上的表是否存在并具有所有校验和–columns。从服务器上缺少表或没有所有校验和–columns可能会导致工具在尝试检查差异时中断复制。仅当您意识到风险并确保所有从站上的所有表都存在且与主站相同时,才禁用此检查 |
--chunk-size-limit=f | 当表没有唯一索引时,块大小可能不准确。此选项指定不准确度的最大可容忍限制。该工具使用 来估计块中有多少行。如果该估计值超过所需的块大小乘以限制(默认情况下为两倍),则该工具将跳过该块。此选项的最小值为 1 |
–check-interval=m | 如果副本滞后大于 --max-lag 则休眠指定时间再次进行检查(默认为 1)。 可选后缀 s=seconds, m=minutes, h=hours, d=days; 如果没有后缀,则使用 s。 |
--check-slave-lag=s | 暂停校验和,直到此副本的滞后小于–max-lag |
--max-lag=m | 暂停校验和,直到所有副本的滞后小于此值 |
--max-load=A | 在每个块之后检查 SHOW GLOBAL STATUS,如果任何状态变量高于阈值,则暂停。该选项接受以逗号分隔的 MySQL 状态变量列表来检查阈值。一个可选的=MAX_VALUE(或 :MAX_VALUE)可以跟在每个变量之后。如果未给出,该工具通过检查当前值并将其增加 20% 来确定阈值,例:Threads_connected:110 |
官网地址: https://www.percona.com/doc/percona-toolkit/LATEST/index.html