percona-toolkit常用工具的使用

percona-toolkit工具的使用

文章目录

  • percona-toolkit工具的使用
    • 说明
    • 安装
    • 具体工具介绍
    • 工具原理与使用
      • pt-online-schema-change
        • 功能
        • 基本原理
        • 流程图
        • 用法
        • 使用示例
      • pt-heartbeat
        • 功能
        • 基本原理
        • 流程图
        • 用法
        • 使用示例
      • pt-table-checksum
        • 功能
        • 基本原理
          • 工作过程
        • 流程图
        • 用法
        • 使用示例
      • pt-kill
        • 功能
        • 基本原理
        • 流程图
        • 用法
        • 使用示例
      • pt-duplicate-key-checker
        • 功能
        • 基本原理
        • 用法
        • 使用示例
      • pt-deadlock-logger
        • 功能
        • 基本原理
        • 用法
        • 使用示例
      • pt-table-sync
        • 功能
        • 描述
        • 算法
        • 双向同步
        • 限制
        • 基本原理
        • 用法
        • 使用示例
      • pt-visual-explain
        • 功能
        • 用法
        • 使用示例
      • pt-variable-advisor
        • 功能
        • 描述
        • 规则
        • 用法
        • 使用示例
      • pt-mysql-summary
        • 功能
        • 描述
        • 输出
        • 用法
        • 使用示例

说明

pt(Percona Toolkit)工具是由Percona公司开发的一个用perl语言编写的工具集,包含很多功能,例如在线更改数据表结构,校验主从数据,检查数据库状态,分析慢查询等。依靠这些工具可以帮助DBA更简单的维护及优化MySQL数据库。

安装

  • 官方地址:https://www.percona.com/downloads/percona-toolkit

  • 检查依赖包

    rpm -qa perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL perl-Digest-MD5
    
  • 若有依赖包缺失

    yum install perl-DBI
    
    yum install perl-DBD-MySQL
    
    yum install perl-Time-HiRes
    
    yum install perl-IO-Socket-SSL
    
    yum install perl-Digest-MD5
    
  • 下载二进制包并上传

    mkdir /app
    
    #Windows
    cd 文件路径
    scp .\percona-toolkit-3.3.1_x86_64.tar.gz root@部署机ip:/app
    
    [root@localhost ~]# ls /app/
    percona-toolkit-3.3.1_x86_64.tar.gz
    
  • 开始安装

    实际上,我更推荐yum直接安装percona-toolkit,那样可以大大增加容错率,并且减少了安装步骤,方便软件管理

    tar -zxvf percona-toolkit-3.3.1_x86_64.tar.gz
    
    mv percona-toolkit-3.3.1 percona-toolkit
    
    #配置环境变量
    cat >> /etc/profile <
  • 检查

    pt-query-digest --help
    pt-table-checksum --help
    
    #出现帮助信息则安装成功
    

具体工具介绍

工具类别 工具命令 工具作用 备注
开发类
pt-duplicate-key-checker 在 MySQL 表上查找重复的索引和外键,并生成删除重复索引的语句 该程序检查 MySQL 表上的 SHOW CREATE TABLE 的输出,如果它发现索引以相同的顺序覆盖与另一个索引相同的列,或者覆盖另一个索引的最左边的前缀,它会打印出可疑索引。它还查找重复的外键。
pt-online-schema-change 更改表结构而不锁定它们 pt-online-schema-change通过创建表的空副本进行更改,根据需要修改它,然后将原始表中的行复制到新表中。复制完成后,它会移走原始表格并用新表格替换它。默认情况下,它还删除原始表。
pt-show-grants 规范化和打印 MySQL 权限,以便可以有效地复制、比较和版本控制它们
pt-upgrade 验证不同服务器上的查询结果是否相同 pt-upgrade有助于确定升级(或降级)到新版本的 MySQL 是否安全。一个安全而保守的升级计划有几个步骤,其中之一是确保查询在新版本的 MySQL 上产生相同的结果。pt-upgrade在两台服务器上执行来自慢速、一般、二进制、tcpdump 和“原始”日志的查询,比较每个查询的执行和结果的许多方面,并报告任何显着差异。
性能类 pt-index-usage 从日志中读取查询并分析它们如何使用索引 该工具连接到 MySQL 数据库服务器,读取查询日志,并使用 EXPLAIN 询问 MySQL 它将如何使用每个查询。完成后,它会打印出有关查询未使用的索引的报告。
pt-pmp 为查询程序执行聚合的GDB堆栈跟踪,先进性堆栈跟踪,然后将跟踪信息汇总 pt-pmp执行两项任务:获取堆栈跟踪,并汇总堆栈跟踪。如果在命令行上给出了一个文件,该工具将跳过第一步并只聚合该文件。
pt-visual-explain 将 EXPLAIN 输出格式化为树,方便阅读 pt-visual-explain 将MySQL 的 EXPLAIN 输出反向工程为查询执行计划,然后将其格式化为左深树 - 与 MySQL 中表示计划的方式相同
pt-table-usage 分析查询如何使用表 pt-table-usage从日志中读取查询并分析它们如何使用表。日志应该是 MySQL 的慢查询日志格式。
配置类 pt-config-diff 比较 MySQL 配置文件和服务器参数 pt-config-diff通过检查来自命令行上指定的两个或多个 CONFIG 源的服务器系统变量的值来区分 MySQL 配置。
pt-mysql-summary 精细地对mysql的配置和status信息进行汇总 pt-mysql-summary通过连接到MySQL数据库服务器和查询它的状态和配置信息。它将这些位数据保存到临时目录中的文件中,然后使用 awk 和其他脚本语言将它们整齐地格式化。
pt-variable-advisor 分析 MySQL 参数并就可能出现的问题提出建议 pt-variable-advisor根据一定的规则检查错误的值和设置。它报告与规则匹配的变量,因此您可以在 MySQL 服务器中找到错误的设置
监控类
pt-deadlock-logger 提取和记录 mysql死锁信息 pt-deadlock-logger通过轮询和解析来打印有关 MySQL 死锁的信息。
pt-fk-error-logger 提取和记录 MySQL 外键错误信息 pt-fk-error-logger打印或保存显示INNODB STATUS中的外键错误文本。 错误不会以任何方式进行解析或解释。 外键错误由时间戳唯一标识。 只打印或保存新的(最近的)错误。
pt-mext 并排查看 MySQL SHOW GLOBAL STATUS 的许多示例 pt-mext执行COMMAND指定的内容,并一次读取一行结果。它将每一行放入一个临时文件中。
pt-query-digest 从日志、进程列表和 tcpdump 分析 MySQL 查询 常用命令;PT-查询消化是一个复杂的,但易于使用的工具,用于分析的MySQL查询。它可以分析来自 MySQL 慢日志、一般日志和二进制日志的查询。(二进制日志必须首先转换为文本)
pt-k8s-debug-collector 从 k8s/OpenShift 集群收集调试数据(日志、资源状态等)。数据被打包到当前工作目录中的 cluster-dump.tar.gz 存档 要求:安装和配置 kubectl; 安装和配置 pt-mysql-summary;安装和配置 pt-mongodb-summary
pt-pg-summary 收集有关 PostgreSQL 集群的信息
pt-secure-collect 收集、清理、打包和加密数据 默认情况下,pt-secure-collect将收集以下输出:pt-stalk;pt-summary;pt-mysql-summary
复制类
pt-heartbeat 监控 mysql复制延迟 pt-heartbeat是一个由两部分组成的 MySQL 和 PostgreSQL 复制延迟监控系统,它通过查看实际复制数据来测量延迟。
pt-slave-delay 使 MySQL 从属服务器落后于其主服务器指定时间 pt-slave-delay监视从服务器,并根据需要启动和停止它的复制SQL线程,以使它至少按照您的请求保持在主服务器后面。
pt-slave-find 查找和打印 MySQL 从站的复制层次树 pt-slave-find连接到 MySQL 复制主机并找到它的从属。目前它唯一能做的就是打印复制层次结构的树状视图。
pt-slave-restart 在出错后观察并重启 MySQL 复制 pt-slave-restart监视一个或多个 MySQL 复制从属并尝试跳过导致错误的语句。它以指数变化的睡眠时间智能地轮询奴隶。您可以指定错误以跳过并运行从站直到某个 binlog 位置。
pt-table-checksum 校验主从复制一致性 pt-table-checksum通过在 master 上执行校验和查询来执行在线复制一致性检查,这会在与 master 不一致的副本上产生不同的结果。
pt-table-sync 高效同步 MySQL 表数据 pt-table-sync对表数据进行单向和双向同步。它并没有同步表结构,索引,或任何其他模式对象。
系统类
pt-diskstats 用于 GNU/Linux 的交互式 I/O 监控工具 比iostat更详细
pt-fifo-split 模拟切割文件并通过管道传递给先入先出队列而不用真正的切割文件 pt-fifo-split将 FILE 和管道线拆分为 fifo。没有 FILE 或 FILE 为 - 时,读取标准输入。
pt-summary 很好地总结系统信息 pt-summary运行多种命令来检查系统状态和配置,将输出保存到临时目录中的文件中,然后对这些结果运行 Unix 命令以很好地格式化它们。
pt-stalk 出现问题时收集有关 MySQL 的取证数据 pt-stalk做两件事:它监视 MySQL 服务器并等待触发条件发生,并在该触发发生时收集诊断数据。
pt-sift 浏览由 pt-stalk创建的文件
pt-ioprofile 监视进程 IO 并打印文件和 I/O 活动表 pt-ioprofile 会冻结服务器并可能导致进程崩溃,或者在分离后使其性能不佳,或让它处于睡眠状态!pt-ioprofile应被视为侵入性工具,不应在生产服务器上使用
实用类
pt-archiver 将 MySQL 表中的数据存档到另一个表或文件中 pt-archiver是可以用来存档表的工具。 目标是一个低影响、仅向前的作业,以便在不太影响OLTP(日常操作处理)查询的情况下从表中删除旧数据。 您可以将数据插入到另一个表中,该表不需要位于同一服务器上。 还可以将其以适合于LOAD DATA INFILE的格式写入文件。
pt-find 查找 MySQL 表并执行操作,如 GNU find pt-find查找通过您指定的测试的 MySQL 表,并执行您指定的操作。默认操作是将数据库和表名打印到 STDOUT。pt-find比 GNU find 简单。它不允许您在命令行上指定复杂的表达式。
pt-kill 杀死符合特定条件的 MySQL 查询 常用命令;pt-kill从 SHOW PROCESSLIST 捕获查询,过滤它们,然后杀死或打印它们。
pt-align 格式化输出,对齐其他工具输出的列 pt-align将其他工具的输出与列对齐。如果未指定 FILES,则读取 STDIN。
pt-fingerprint 将查询转换为密文 查询指密文是查询的抽象形式,可以将相似的查询组合在一起。抽象查询删除文字值,规范化空格,等等。

工具原理与使用

pt-online-schema-change

功能

不锁表在线更改表结构

基本原理

pt-online-schema-change 模拟 MySQL 在内部更改表的方式,但它作用于你希望更改的表的副本。所以原始表并没有被锁定,客户端仍然可以继续读取和更改其中的数据

pt-online-schema-change 通过创建表的空副本进行更改,根据需要修改它,然后将原始表中的行复制到新表中。复制完成后,它会移走原始表格并用新表格替换它。默认情况下,它还会删除原始表。

数据复制过程是在小块数据中执行的,这些数据块会发生变化以尝试使它们在特定的时间量内执行(详细请看下方--chunk-time参数)。复制过程中对原始表中数据的任何修改都会反映在新表中,因为该工具会在原始表上创建触发器来更新新表中的相应行。触发器的使用意味着如果表上已经定义了任何触发器,则该工具将无法工作。

当该工具完成将数据复制到新表中时,它使用原子 RENAME TABLE 操作同时重命名原始表和新表。完成后,该工具删除原始表。

外键使工具的操作复杂化并引入额外的风险。当外键引用表时,原子地重命名原始表和新表的技术不起作用。在架构更改完成后,该工具必须更新外键以引用新表。该工具支持两种方法来实现这一点。您可以在 --alter-foreign-keys-method指定更新外键方法

外键也会引起一些副作用。最终表将具有与原始表相同的外键和索引(除非您在 ALTER 语句中指定不同),但可能会稍微更改对象的名称以避免 MySQL 和 InnoDB 中的对象名称冲突。

为安全起见,除非您指定--execute选项,否则该工具不会修改表,默认情况下该选项未启用。该工具支持多种其他措施来防止不必要的负载或其他问题,包括自动检测副本、连接到它们以及使用以下安全检查:

  • 在大多数情况下,除非表中存在 PRIMARY KEY 或 UNIQUE INDEX,否则该工具将拒绝操作。详情请参阅--alter
  • 如果检测到复制过滤器,该工具将拒绝运行。详情请参阅 --[no]check-replication-filters
  • 如果该工具观察到任何复制延迟的副本,它就会暂停数据复制操作。详情请参阅--max-lag
  • 如果检测到服务器上的负载过多,该工具将暂停或中止其操作。查看--max-load--critical-load了解详情。
  • 工具集innodb_lock_wait_timeout=1和(适用于 MySQL 5.5 和更新版本) lock_wait_timeout=60使其更有可能成为任何锁争用的受害者,并且不太可能中断其他事务。可以通过指定--set-vars更改这些值。
  • 如果外键约束引用该表,该工具将拒绝更改该表,除非您指定--alter-foreign-keys-method

流程图

percona-toolkit常用工具的使用_第1张图片

用法

pt-online-schema-change [OPTIONS] DSN

#OPTIONS
#--dry-run并且--execute是互斥的

--alter
#类型:字符串
#模式修改,没有 ALTER TABLE 关键字。您可以通过用逗号指定来对表执行多次修改。ALTER TABLE 的语法请参考 MySQL 手册
#以下限制适用,如果尝试,将导致工具以不可预测的方式失败:
#	1.在几乎所有情况下,表中都需要存在 PRIMARY KEY 或 UNIQUE INDEX。这是必要的,因为该工具会创建	一个 DELETE 触发器,以在进程运行时保持新表的更新,一个值得注意的例外是当 PRIMARY KEY 或 			UNIQUE INDEX作为 ALTER 子句的一部分从现有列创建时 ;在这种情况下,它将使用这些列作为 DELETE 	触发器。
#	2.该RENAME子句不能用于重命名表。
#	3.不能通过删除和重新添加新名称来重命名列。该工具不会将原始列的数据复制到新列。
#	4.如果您添加一个没有默认值的列并将其设为 NOT NULL,则该工具将失败,因为它不会尝试为您猜测默认	值;您必须指定默认值。
#	5.DROP FOREIGN KEY constraint_name需要指定_constraint_name 而不是真实的				constraint_name. 由于 MySQL 的限制, pt-online-schema-change在创建新表时为外键约束名称添	加前导下划线。例如,要删除此约束:
#		CONSTRAINT `fk_foo` FOREIGN KEY (`foo_id`) REFERENCES `bar` (`foo_id`)
#		你必须指定.--alter "DROP FOREIGN KEY _fk_foo"。
#	6.该工具不与 MySQL 5.0 的LOCK IN SHARE MODE一起使用,因为它可能导致从属错误,从而中断复制:
#		Query caused different errors on master and slave. Error on master:
#		'Deadlock found when trying to get lock; try restarting transaction' (1213),
#		Error on slave: 'no error' (0). Default database: 'pt_osc'.
#		Query: 'INSERT INTO pt_osc.t (id, c) VALUES ('730', 'new row')'
#	将 MyISAM 表转换为 InnoDB 时会发生错误,因为 MyISAM 是非事务性的,而 InnoDB 是事务性的。	MySQL 5.1 和更新版本正确地处理了这种情况,但在 MySQL 5.0 中测试重现了 5% 的错误。
#	这是一个 MySQL 错误,类似于http://bugs.mysql.com/bug.php?id=45694,但在 MySQL 5.0 中没		有LOCK IN SHARE MODE修复或解决方法。如果没有,测试会在 100% 的时间内通过,因此数据丢失或复制	  中断的风险应该可以忽略不计。

--alter-foreign-keys-method
#类型:字符串
#如何修改外键以便它们引用新表。必须特别对待引用要更改的表的外键,以确保它们继续引用正确的表。当该工具重命名原始表以让新表取而代之时,外键“跟随”重命名的表,并且必须改为引用新表。
#该工具支持两种技术来实现这一点。它会自动查找引用要更改的表的“子表”。
#	1.auto:
#		自动确定哪种方法最好。该工具rebuild_constraints在可能的情况下使用,如果没有,则使用				drop_swap.
#	2.rebuild_constraints:
#		此方法用ALTER TABLE删除和重新添加引用新表的外键约束。这是首选技术,除非一个或多个“子”表太大		而ALTER需要太长时间。该工具通过将子表中的行数与该工具能够将行从旧表复制到新表的速率来确定。		如果该工具估计可以在比 --chunk-time 更短的时间内更改子表 ,那么它将使用此技术。为了估计更		改子表所需的时间,该工具将行复制速率乘以--chunk-size-limit,因为 MySQL ALTER TABLE 通		 常比复制行的外部过程快得多。
#		由于 MySQL 中的限制,外键在 ALTER 之后不会具有与之前相同的名称。该工具在重新定义外键时必须		重命名外键,这会在名称中添加前导下划线。在某些情况下,MySQL 还会自动重命名外键所需的索引。
#	3.drop_swap
#		禁用外键检查 (FOREIGN_KEY_CHECKS=0),然后在将新表重命名到其位置之前删除原始表。这与交换旧		表和新表的常规方法不同,后者使用原子RENAME客户端应用程序无法检测到。
#		这种方法速度更快并且不会阻塞,但由于两个原因而风险更大。首先,在删除原始表和重命名临时表之间的		   短时间内,要更改的表根本不存在,对其进行查询将导致错误。其次,如果出现错误并且新表无法重命名到		  旧表的位置,那么中止已经来不及了,因为旧表已经永久消失了。
#		这种方法强制--no-swap-tables和--no-drop-old-table。
#	4.none
#	这种方法就像drop_swap没有“交换”一样。任何引用原始表的外键现在都将引用不存在的表。这通常会导致在 SHOW ENGINE INNODB STATUS 中可见的外键违规,类似于以下内容:
#		Trying to add to index `idx_fk_staff_id` tuple:
#		DATA TUPLE: 2 fields;
#		0: len 1; hex 05; asc  ;;
#		1: len 4; hex 80000001; asc     ;;
#		But the parent table `sakila`.`staff_old`
#		or its .ibd file does not currently exist!
#	这是因为原始表(在本例中为 sakila.staff)被重命名为 sakila.staff_old 然后被删除。提供了这种	 处理外键约束的方法,以便数据库管理员可以在需要时禁用该工具的内置功能。

--[no]analyze-before-swap
#默认:yes
#在与旧表交换之前对新表执行 ANALYZE TABLE。默认情况下,这仅在运行 MySQL 5.6 及更高版本时发生,并且 innodb_stats_persistent 已启用。显式指定该选项以启用或禁用它,无论 MySQL 版本和innodb_stats_persistent.
#这避免了与 InnoDB 优化器统计信息相关的潜在严重问题。如果被提醒的表很忙并且工具很快完成,则新表在交换后将没有优化器统计信息。这会导致使用索引的快速查询执行全表扫描,直到更新优化器统计信息(通常在 10 秒后)。如果表很大并且服务器很忙,这可能会导致中断。

--ask-pass
#隐式输入密码。

--channel
#类型:字符串
#使用复制通道连接到服务器时使用的通道名称。假设您有两个 master,master_a 在端口 12345,master_b 在端口 1236 和一个 slave 使用通道 chan_master_a 和 chan_master_b 连接到两个 master。如果你想运行 pt-table-sync 来将 slave 与 master_a 同步,pt-table-sync 将无法确定什么是正确的 master,因为 SHOW SLAVE STATUS 将返回 2 行。在这种情况下,您可以使用 –channel=chan_master_a 指定要在 SHOW SLAVE STATUS 命令中使用的频道名称。

--charset
#简写:-A; 类型:字符串
#默认字符集。如果值为 utf8,则将 Perl 在 STDOUT 上的 binmode 设置为 utf8,将 mysql_enable_utf8 选项传递给 DBD::mysql,并在连接到 MySQL 后运行 SET NAMES UTF8。任何其他值在没有 utf8 层的 STDOUT 上设置 binmode,并在连接到 MySQL 后运行 SET NAMES。

--[no]check-alter
#默认:yes
#解析--alter指定的并尝试警告可能的意外行为。目前,它检查:
#	1.列重命名
#	在该工具的早期版本中,重命名列 CHANGE COLUMN name new_name 会导致该列的数据丢失。该工具现在	解析 alter 语句并尝试捕获这些情况,因此重命名的列应具有与原始列相同的数据。但是,执行此操作的代码	不是完整的 SQL 解析器,因此你应该首先使用 --dry-run 和 --print 运行该工具并验证它是否正确检测	   到重命名的列。
#	2.删除主键
#	如果--alter包含 DROP PRIMARY KEY (不区分大小写和空格),则除非指定了 --dry-run,否则将打印警	告并退出该工具。更改主键可能很危险,但该工具可以处理它。该工具的触发器,尤其是 DELETE触发器,受更	改主键的影响最大,因为该工具更喜欢使用主键作为其触发器。您应该首先使用 --dry-run 和--print 运	行该工具并验证触发器是否正确。

--[no]check-foreign-keys
#默认:yes
#检查自引用外键。当前不完全支持自引用 FK,因此,为防止错误,如果表具有自引用外键,则该程序将不会运行。使用此参数可禁用自引用 FK 检查。

--check-interval
#类型:time;默认值:1
#检查之间的睡眠时间--max-lag。

--[no]check-plan
#默认:yes
#检查查询执行计划的安全性。默认情况下,此选项会导致该工具在运行旨在访问少量数据的查询之前运行 EXPLAIN,但如果 MySQL 选择了错误的执行计划,则可能会访问许多行。这些包括确定块边界的查询和块查询本身。如果看起来 MySQL 将使用错误的查询执行计划,该工具将跳过表的块。
#该工具使用几种启发式方法来确定执行计划是否错误。第一个是 EXPLAIN 是否报告 MySQL 打算使用所需的索引来访问行。如果 MySQL 选择不同的索引,该工具会认为查询不安全。
#该工具还会检查 MySQL 报告将用于查询的索引量。EXPLAIN 输出在 key_len 列中显示了这一点。该工具会记住所看到的最大 key_len,并跳过 MySQL 报告它将使用较小的索引前缀的块。这种启发式可以理解为跳过执行计划比其他块更差的块。
#由于每个表中的执行计划错误,该工具会在第一次跳过块时打印警告。尽管您可以在工具输出的 SKIPPED 列中看到跳过的块的计数,但随后的块会以静默方式跳过。
#此选项为每个表和块添加了一些设置工作。虽然这项工作对 MySQL 没有侵入性,但它会导致更多的服务器往返,这会消耗时间。使块太小会导致开销变得相对较大。因此,建议您不要将块设置得太小,因为如果这样做,该工具可能需要很长时间才能完成。

--[no]check-replication-filters
#默认:yes
#如果在任何服务器上设置了任何复制过滤器,则中止。该工具会查找过滤复制的服务器选项,例如 binlog_ignore_db 和replicate_do_db。如果它找到任何这样的过滤器,它会因错误而中止。
#如果副本配置了任何过滤选项,则应注意不要修改主服务器上存在的任何数据库或表,而不是副本,因为这可能导致复制失败。

--check-slave-lag
#类型:字符串
#暂停数据复制,直到此副本的滞后小于--max-lag。该值是一个从连接选项(——port、——user等)继承属性的DSN。此选项会覆盖在所有连接的副本上查找和持续监控复制延迟的正常行为。如果你不想监视所有副本,但希望监视多个副本,请使用DSN选项来代替——recursion-method选项。

--chunk-index
#类型:字符串
#最好将此索引用于分块表。默认情况下,该工具会选择最合适的索引进行分块。此选项可让您指定你喜欢的索引。如果索引不存在,则该工具将回退到选择索引的默认行为。该工具将索引添加到FORCE INDEX 子句中的 SQL 语句。使用此选项时要小心;索引选择不当可能会导致性能不佳。

--chunk-index-columns
#类型:int
#只使用 a 最左边的这么多列--chunk-index。这仅适用于复合索引,并且在 MySQL 查询优化器(规划器)中的错误导致它扫描大范围的行而不是使用索引来精确定位起点和终点的情况下很有用。此问题有时会出现在具有许多列(例如 4 个或更多)的索引上。如果发生这种情况,该工具可能会打印与该--[no]check-plan选项相关的警告 。在某些情况下,指示工具仅使用索引的前 N 列是该错误的解决方法。

--chunk-size
#类型:size;默认值:1000
#为每个复制的块选择的行数。允许的后缀为 k、M、G。
#此选项可以覆盖默认行为,即动态调整块大小以尝试使块在--chunk-time几秒钟内运行。如果未明确设置此选项,则使用其默认值作为起点,但此后,该工具将忽略此选项的值。但是,如果你显式设置此选项,则会禁用动态调整行为并尝试使所有块完全符合指定的行数。
#有一个微妙之处:如果块索引不是唯一的,那么块可能会比预期的要大。例如,如果一个表按包含 10,000 个给定值的索引进行分块,则无法编写仅匹配 1,000 个值的 WHERE 子句,并且该块将至少有 10,000 行大。这样的块可能会被跳过,因为——chunk-size-limit。

--chunk-size-limit
#类型:float;默认值:4.0
#不要复制比所需块大小大得多的块。
#当表没有唯一索引时,块大小可能不准确。此选项指定不准确度的最大可容忍限制。该工具使用  来估计块中有多少行。如果该估计值超过所需块大小乘以限制,则该工具将跳过该块。
#此选项的最小值为 1,这意味着任何块都不能大于--chunk-size。您可能不想指定 1,因为 EXPLAIN 报告的行是估计值,可能与块中的实际行数不同。您可以通过指定值 0 来禁用超大块检查。
#该工具还使用此选项来确定如何处理引用要更改的表的外键。详情请参阅--alter-foreign-keys-method。

--chunk-time
#类型:float;默认值:0.5
#动态调整块大小,以便每个数据复制查询都需要这么长时间来执行。该工具会跟踪复制速率(每秒行数)并在每次数据复制查询后调整块大小,以便下一个查询花费此时间(以秒为单位)来执行。它保持每秒查询的指数衰减移动平均值,因此如果服务器的性能因服务器负载的变化而发生变化,该工具可以快速适应。
#如果此选项设置为零,则块大小不会自动调整,因此查询时间会有所不同,但查询块大小不会。做同样事情的另一种方法是--chunk-size明确指定一个值,而不是将其保留为默认值。

--config
#类型:数组
#阅读这个逗号分隔的配置文件列表;如果指定,这必须是命令行上的第一个选项。

--critical-load
#类型:数组;默认值:Threads_running=50
#在每个块之后检查 SHOW GLOBAL STATUS,如果负载过高则中止。该选项接受以逗号分隔的 MySQL 状态变量和阈值列表。一个可选的=MAX_VALUE(或:MAX_VALUE)可以跟在每个变量之后。如果未给出,该工具通过检查启动时的当前值并将其加倍来确定阈值。
#详见--max-load。这些选项的工作方式类似,不同之处在于此选项将中止工具的操作而不是暂停它,并且如果您未指定阈值,则默认值的计算方式不同。使用此选项的原因是为了安全检查,以防原始表上的触发器向服务器增加太多负载,从而导致停机。可能没有 Threads_running 的单个值对每个服务器都是错误的,但是对于大多数服务器来说,默认值 50 似乎高得无法接受,这表明应该立即取消操作。

--database
#简写:-D; 类型:字符串
#连接到这个数据库。

--default-engine
#从新表中删除ENGINE。  
#默认情况下,新表使用与原始表相同的表选项创建,因此如果原始表使用 InnoDB,那么新表将使用 InnoDB。在某些涉及复制的情况下,这可能会导致对同一表使用不同引擎的副本发生意外更改。指定此选项会导致使用系统的默认引擎创建新表。

--data-dir
#类型:字符串
#使用数据目录功能在不同的分区上创建新表。仅适用于 5.6+。如果与 remove-data-dir 同时使用,则忽略此参数。

--remove-data-dir
#默认值:no
#如果原始表是使用 DATA DIRECTORY(data directory) 功能创建的,请将其删除并在 MySQL 默认目录中创建新表,而无需创建新的 isl 文件。

--defaults-file
#简写:-F; 类型:字符串
#仅从给定文件中读取 mysql 选项。您必须提供绝对路径名。

--[no]drop-new-table
#默认:yes
#如果复制原始表失败,则删除新表。
#指定--no-drop-new-table和--no-swap-tables保留表的新更改副本,而不修改原始表。详细见 --new-table-name。
#--no-drop-new-table 不适用于 alter-foreign-keys-method drop_swap

--[no]drop-old-table
#默认:yes
#重命名后删除原始表。原表成功重命名后,新表取而代之,如果没有错误,工具默认删除原表。如果有任何错误,该工具会保留原始表格。
#如果--no-swap-tables指定,则没有要删除的旧表。

--[no]drop-triggers
#默认:yes
#删除旧表上的触发器。

--dry-run
#创建和更改新表,但不创建触发器、复制数据或替换原始表。

--execute
#表明你已阅读文档并想要更改表格。您必须指定此选项才能更改表。如果不这样做,则该工具将仅执行一些安全检查并退出。这有助于确保您已阅读文档并了解如何使用此工具。如果您尚未阅读文档,请不要指定此选项。

--[no]check-unique-key-change
#默认:yes
#如果--alter的指定语句试图添加唯一索引,则避免运行pt-online-schema-change。因为pt-online-schema-change使用INSERT IGNORE将行复制到新表中,所以如果正在写入的行产生一个重复的键,它将静默失败,数据将丢失。
#使用pt-online-schema-change在unique_id字段上添加唯一索引,将导致由于使用INSERT IGNORE从源表复制行而丢失一些行。因此,如果pt-online-schema-change检测到--alter参数试图添加唯一的键,那么它将失败,并且它将显示一个示例查询,以检测是否有将产生重复索引的行。
#即使您运行查询,并且没有产生重复索引的行,也要考虑到在运行此查询之后,可能会对产生重复行的表进行更改,而这些数据将会丢失。

--force
#如果使用 alter-foreign-keys-method = none ,此选项会绕过确认,这可能会破坏外键约束

--help
#显示帮助并退出。

--host
#简写:-h; 类型:字符串
#连接到主机。

--max-lag
#类型:time;默认值:1s
#暂停数据复制,直到所有副本的滞后小于此值。在每个数据复制查询(每个块)之后,该工具使用 Seconds_Behind_Master 查看它连接到的所有副本的复制延迟。如果任何副本滞后超过此选项的值,则该工具将休眠--check-interval几秒钟,然后再次检查所有副本。如果指定--check-slave-lag,则该工具仅检查该服务器的延迟,而不是所有服务器。如果要准确控制工具监视的服务器,请使用 DSN 值--recursion-method。
#该工具永远等待副本停止滞后。如果任何副本停止,该工具将永远等待,直到副本启动。当所有副本都在运行并且没有滞后太多时,数据复制会继续。
#该工具在等待时打印进度报告。如果副本停止,它会立即打印进度报告,然后在每个进度报告间隔再次打印。

--max-load
#类型:数组;默认值:Threads_running=25
#在每个块之后检查 SHOW GLOBAL STATUS,如果任何状态变量高于它们的阈值,则暂停。该选项接受以逗号分隔的 MySQL 状态变量列表。一个可选的=MAX_VALUE(或:MAX_VALUE)可以跟在每个变量之后。如果未给出,该工具通过检查当前值并将其增加 20% 来确定阈值。
#例如,如果您希望工具在 Threads_connected 过高时暂停,您可以指定“Threads_connected”,工具会在开始工作时检查当前值并将该值增加 20%。如果当前值为100,那么当Threads_connected超过120时工具会暂停,再次低于120时工具会继续工作。如果要指定明确的阈值,例如 110,可以使用“Threads_connected:110”或“Threads_connected=110”。
#此选项的目的是防止该工具向服务器添加过多负载。如果数据复制查询是侵入性的,或者如果它们导致锁等待,那么服务器上的其他查询将倾向于阻塞和排队。这通常会导致 Threads_running 增加,并且该工具可以通过在每个查询完成后立即运行 SHOW GLOBAL STATUS 来检测到这一点。如果为此变量指定阈值,则可以指示工具等待查询再次正常运行。但是,这不会阻止排队;它只会让服务器有机会从排队中恢复。如果您注意到排队,最好减少块时间。

--preserve-triggers
#指定时保留旧触发器。从 MySQL 5.7.2 开始,可以为具有相同触发器事件和操作时间的给定表定义多个触发器。这允许我们添加pt-online-schema-change所需的触发器,即使表已经有自己的触发器。如果启用此选项,pt-online-schema-change将尝试在开始从原始表复制行之前将所有现有触发器复制到新表,以确保在更改表后可以应用旧触发器。
#--preserve-triggers 不能与这些其他参数一起使用:--no-drop-triggers、--no-drop-old-table 和 --no-swap-tables 因为 --preserve-triggers 意味着应该删除旧触发器并在新表。由于不可能有多个同名触发器,因此必须删除旧触发器以便能够将它们重新创建到新表中。
#使用--preserve-triggers和--no-swap-tables将导致触发器保持为原始表定义。请阅读 --swap-tables 的文档
#如果同时--no-swap-tables和--no-drop-new-table设置,触发将继续留在原来的表,将在新表上复制(触发器将有一个随机后缀没有触发名称是唯一的)。

--new-table-name
#类型:字符串;默认值:%T_new
#交换前的新表名。 %T替换为原始表名。使用默认值时,该工具在名称前添加最多 10 _(下划线)以查找唯一的表名称。如果指定了表名,则该工具不会以 为前缀_,因此该表必须不存在。

--null-to-not-null
#允许将允许 NULL 值的列修改为不允许它们的列。包含 NULL 值的行将转换为定义的默认值。如果没有给出明确的 DEFAULT 值,MySQL 将根据数据类型分配一个默认值,例如 0 表示数字数据类型,'' 表示字符串数据类型。

--only-same-schema-fks
#仅在与原始表具有相同架构的表上检查外键。此选项很危险,因为如果您在其他模式中有 FK 引用表,则不会检测到它们。

--password
#简写形式:-p; 类型:字符串
#连接时使用的密码。

--pause-file
#类型:字符串
#当此参数指定的文件存在时,执行将暂停。

--pid
#类型:字符串
#创建给定的 PID 文件。如果 PID 文件已经存在并且它包含的 PID 与当前 PID 不同,则该工具将不会启动。但是,如果 PID 文件存在并且其中包含的 PID 不再运行,则该工具将使用当前 PID 覆盖 PID 文件。工具退出时,PID 文件会自动删除。

--plugin
#类型:字符串
#定义pt_online_schema_change_plugin类的Perl 模块文件。插件允许您编写一个 Perl 模块,该模块可以连接到pt-online-schema-change 的许多部分。这需要对 Perl 和 Percona Toolkit 约定有很好的了解,这超出了本文档的范围。如果您有问题或需要帮助,请联系 Percona。

--port
#简写:-P; 类型:int
#用于连接的端口号。

--print
#将 SQL 语句打印到 STDOUT。指定此选项可让您查看该工具执行的大多数语句。--dry-run例如,您可以将此选项与 一起使用 。

--progress
#类型:数组;默认值:时间,30
#复制行时将进度报告打印到 STDERR。该值是一个包含两部分的逗号分隔列表。第一部分可以是百分比、时间或迭代;第二部分指定更新的打印频率,以百分比、秒或迭代次数为单位。

--quiet
#简写:-q
#不要将消息打印到 STDOUT(禁用--progress)。错误和警告仍会打印到 STDERR。

--recurse
#类型:int
#发现副本时要在层次结构中递归的级别数。默认为无限。另见--recursion-method。

--recursion-method
#类型:数组;默认值:processlist,hosts
#发现副本的首选递归方法。可能的方法有:
#METHOD       USES
#===========  ==================
#processlist  SHOW PROCESSLIST
#hosts        SHOW SLAVE HOSTS
#dsn=DSN      DSNs from a table
#none         Do not find slaves
#1.processlist 方法是默认的,因为 SHOW SLAVE HOSTS 是不可靠的。但是,如果服务器使用非标准端口(不是 3306),hosts 方法可以更好地工作。该工具通常会做正确的事情并找到所有副本,但您可以提供首选方法,它将首先使用。
#2.hosts 方法需要使用 report_host、report_port 等配置副本。
#3.dsn 方法很特殊:它指定一个表,从中读取其他 DSN 字符串。指定的 DSN 必须指定 D 和 t,或数据库限定的 t。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`)
#	);
#要使该工具仅监控主机 10.10.1.16 和 10.10.1.17 的复制延迟,请将值h=10.10.1.16和h=10.10.1.17插入表中。目前,DSN 是按 id 排序的,但 id 和 parent_id 会被忽略。
#你可以在 OSC 执行时更改主机列表:如果您更改 DSN 表的内容,OSC 将很快将其选中。
#--reverse-triggers 以相反的顺序复制在复制过程中添加的触发器。新表中的命令将反映在旧表中。您可以将其用作安全功能,以便旧表继续接收更新。此选项需要--no-drop-old-table.
#警告!此选项在新表开始复制之前在新表上创建反向触发器。新表重命名为其原始名称后,触发器将继续工作。但是因为表缓存中的名称更改元数据版本也会更改,您可能会开始收到“准备好的语句需要重新准备”错误。解决方法是重新准备语句。如果你不使用服务器端准备好的语句,你的应用程序应该不会受到影响。

--skip-check-slave-lag
#类型:DSN;可重复:是
#检查从设备滞后时要跳过的 DSN。它可以多次使用。示例:–skip-check-slave-lag h=127.0.0.1,P=12345 –skip-check-slave-lag h=127.0.0.1,P=12346 请考虑即使对于 MySQL 驱动程序 h=127.1等于h=127.0.0.1,这个参数需要指定完整的IP地址。

--slave-user
#类型:字符串
#设置用于连接到从站的用户。此参数允许您在从站上拥有一个具有较少权限的不同用户,但该用户必须存在于所有从站上。

--slave-password
#类型:字符串
#设置用于连接到从站的密码。它可以与 –slave-user 一起使用,并且所有从站上的用户密码必须相同。

--set-vars
#类型:数组
#在这个以逗号分隔的variable=value对列表中设置 MySQL 变量。
#在命令行上指定的变量会覆盖默认值。
#请注意,设置sql_mode变量需要一些棘手的转义才能解析引号和逗号:
#	例如:--set-vars sql_mode = \' STRICT_ALL_TABLES \\ ,ALLOW_INVALID_DATES \'
#注意引号的单反斜杠和逗号的双反斜杠

--sleep
#类型:float;默认值:0
#复制每个块后休眠多长时间(以秒为单位)。此选项在限制时很有用--max-lag并且--max-load不可能。应该使用一个小的亚秒值,如 0.1,否则该工具可能需要很长时间来复制大表。

--socket
#简写:-S; 类型:字符串
#用于连接的套接字文件。

--statistics
#打印有关内部计数器的统计信息。这对于查看与 INSERT 数量相比抑制了多少警告很有用。

--[no]swap-tables
#默认:yes
#交换原始表和新的、修改过的表。此步骤通过使具有新架构的表代替原始表来完成在线架构更改过程。原始表成为“旧表”,除非您禁用--[no]drop-old-table.
#使用--no-swap-tables将运行整个过程,它将创建新表,它将复制所有行,但最后将删除新表。它旨在运行更现实的试运行。

--tries
#类型:数组
#尝试关键操作的次数。如果某些操作由于非致命的、可恢复的错误而失败,该工具会等待并再次尝试该操作。这些是重试的操作,它们的默认尝试次数和尝试之间的等待时间(以秒为单位):
#OPERATION            TRIES   WAIT
#===================  =====   ====
#create_triggers         10      1
#drop_triggers           10      1
#copy_rows               10   0.25
#swap_tables             10      1
#update_foreign_keys     10      1
#analyze_table           10      1
#要更改默认值,请指定新值,例如:
#	--tries create_triggers:5:0.5,drop_triggers:5:0.5
#这使得该工具的尝试create_triggers,并drop_triggers与尝试之间0.5秒的等待5倍。所以格式是:
#	operation:tries:wait[,operation:tries:wait]
#必须指定所有三个值。
#请注意,由于元数据锁定,大多数操作仅在 MySQL 5.5 和更新版本中受到 lock_wait_timeout(请参阅--set-vars参考资料)的影响。该copy_rows操作在任何版本的 MySQL 中都会受到 innodb_lock_wait_timeout.
#对于创建和删除触发器,尝试次数应用于每个触发器的每个CREATE TRIGGER和DROP TRIGGER语句。对于复制行,尝试的次数适用于每个块,而不是整个表。对于交换表,尝试次数通常应用一次,因为通常只有一条RENAME TABLE语句。对于重建外键约束,尝试的次数应用于每条语句(rebuild_constraints的ALTER语句——ALTER -foreign-keys-method;drop_swap方法的其他语句)。
#如果发生以下错误,该工具会重试每个操作:
#	Lock wait timeout (innodb_lock_wait_timeout and lock_wait_timeout)
#	Deadlock found
#	Query is killed (KILL QUERY )
#	Connection is killed (KILL CONNECTION )
#	Lost connection to MySQL
#在连接丢失和终止的情况下,该工具将自动重新连接。
#失败和重试记录在--statistics。

--user
#简写:-u; 类型:字符串
#如果不是当前用户,则用于登录的用户。

--version
#显示版本并退出。

--[no]version-check
#默认:yes
#检查 Percona Toolkit、MySQL 和其他程序的最新版本。
#这是一个标准的“自动检查更新”功能,还有两个附加功能。首先,该工具会检查自己的版本以及以下软件的版本:操作系统、Percona 监控和管理 (PMM)、MySQL、Perl、Perl 的 MySQL 驱动程序 (DBD::mysql) 和 Percona Toolkit。其次,它会检查存在已知问题的版本并发出警告。例如,MySQL 5.5.25 有一个严重的错误,并被重新发布为 5.5.25a。
#与 Percona 的版本检查数据库服务器的安全连接已完成以执行这些检查。每个请求都由服务器记录,包括被检查系统的软件版本号和唯一 ID。该 ID 由 Percona Toolkit 安装脚本生成,或者在第一次完成版本检查数据库调用时生成。
#在工具正常输出之前,任何更新或已知问题都会打印到 STDOUT。此功能不应干扰工具的正常操作。

使用示例

服务器40段的129,128,131,164;主从关系如下:

128
 |
 --	131
 |
 --	129
	|
    -- 164
#首先创建测试表如下:
mysql> create table test_osc(id int primary key auto_increment);
Query OK, 0 rows affected (0.01 sec)

#1.添加字段
[root@localhost ~]# pt-online-schema-change --alter="add number int" h=localhos
t,u=pcloud,p=pcloud,D=test,t=test_osc --execute
Found 2 slaves:
localhost.localdomain -> 172.18.40.129:socket
localhost.localdomain -> 172.18.40.164:socket
Will check slave lag on:
localhost.localdomain -> 172.18.40.129:socket
localhost.localdomain -> 172.18.40.164:socket
Operation, tries, wait:
  analyze_table, 10, 1
  copy_rows, 10, 0.25
  create_triggers, 10, 1
  drop_triggers, 10, 1
  swap_tables, 10, 1
  update_foreign_keys, 10, 1
Altering `test`.`test_osc`...
Creating new table...
Created new table test._test_osc_new OK.
Altering new table...
Altered `test`.`_test_osc_new` OK.
2021-08-09T16:51:42 Creating triggers...
2021-08-09T16:51:42 Created triggers OK.
2021-08-09T16:51:42 Copying approximately 1 rows...
2021-08-09T16:51:42 Copied rows OK.
2021-08-09T16:51:42 Analyzing new table...
2021-08-09T16:51:42 Swapping tables...
2021-08-09T16:51:42 Swapped original and new tables OK.
2021-08-09T16:51:42 Dropping old table...
2021-08-09T16:51:42 Dropped old table `test`.`_test_osc_old` OK.
2021-08-09T16:51:42 Dropping triggers...
2021-08-09T16:51:42 Dropped triggers OK.
Successfully altered `test`.`test_osc`.

#查看,修改成功
mysql> show create table test_osc;
+----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table    | Create Table

            |
+----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
| test_osc | CREATE TABLE `test_osc` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `number` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

#2.修改字段为非null
#当修改的字段存在空值的时候将报错,需要保证字段有值才可以
[root@localhost ~]# pt-online-schema-change --alter="modify number int not null" h=localhost,u=pcloud,p=pcloud,D=test,t=test_osc --execute
Found 2 slaves:
localhost.localdomain -> 172.18.40.129:socket
localhost.localdomain -> 172.18.40.164:socket
Will check slave lag on:
localhost.localdomain -> 172.18.40.129:socket
localhost.localdomain -> 172.18.40.164:socket
Operation, tries, wait:
  analyze_table, 10, 1
  copy_rows, 10, 0.25
  create_triggers, 10, 1
  drop_triggers, 10, 1
  swap_tables, 10, 1
  update_foreign_keys, 10, 1
Altering `test`.`test_osc`...
Creating new table...
Created new table test._test_osc_new OK.
Altering new table...
Altered `test`.`_test_osc_new` OK.
2021-08-09T16:55:02 Creating triggers...
2021-08-09T16:55:02 Created triggers OK.
2021-08-09T16:55:02 Copying approximately 1 rows...
2021-08-09T16:55:02 Copied rows OK.
2021-08-09T16:55:02 Analyzing new table...
2021-08-09T16:55:02 Swapping tables...
2021-08-09T16:55:02 Swapped original and new tables OK.
2021-08-09T16:55:02 Dropping old table...
2021-08-09T16:55:02 Dropped old table `test`.`_test_osc_old` OK.
2021-08-09T16:55:02 Dropping triggers...
2021-08-09T16:55:02 Dropped triggers OK.
Successfully altered `test`.`test_osc`.

#查看,修改成功
mysql> show create table test_osc;
+----------+----------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table    | Create Table

        |
+----------+----------------------------------------------------------------------------------------------------------------------------------------------------------+
| test_osc | CREATE TABLE `test_osc` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `number` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+----------+----------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

#3.添加非null字段
[root@localhost ~]# pt-online-schema-change --alter="add password int not null default '123456'" h=localhost,u=pcloud,p=pcloud,D=test,t=test_osc --execute
Found 2 slaves:
localhost.localdomain -> 172.18.40.129:socket
localhost.localdomain -> 172.18.40.164:socket
Will check slave lag on:
localhost.localdomain -> 172.18.40.129:socket
localhost.localdomain -> 172.18.40.164:socket
Operation, tries, wait:
  analyze_table, 10, 1
  copy_rows, 10, 0.25
  create_triggers, 10, 1
  drop_triggers, 10, 1
  swap_tables, 10, 1
  update_foreign_keys, 10, 1
Altering `test`.`test_osc`...
Creating new table...
Created new table test._test_osc_new OK.
Altering new table...
Altered `test`.`_test_osc_new` OK.
2021-08-09T17:02:04 Creating triggers...
2021-08-09T17:02:04 Created triggers OK.
2021-08-09T17:02:04 Copying approximately 1 rows...
2021-08-09T17:02:04 Copied rows OK.
2021-08-09T17:02:04 Analyzing new table...
2021-08-09T17:02:04 Swapping tables...
2021-08-09T17:02:04 Swapped original and new tables OK.
2021-08-09T17:02:04 Dropping old table...
2021-08-09T17:02:04 Dropped old table `test`.`_test_osc_old` OK.
2021-08-09T17:02:04 Dropping triggers...
2021-08-09T17:02:04 Dropped triggers OK.
Successfully altered `test`.`test_osc`.

#查看,修改成功
mysql> show create table test_osc;
+----------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table    | Create Table

                                                        |
+----------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| test_osc | CREATE TABLE `test_osc` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `number` int(11) NOT NULL,
  `password` int(11) NOT NULL DEFAULT '123456',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+----------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

#4.删除字段
[root@localhost ~]# pt-online-schema-change --alter="drop number" h=localhost,u
=pcloud,p=pcloud,D=test,t=test_osc --execute
Found 2 slaves:
localhost.localdomain -> 172.18.40.129:socket
localhost.localdomain -> 172.18.40.164:socket
Will check slave lag on:
localhost.localdomain -> 172.18.40.129:socket
localhost.localdomain -> 172.18.40.164:socket
Operation, tries, wait:
  analyze_table, 10, 1
  copy_rows, 10, 0.25
  create_triggers, 10, 1
  drop_triggers, 10, 1
  swap_tables, 10, 1
  update_foreign_keys, 10, 1
Altering `test`.`test_osc`...
Creating new table...
Created new table test._test_osc_new OK.
Altering new table...
Altered `test`.`_test_osc_new` OK.
2021-08-09T17:24:04 Creating triggers...
2021-08-09T17:24:04 Created triggers OK.
2021-08-09T17:24:04 Copying approximately 1 rows...
2021-08-09T17:24:04 Copied rows OK.
2021-08-09T17:24:04 Analyzing new table...
2021-08-09T17:24:04 Swapping tables...
2021-08-09T17:24:04 Swapped original and new tables OK.
2021-08-09T17:24:04 Dropping old table...
2021-08-09T17:24:04 Dropped old table `test`.`_test_osc_old` OK.
2021-08-09T17:24:04 Dropping triggers...
2021-08-09T17:24:04 Dropped triggers OK.
Successfully altered `test`.`test_osc`.

#查看,删除成功
mysql> show create table test_osc;
+----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table    | Create Table

                           |
+----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| test_osc | CREATE TABLE `test_osc` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `password` int(11) NOT NULL DEFAULT '123456',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

pt-heartbeat

功能

监控 mysql 的主从复制延迟

基本原理

pt-heartbeat 是一个由两部分组成的 MySQL 复制延迟监控系统(当然它还可以监控 PostgreSQL ,这你就需要使用--dbi-driver参数并设定 Pg 来实现它),它通过查看 slave 的实际复制数据来计算复制延迟,所以他的工作实际上与复制机制是无关的。它适用于复制层次结构中的任何深度;它会可靠的报告一个 slave 落后它的 master 甚至 master 的 master 的 master 多久。如果复制停止,它将继续工作并准确报告:slave 越来越落后 master。

pt-heartbeat 的第一个部分是一个--update实例,它连接到一个 master 并每--interval秒更新一个时间戳(“心跳记录”)。由于心跳表可能包含多个 master 的记录,因此用 server_id 标识记录。

pt-heartbeat 的第二个部分是一个--monitor--check实例,它连接到一个 slave,检查来自其直接 master 或指定--master-server-id的复制的心跳记录,并计算与当前系统时间的差异。如果 slave 和 master 之间的发生了复制延迟或中断,则计算出的差异将大于零,并且如果--monitor是指定的,则可能会增加。

你必须在主服务器上手动创建心跳表或者使用--create-tables由pt-heartbeat自动按标准创建表。请参阅下方用法中的--create-table参数了解正确的心跳表结构。对于 MySQL 该表建议使用 MEMORY 引擎,但当然这不是必须的。

心跳表必须包含心跳行。默认情况下,如果心跳行不存在,则插入该行。如果数据库用户没有 INSERT 权限,可以使用--[no]insert-heartbeat-row来禁用此功能。

pt-heartbeat 的最大分辨率为 0.01 秒。主从服务器上的时钟必须通过 NTP 紧密同步。默认情况下, --update检查发生在秒的边缘(例如 00:01), --monitor检查发生在秒之间的中间(例如 00:01.5)。只要服务器的时钟紧密同步并且复制事件在不到半秒的时间内传播,pt-heartbeat 就会报告零秒的延迟。

如果连接有错误,pt-heartbeat 将尝试重新连接,但如果首次启动时无法获得连接,则不会重试。

流程图

pt-heartbeat原理

用法

注:(-)代表不常用,还未实验过;(?)代表官方文档的解释太少不明确,未使用过

pt-heartbeat [OPTIONS] [DSN] --update|--monitor|--check|--stop
#使用时必须指定的至少一个--stop,--update,--monitor,或--check。
#其中--update, --monitor, 和--check是互斥的。
#--daemonize和--check也是互斥的。

#OPTIONS

--ask-pass
#隐式输入密码

--charset(-)
#简写:-A
#设置默认字符集。它不仅会设置perl的标准输出格式为utf8,还会在mysql里运行set names utf8

--check
#检查一次从机延迟并退出。如果您还指--recurse,该工具将尝试发现给定 slave 的 slave,并检查并打印它们的延迟。每个slave的主机名或 IP 和端口在其延迟之前打印。 --recurse仅适用于 MySQL

--check-read-only(?)
#检查服务器是否启用了只读;如果是,该工具将跳过执行任何插入操作。可以配合--read-only-interval使用

--config(-)
#类型:数组
#加载这个逗号分隔的配置文件列表;如果指定,这必须是命令行上的第一个选项
#你可以将繁杂的参数配置在文件里,运行时直接加载配置文件就好了

--create-table
#如果心跳表不存在,则创建心跳,在你指定的master下的库中
#CREATE TABLE heartbeat (
#  ts                    varchar(26) NOT NULL,
#  server_id             int unsigned NOT NULL PRIMARY KEY,
#  file                  varchar(255) DEFAULT NULL,    -- SHOW MASTER STATUS
#  position              bigint unsigned DEFAULT NULL, -- SHOW MASTER STATUS
#  relay_master_log_file varchar(255) DEFAULT NULL,    -- SHOW SLAVE STATUS
#  exec_master_log_pos   bigint unsigned DEFAULT NULL  -- SHOW SLAVE STATUS
#);

--create-table-engine(-)
#类型:字符串
#设置用于心跳表的引擎。从 MySQL 5.5.5 开始,默认存储引擎是 InnoDB

--daemonize
#执行时,放入到后台执行

--database
#简写:-D; 类型:字符串
#用于连接的数据库

--dbi-driver(-)
#默认值:mysql;类型:字符串
#为连接指定驱动程序;mysql并Pg得到支持

--defaults-file
#简写:-F; 类型:字符串
#仅从给定文件中读取 mysql 选项。你必须提供绝对路径名

--file
#类型:字符串
#将最新--monitor输出打印到此文件。
#当--monitor给定,打印输出到指定的文件,而不是到stdout。该文件在每个时间间隔被打开、截断和关闭,因此它只包含最近的统计信息。可以配合--daemonize使用

--frames(?)
#类型:字符串;默认值:1m、5m、15m
#平均值的时间范围。
#指定在--monitor给定时计算移动平均线的时间范围 。指定为带后缀的以逗号分隔的数字列表。后缀可以是 s 代表秒、m 代表分钟、h 代表小时或 d 代表天。最大帧的大小决定了最大内存使用量,因为内存中保存了指定数量的每秒样本以计算平均值。您可以指定任意数量的时间范围。

--help
#显示帮助并退出

--host
#简写:-h; 类型:字符串
#连接到主机。

--[no]insert-heartbeat-row(?)
#默认:是
#在--table不存在的情况下插入一个心跳行。
#心跳--table需要一个心跳行,否则没有什么可--update, --monitor, 或--check!默认情况下,该工具将插入一个心跳行(如果尚不存在)。如果--no-insert-heartbeat-row数据库用户没有 INSERT 权限,您可以通过指定来禁用此功能。

--interval
#类型:浮动;默认值:1.0
#检查、更新的间隔时间。默认是1s。最小的单位是0.01s,最大精度为小数点后两位,因此0.015将调整至0.02。

--log(-)
#类型:字符串
#开启daemonized模式的所有日志将会被打印到指定的文件中

--master-server-id
#类型:字符串
#指定master的server_id,若没有指定则该工具会连到master上查找其server_id

--monitor
#持续监控slave的延迟情况。通过--interval指定的间隔时间,打印出slave的延迟信息,通过--file则可以把这些信息打印到指定的文件

--fail-successive-errors(-)
#类型:int
#如果指定,pt-heartbeat将在给定数量的连续 DBI 错误(无法连接到服务器或发出查询)后失败

--password
#简写形式:-p; 类型:字符串
#连接时使用的密码

--pid(-)
#类型:字符串
#创建给定的 PID 文件。如果 PID 文件已经存在并且它包含的 PID 与当前 PID 不同,则该工具将不会启动。但是,如果 PID 文件存在并且其中包含的 PID 不再运行,则该工具将使用当前 PID 覆盖 PID 文件。工具退出时,PID 文件会自动删除

--port
#简写:-P; 类型:int
#用于连接的端口号。

--print-master-server-id
#在--monitor和--check 模式下,指定该参数则打印出主的server_id。

--read-only-interval(?)
#类型:int
#当--check-read-only指定时,当服务器被发现为只读时休眠的时间间隔。如果未指定,则使用--interval

--recurse
#类型:int
#在--check模式中递归检查slave到此深度。
#尝试递归地发现slave服务器,达到指定的深度。发现服务器后,对每个服务器运行检查并打印主机名(如果可能),然后是slave服务器延迟。
#这目前仅适用于 MySQL

--recursion-method(-)
#类型:数组;默认值:进程列表,主机
#用于查找从站的首选递归方法
#可能的方法有:
#	METHOD       USES
#	===========  ==================
#	processlist  SHOW PROCESSLIST
#	hosts        SHOW SLAVE HOSTS
#	none         Do not find slaves
#首选使用 processlist 方法,因为 SHOW SLAVE HOSTS 不可靠。但是,如果服务器使用非标准端口(不是 3306),则需要使用 hosts 方法。通常pt-heartbeat 会做正确的事情并找到slave,但您可以提供首选方法,它将首先使用。如果它没有找到任何从属设备,则会尝试其他方法

--replace(-)
#使用--replace代替--update模式更新心跳表里的时间字段,这样的好处是不用管表里是否有行
#它必须与–update 结合使用

--run-time
#类型:时间
#退出前运行的时间

--sentinel(-)
#类型:字符串;默认值:/tmp/pt-heartbeat-sentinel
#如果此文件存在,则退出

--slave-user(-)
#类型:字符串
#设置用于连接到slave的用户。此参数允许你在slave上拥有一个具有较少权限的不同用户,但该用户必须存在于所有slave上

--slave-password(-)
#类型:字符串
#设置用于连接到slave的密码。它可以与 –slave-user 一起使用,并且所有slave上的用户密码必须相同

--set-vars(-)
#类型:数组
#在这个以逗号分隔的variable=value对列表中设置 MySQL 变量
#在命令行上指定的变量会覆盖这些默认值。例如,指定--set-vars wait_timeout=500会覆盖wait_timeout=10000的默认值。
#如果无法设置变量,该工具会打印警告并继续

--skew(-)
#类型:浮动;默认值:0.5
#检查延迟多长时间

--socket
#简写:-S; 类型:字符串
#用于连接的套接字文件

--stop(-)
#停止运行该工具(--daemonize),在/tmp/目录下创建一个“pt-heartbeat-sentinel” 文件。后面想重新开启则需要把该临时文件删除,才能开启(--daemonize)

--table(-)
#类型:字符串;默认值:心跳
#用于心跳的表。
#不要指定database.table; 要用--database指定数据库

--update
#更新 master 的心跳。

--user
#简写:-u; 类型:字符串
#如果不是当前用户,则用于登录的用户

--utc(-)
#忽略系统时区并仅使用 UTC。默认情况下,pt-heartbeat不会针对不同的系统或 MySQL 时区进行检查或调整,这可能会导致工具错误地计算延迟。指定此选项是一个好主意,因为它可以确保该工具无论时区如何都能正常工作
#如果使用,必须用于所有该选项PT-心跳实例: --update,--monitor,--check等

--version
#显示版本并退出。

--[no]version-check(-)
#默认:是
#检查 Percona Toolkit、MySQL 和其他程序的最新版本。
#这是一个标准的“自动检查更新”功能,还有两个附加功能。首先,该工具会检查自己的版本以及以下软件的版本:操作系统、Percona 监控和管理 (PMM)、MySQL、Perl、Perl 的 MySQL 驱动程序 (DBD::mysql) 和 Percona Toolkit。其次,它会检查存在已知问题的版本并发出警告。例如,MySQL 5.5.25 有一个严重的错误,并被重新发布为 5.5.25a。
#在工具正常输出之前,任何更新或已知问题都会打印到 STDOUT。此功能不会干扰工具的正常操作。

使用示例

服务器40段的129,128,131,164;主从关系如下:

128
 |
 --	131
 |
 --	129
	|
    -- 164
#创建一个后台进程定期更新 master 上的 test 库的 heartbeat 表,默认是 1s,可以--interval 指定,执行后会成一个 heartbeat 表,test库为我监控的同步库
pt-heartbeat -D test --update -hlocalhost -uroot --daemonize --create-table

#持续监控某个slave的复制延迟
pt-heartbeat -D test --monitor -upcloud -ppcloud --master-server-id=128 -h172.18.40.129
0.00s [  0.00s,  0.00s,  0.00s ]
0.00s [  0.00s,  0.00s,  0.00s ]
0.00s [  0.00s,  0.00s,  0.00s ]
0.00s [  0.00s,  0.00s,  0.00s ]
0.00s [  0.00s,  0.00s,  0.00s ]
0.00s [  0.00s,  0.00s,  0.00s ]
0.00s [  0.00s,  0.00s,  0.00s ]

#持续5s监控某个slave的复制延迟
pt-heartbeat -D test --monitor -upcloud -ppcloud --master-server-id=128 -h172.18.40.129 --run-time=5s

#检查一次某个slave的复制延迟
pt-heartbeat -D test --check -upcloud -ppcloud --master-server-id=128 -h172.18.40.129
0.00s [  0.00s,  0.00s,  0.00s ]
0.00s [  0.00s,  0.00s,  0.00s ]
0.00s [  0.00s,  0.00s,  0.00s ]
0.00s [  0.00s,  0.00s,  0.00s ]
0.00s [  0.00s,  0.00s,  0.00s ]

#检查一次由localhost开始的1个深度主从的复制延迟
pt-heartbeat -D test --check -upcloud -ppcloud --master-server-id=128 --recurse=1
#localhost.localdomain 0.00
#172.18.40.129        0.00
#172.18.40.131        0.00

#检查一次由localhost开始的2个深度主从的复制延迟(只打印有2个深度的slave)
pt-heartbeat -D test --check -upcloud -ppcloud --master-server-id=128 --recurse=2
#localhost.localdomain 0.00
#172.18.40.129        0.00
#172.18.40.164        0.00

#检查一次由129开始的2个深度的复制延迟(如果没有2个,遍历完毕结束)
pt-heartbeat -D test --check -upcloud -ppcloud --master-server-id=128 -h172.18.40.129 --recurse=2
#172.18.40.129        0.00
#172.18.40.164        0.00

pt-table-checksum

功能

验证 MySQL 复制完整性

基本原理

pt-table-checksum连接到您指定的服务器,并查找与您指定的过滤器(如果有)匹配的数据库和表。它一次处理一张表,因此在开始校验和之前不会积累大量内存或做大量工作。这使得它可以在非常大的服务器上使用。我们已经在拥有数十万个数据库和表以及数万亿行的服务器上使用它。无论服务器有多大,pt-table-checksum 都同样有效。

它可以在非常大的表上工作的一个原因是它将每个表划分为行块,并使用单个 REPLACE…SELECT 查询对每个块进行校验。它改变块大小以使校验和查询在所需的时间内运行。将表分块而不是使用单个大查询来处理每个表的目标是确保校验和是非侵入性的并且不会在服务器上造成过多的复制延迟或负载。这就是为什么每个块的目标时间默认为 0.5 秒。

该工具会跟踪服务器执行查询的速度,并在了解有关服务器性能的更多信息时调整块。它使用指数衰减的加权平均值来保持块大小稳定,但如果在校验和期间服务器的性能因任何原因发生变化,它仍能保持响应。这意味着,例如,如果您的服务器在流量高峰或后台任务期间负载过重,该工具将快速自我调节。

工作过程
  1. 连接到主库:pt工具连接到主库,然后自动发现主库的所有从库。默认采用show full processlist来查找从库,但是这只有在主从实例端口相同的情况下才有效。
  2. 查找主库或者从库是否有复制过滤规则:这是为了安全而默认检查的选项。你可以关闭这个检查,但是这可能导致checksum的sql语句要么不会同步到从库,要么到了从库发现从库没有要被checksum的表,这都会导致从库同步卡库。
  3. 开始获取表,一个个的计算。
  4. 如果是表的第一个chunk,那么chunk-size一般为1000;如果不是表的第一个chunk,那么采用12步中分析出的结果。
  5. 检查表结构,进行数据类型转换等,生成checksum的sql语句。
  6. 根据表上的索引和数据的分布,选择最合适的split表的方法。
  7. 开始checksum表。
  8. 默认在chunk一个表之前,先删除上次这个表相关的计算结果。除非—resume。
  9. 根据explain的结果,判断chunk的size是否超过了你定义的chunk-size的上限。如果超过了,为了不影响线上性能,这个chunk将被忽略。
  10. 把要checksum的行加上for update锁,并计算。
  11. 把计算结果存储到master_crc master_count列中。
  12. 调整下一个chunk的大小。
  13. 等待从库追上主库。如果没有延迟备份的从库在运行,最好检查所有的从库,如果发现延迟最大的从库延迟超过max-lag秒,pt工具在这里将暂停。
  14. 如果发现主库的max-load超过某个阈值,pt工具在这里将暂停。
  15. 继续下一个chunk,直到这个table被chunk完毕。
  16. 等待从库执行完checksum,便于生成汇总的统计结果。每个表汇总并统计一次。
  17. 循环每个表,直到结束。
    校验结束后,在每个从库上,执行如下的sql语句即可看到是否有主从不一致发生:
    select * from percona.checksums where master_cnt <> this_cnt OR master_crc <> this_crc OR ISNULL(master_crc) <> ISNULL(this_crc) \G

流程图

percona-toolkit常用工具的使用_第2张图片

用法

pt-table-checksum [OPTIONS] [DSN]#OPTIONS--ask-pass#略,详见pt-online-schema-change工具用法--channel#略,详见pt-online-schema-change工具用法--[no]check-binlog-format#默认:是#检查binlog_format所有服务器上是否相同--binary-index#此选项修改了--create-replicate-table这样的行为,即使用 BLOB 数据类型创建复制表的上下边界列。如果您在校验和包含二进制数据类型或具有非标准字符集的键的表时遇到问题,这很有用。见--replicate。--check-interval#略,详见pt-online-schema-change工具用法--[no]check-plan#略,详见pt-online-schema-change工具用法--[no]check-replication-filters#略,详见pt-online-schema-change工具用法--check-slave-lag#略,详见pt-online-schema-change工具用法--[no]check-slave-tables#默认:yes;#检查从站上的表是否存在并具有所有校验和--columns。从服务器上缺少表或没有所有校验和--columns可能会导致工具在尝试检查差异时中断复制。仅当你意识到风险并确保所有从站上的所有表都存在且与主站相同时,才禁用此检查。--chunk-index#略,详见pt-online-schema-change工具用法--chunk-index-columns#略,详见pt-online-schema-change工具用法--chunk-size#略,详见pt-online-schema-change工具用法--chunk-size-limit#略,详见pt-online-schema-change工具用法--chunk-time#略,详见pt-online-schema-change工具用法--columns#简写形式:-c; 类型:数组#仅校验此逗号分隔的列列表。如果表没有任何指定的列,它将被跳过。#此选项适用于所有表,因此它仅在对一个表进行校验和时才有意义,除非这些表具有一组公共列--config#略,详见pt-online-schema-change工具用法--databases#简写:-d; 类型:哈希;#仅校验此逗号分隔的数据库列表。--databases-regex#类型:字符串;#只有名称与此 Perl 正则表达式匹配的校验和数据库。--defaults-file#简写:-F; 类型:字符串;#仅从给定文件中读取 mysql 选项。您必须提供绝对路径名。--disable-qrt-plugin#如果启用了 QRT(查询响应时间)插件,请禁用它。--[no]empty-replicate-table#默认:yes#在对表进行校验和之前,删除每个表的先前校验和。此选项不会截断整个表,它只会在对表进行校验和之前删除每个表的行(校验和)。因此,如果校验和过早停止并且存在预先存在的数据,则在工具停止之前,表中仍会有未校验和的行。#如果您从之前的校验和运行中恢复,那么工具从中恢复的表的校验和记录将不会被清空。#要清空整个复制表,您必须在运行该工具之前手动执行TRUNCATE TABLE。--engines#简写:-e; 类型:哈希;#只有使用这些存储引擎的校验和表。--explain#默认值:0;#显示但不执行校验和查询(禁用 --[no]empty-replicate-table)。如果指定两次,该工具实际上会遍历分块算法,打印每个块的上下边界值,但不执行校验和查询。--fail-on-stopped-replication#如果复制停止,则失败并显示错误(退出状态 128),而不是等到复制重新启动。--float-precision#类型:int#FLOAT 和 DOUBLE 数字到字符串转换的精度。使用 MySQL 中的 ROUND() 函数使 FLOAT 和 DOUBLE 值四舍五入到小数点后指定的位数。这有助于避免由于不同 MySQL 版本和硬件上相同值的不同浮点表示而导致的校验和不匹配。默认不舍入;这些值由 CONCAT() 函数转换为字符串,MySQL 选择字符串表示形式。例如,如果指定值 2,则值 1.008 和 1.009 将四舍五入为 1.01,并且校验和相等。--function#类型:字符串#校验和的散列函数(FNV1A_64、MURMUR_HASH、SHA1、MD5、CRC32 等)。#默认使用 CRC32(),但 MD5() 和 SHA1() 也可以使用,如果您愿意,您可以使用自己的函数,例如已编译的 UDF。您指定的函数在 SQL 中运行,而不是在 Perl 中运行,因此它必须可用于 MySQL。#MySQL 没有快速的良好内置哈希函数。CRC32() 太容易发生哈希冲突,而 MD5() 和 SHA1() 非常占用 CPU。随 Percona Server 分发的 FNV1A_64() UDF 是一种更快的替代方案。编译安装非常简单;查看源代码中的标题以获取说明。如果已安装,则优先于 MD5()。如果您将其编译并安装为 UDF,您还可以使用 MURMUR_HASH() 函数;源码也是用 Percona Server 分发的,可能比 FNV1A_64() 好。--help#显示帮助并退出。--host#简写:-h; 类型:字符串;默认值:本地主机;#要连接的主机。--ignore-columns#类型:哈希;#计算校验和时忽略此逗号分隔的列列表。如果一个表的所有列都被 –ignore-columns 过滤,它将被跳过。--ignore-databases#类型:哈希;#忽略这个以逗号分隔的数据库列表。--ignore-databases-regex#类型:字符串;#忽略名称与此 Perl 正则表达式匹配的数据库。--ignore-engines#类型:哈希;默认值:FEDERATED,MRG_MyISAM;#忽略此逗号分隔的存储引擎列表。--ignore-tables#类型:哈希;#忽略这个以逗号分隔的表格列表。表名可以用数据库名来限定。该--replicate表总是被自动忽略。--ignore-tables-regex#类型:字符串;#忽略名称与 Perl 正则表达式匹配的表。--max-lag#类型:时间;默认值:1s;#暂停校验和,直到所有副本的滞后小于此值。在每个校验和查询(每个块)之后,pt-table-checksum使用 Seconds_Behind_Master 查看它连接到的所有副本的复制延迟。如果任何副本滞后超过此选项的值,则pt-table-checksum将休眠--check-interval几秒钟,然后再次检查所有副本。如果指定--check-slave-lag,则该工具仅检查该服务器的延迟,而不是所有服务器。#该工具永远等待副本停止滞后。如果任何副本停止,该工具将永远等待,直到副本启动。一旦所有副本都在运行并且没有滞后太多,校验和就会继续。#该工具在等待时打印进度报告。如果副本停止,它会立即打印进度报告,然后在每个进度报告间隔再次打印。#另请参阅“REPLICA CHECKS”。--max-load#类型:数组;默认值:Threads_running=25;#在每个块之后检查 SHOW GLOBAL STATUS,如果任何状态变量高于阈值,则暂停。该选项接受以逗号分隔的 MySQL 状态变量列表来检查阈值。一个可选的=MAX_VALUE(或 :MAX_VALUE)可以跟在每个变量之后。如果未给出,该工具通过检查当前值并将其增加 20% 来确定阈值。#例如,如果您希望工具在 Threads_connected 过高时暂停,您可以指定“Threads_connected”,工具会在开始工作时检查当前值并将该值增加 20%。如果当前值为100,那么当Threads_connected超过120时工具会暂停,再次低于120时工具会继续工作。如果要指定明确的阈值,例如 110,可以使用“Threads_connected:110”或“Threads_connected=110”。#此选项的目的是防止该工具向服务器添加过多负载。如果校验和查询是侵入性的,或者如果它们导致锁等待,那么服务器上的其他查询将倾向于阻塞和排队。这通常会导致 Threads_running 增加,并且该工具可以通过在每个校验和查询完成后立即运行 SHOW GLOBAL STATUS 来检测到这一点。如果为此变量指定阈值,则可以指示工具等待查询再次正常运行。但是,这不会阻止排队;它只会让服务器有机会从排队中恢复。如果您注意到排队,最好减少块时间。--password#简写形式:-p; 类型:字符串;#连接时使用的密码。--pause-file#类型:字符串#当此参数指定的文件存在时,执行将暂停。--pid#类型:字符串#创建给定的 PID 文件。如果 PID 文件已经存在并且它包含的 PID 与当前 PID 不同,则该工具将不会启动。但是,如果 PID 文件存在并且其中包含的 PID 不再运行,则该工具将使用当前 PID 覆盖 PID 文件。工具退出时,PID 文件会自动删除。--plugin#略,详见pt-online-schema-change工具用法--port#简写:-P; 类型:int;#用于连接的端口号。--progress#类型:数组;默认值:时间,30#向 STDERR 打印进度报告。#该值是一个包含两部分的逗号分隔列表。第一部分可以是百分比、时间或迭代;第二部分指定更新的打印频率,以百分比、秒或迭代次数为单位。该工具会打印各种耗时操作的进度报告,包括等待副本在滞后时赶上进度。--quiet#简写:-q; 累计:是;默认值:0#仅打印最重要的信息(禁用--progress)。指定此选项一次会导致该工具仅打印错误、警告和具有校验和差异的表。#两次指定此选项会导致工具仅打印错误。在这种情况下,您可以使用该工具的退出状态来确定是否存在任何警告或校验和差异。--recurse#类型:int#发现副本时要在层次结构中递归的级别数。默认为无限。另见--recursion-method“副本检查”。--recursion-method#类型:数组;默认值:processlist,hosts#发现副本的首选递归方法。 pt-table-checksum 在运行之前和运行时执行几次“REPLICA CHECKS”。#尽管副本不需要运行pt-table-checksum,但该工具无法检测它无法发现的从属上的差异。因此,如果没有找到副本并且方法不是,则会打印警告并且“退出状态”为非零none。如果发生这种情况,请尝试不同的递归方法,或使用该dsn方法指定要检查的副本。#可能的方法有:#方法       用途#===========  =============================================#processlist  SHOW PROCESSLIST#hosts        SHOW SLAVE HOSTS#cluster      SHOW STATUS LIKE 'wsrep\_incoming\_addresses'#dsn=DSN      DSNs from a table#none         Do not find slaves#1.processlist方法是默认方法,因为SHOW SLAVE HOSTS不可靠。 但是,如果服务器使用非标准端口(不是3306),那么hosts方法将成为默认方法,因为它在这种情况下工作得更好。  #2.该hosts方法需要与被配置的副本report_host, report_port等等。#3.集群方法需要基于Galera 23.7.3或更新版本的集群,如Percona XtraDB集群版本5.5.29及以上。 这将使用SHOW STATUS(类似于'wsrep\_incoming\_addresses')自动发现集群中的节点。 您可以将集群与进程列表和主机组合在一起,以自动发现集群节点和副本,但此功能是实验性的#4.dsn方法很特殊:它不是自动发现副本,而是指定一个带有副本dsn的表。 该工具只会连接到这些副本。 当副本不使用与主副本相同的MySQL用户名或密码时,或者当您想阻止工具连接到某些副本时,这种方法最有效。 dsn方法的指定方式如下:——recursor -method dsn=h=host,D=percona,t=dsns。 指定的DSN必须有D和t部分,或者只有数据库限定的t部分,它们指定DSN表。 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`)#);#DSN 由 排序id,但id和parent_id否则会被忽略。该dsn列包含一个复制品DSN像它会在命令行上被给予,例如:"h=replica_host,u=repl_user,p=repl_pass"。#该none方法使工具忽略所有从属节点和集群节点。不推荐这种方法,因为它有效地禁用了“REPLICA CHECKS”并且找不到任何差异。但是,如果您只需要在主节点或单个集群节点上写入校验和,则它很有用。更安全的替代方法是--no-replicate-check:该工具查找副本和集群节点,执行“REPLICA CHECKS”,但不检查差异。见--[no]replicate-check。--replicate#类型:字符串;默认值:percona.checksums#将校验和结果写入此表。复制表必须具有以下结构 (MAGIC_create_replicate):#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)#) ENGINE=InnoDB DEFAULT CHARSET=utf8;#注意:lower_boundary 和 upper_boundary 数据类型可以是 BLOB。见--binary-index。#默认情况下,--create-replicate-table为 true,因此如果此选项指定的数据库和表不存在,则会自动创建它们。#请务必为复制表选择合适的存储引擎。如果您正在对 InnoDB 表进行校验和,并且您对该表使用 MyISAM,则死锁将破坏复制,因为校验和语句中事务性和非事务性表的混合将导致它被写入 binlog,即使它有错误. 然后它将在副本上没有死锁的情况下重播,并以“主从上的不同错误”中断复制。这不是pt-table-checksum 的问题;这是 MySQL 复制的一个问题,您可以在 MySQL 手册中阅读有关它的更多信息。#复制表永远不会校验和(工具会自动将此表添加到--ignore-tables)。--[no]replicate-check#默认:是#完成每个表后检查副本的数据差异。该工具通过对所有检测到的副本执行简单的 SELECT 语句来发现差异。查询将副本的校验和结果与主节点的校验和结果进行比较。它报告输出的 DIFFS 列中的差异。--replicate-check-only#在不执行校验和查询的情况下检查副本的一致性。此选项仅与--[no]replicate-check. 如果指定, pt-table-checksum不会对任何表进行校验和。它检查副本是否存在先前校验和发现的差异,然后退出。例如,如果您在 cron 作业中安静地运行pt-table-checksum,并且稍后想要关于 cron 作业的结果的报告,也许是为了实施 Nagios 检查,这可能会很有用。--replicate-check-retries#类型:int;默认值:1#遇到差异时,多次重试校验和比较。只有在此次数的检查后差异仍然存在时,才被认为是有效的。将此选项的值设为 2 或更大可减轻使用 –resume 选项时出现的虚假差异。--replicate-database#类型:字符串#仅使用此数据库。默认情况下,pt-table-checksum执行 USE 来选择包含它当前正在处理的表的数据库。这是避免复制过滤器(如 binlog_ignore_db 和replicate_ignore_db)出现问题的最大努力。但是,复制过滤器可能会造成一种情况,即没有一种正确的方法可以做事。某些语句可能不会被复制,而其他语句可能会导致复制失败。在这种情况下,您可以使用此选项指定pt-table-checksum使用 USE 选择且永不更改的默认数据库。另见--[no]check-replication-filters。--resume#从最后一个完成的块恢复校验和(禁用 --[no]empty-replicate-table)。如果该工具在对所有表进行校验和之前停止,则此选项会使校验和从它完成的最后一个表的最后一个块恢复。--retries#类型:int;默认值:2#当出现非致命错误时,多次重试块。非致命错误是诸如锁定等待超时或查询被终止之类的问题。--run-time#类型:时间#跑多久。默认是运行直到所有表都被校验和。允许使用以下时间值后缀:s(秒)、m(分钟)、h(小时)和 d(天)。将此选项与--resume在分配的时间内对尽可能多的表进行校验和,下次运行时从工具停止的地方恢复。--separator#类型:字符串;默认: #用于 CONCAT_WS() 的分隔符。该字符用于在校验和时连接列的值。--skip-check-slave-lag#类型:DSN;可重复:是#检查从设备滞后时要跳过的 DSN。它可以多次使用。示例:–skip-check-slave-lag h=127.1,P=12345 –skip-check-slave-lag h=127.1,P=12346--slave-user#类型:字符串#设置用于连接到从站的用户。此参数允许您在从站上拥有一个具有较少权限的不同用户,但该用户必须存在于所有从站上。--slave-password#类型:字符串#设置用于连接到从站的密码。它可以与 –slave-user 一起使用,并且所有从站上的用户密码必须相同。--set-vars#略,详见pt-online-schema-change工具用法--socket#简写:-S; 类型:字符串;#用于连接的套接字文件。--slave-skip-tolerance#类型:float;默认值:1.0#当主表被标记为仅在一个块中进行校验和但从表超过了最大可接受大小时,该表将被跳过。由于行数通常是粗略估计,因此很多时候由于非常小的差异而不必要地跳过表。此选项提供最大行过量容差以防止出现这种情况。例如,值 1.2 将允许从表最多有 20% 的多余行。--tables#简写:-t; 类型:哈希;#只校验这个以逗号分隔的表格列表。表名可以用数据库名来限定。--tables-regex#类型:字符串;#仅校验名称与此 Perl 正则表达式匹配的表。--trim#将 TRIM() 添加到 VARCHAR 列(有助于将 4.1 与 >= 5.0 进行比较)。当您不关心 MySQL 版本之间的尾随空格差异时,这很有用,这些差异在尾随空格的处理上有所不同。MySQL 5.0 及更高版本都在 VARCHAR 中保留尾随空格,而以前的版本会删除它们。这些差异将导致错误的校验和差异。--truncate-replicate-table#在开始校验和之前截断复制表。此参数与 –empty-replicate-table 不同,后者仅在启动该表的校验和时删除被校验和的表的行,而 –truncate-replicate-table 将在进程开始时截断复制表,因此,所有即使进程因错误而停止,先前的校验和信息也将丢失。--user#简写:-u; 类型:字符串;#如果不是当前用户,则用于登录的用户。--version#显示版本并退出。--[no]version-check#略,详见pt-online-schema-change工具用法--where#类型:字符串#仅执行与此 WHERE 子句匹配的行。你可以使用此选项将校验和限制为仅表的一部分。如果您有仅附加表并且不想经常重新检查所有行,这将特别有用;例如,您可以运行日常工作来检查昨天的行。#pt-table-checksum --where "ts > CURRENT_DATE - INTERVAL 1 DAY"

使用示例

服务器40段的129,128,131,164;主从关系如下:

128 | --	131 | --	129	|    -- 164
#检测主从所有的库是否一致[root@localhost ~]# pt-table-checksum -upcloud -ppcloud -h172.18.40.128Checking if all tables can be checksummed ...Starting checksum ...            TS ERRORS  DIFFS     ROWS  DIFF_ROWS  CHUNKS SKIPPED    TIME TABLE08-10T16:48:39      0      0        0          0       1       0  61.037 mysql.columns_priv08-10T16:49:40      0      0        2          0       1       0  61.031 mysql.db08-10T16:50:41      0      0        2          0       1       0  61.027 mysql.engine_cost08-10T16:51:41      0      0        0          0       1       0  60.024 mysql.event08-10T16:52:41      0      0        0          0       1       0  60.021 mysql.func08-10T16:53:42      0      0       48          0       1       0  61.028 mysql.help_category08-10T16:54:42      0      0      908          0       1       0  60.030 mysql.help_keyword08-10T16:55:42      0      0     1804          0       1       0  60.032 mysql.help_relation08-10T16:56:42      0      0      659          0       1       0  60.034 mysql.help_topic08-10T16:57:42      0      0        0          0       1       0  60.030 mysql.ndb_binlog_index08-10T16:58:43      0      0        0          0       1       0  61.034 mysql.plugin08-10T16:59:43      0      1       48          0       1       0  60.091 mysql.proc08-10T17:00:43      0      0        0          0       1       0  60.025 mysql.procs_priv08-10T17:01:44      0      0        1          0       1       0  61.028 mysql.proxies_priv08-10T17:02:44      0      0        6          0       1       0  60.025 mysql.server_cost08-10T17:03:45      0      0        0          0       1       0  61.028 mysql.servers08-10T17:04:45      0      1        2          0       1       0  60.025 mysql.tables_priv08-10T17:05:46      0      0        0          0       1       0  61.033 mysql.time_zone08-10T17:06:46      0      0        0          0       1       0  60.024 mysql.time_zone_leap_second08-10T17:07:47      0      0        0          0       1       0  61.028 mysql.time_zone_name08-10T17:08:48      0      0        0          0       1       0  61.034 mysql.time_zone_transition08-10T17:09:48      0      0        0          0       1       0  60.027 mysql.time_zone_transition_type08-10T17:10:48      0      1        5          0       1       0  60.031 mysql.user08-10T17:11:48      0      0        6          0       1       0  60.033 sys.sys_config08-10T17:12:49      0      0        5          0       1       0  61.028 test.checksums08-10T17:13:50      0      0        1          0       1       0  61.028 test.heartbeat08-10T17:14:50      0      0        4          0       1       0  60.022 test.t_table08-10T17:15:51      0      0        3          0       1       0  61.026 test.test_for08-10T17:16:52      0      0        0          0       1       0  60.021 test.test_osc208-10T17:17:53      0      0        6          0       1       0  61.031 test.test_oscbk#结果说明#	1.TS:工具完成表校验和时的时间戳(不含年份)。#	2.ERRORS:对表进行校验和时发生的错误和警告的数量。在表格处理过程中,错误和警告被打印为标准错误。#	3.DIFFS:一个或多个副本上与主节点不同的块数。如果--no-replicate-check指定,此列将始终为零。如果--replicate-check-only指定,则仅打印有差异的表。#	4.ROWS:从表中选择并校验和的行数。如果使用 –where 选项,它可能与表中的行数不同#	5.DIFF_ROWS:每个块的最大差异数。如果一个块有 2 个不同的行而另一个块有 3 个不同的行,则该值将为 3。#	6.CHUNKS:表被划分成的块数。#	7.SKIPPED:由于以下一个或多个问题而跳过的块数:#	8.TIME:对表进行校验和所用的时间。#	9.TABLE:校验和的数据库和表。#停掉129的级联复制再检测主从所有的库是否一致[root@localhost ~]# pt-table-checksum -upcloud -ppcloud -h172.18.40.128Checking if all tables can be checksummed ...Starting checksum ...            TS ERRORS  DIFFS     ROWS  DIFF_ROWS  CHUNKS SKIPPED    TIME TABLE08-10T17:24:12      0      0        0          0       1       0   0.029 mysql.columns_priv08-10T17:24:12      0      0        2          0       1       0   0.026 mysql.db08-10T17:24:12      0      0        2          0       1       0   0.027 mysql.engine_cost08-10T17:24:12      0      0        0          0       1       0   0.027 mysql.event08-10T17:24:12      0      0        0          0       1       0   0.025 mysql.func08-10T17:24:12      0      0       48          0       1       0   0.025 mysql.help_category08-10T17:24:12      0      0      908          0       1       0   0.029 mysql.help_keyword08-10T17:24:12      0      0     1804          0       1       0   0.028 mysql.help_relation08-10T17:24:12      0      0      659          0       1       0   0.028 mysql.help_topic08-10T17:24:12      0      0        0          0       1       0   0.027 mysql.ndb_binlog_index08-10T17:24:12      0      0        0          0       1       0   0.026 mysql.plugin08-10T17:24:12      0      1       48          0       1       0   0.031 mysql.proc08-10T17:24:12      0      0        0          0       1       0   0.029 mysql.procs_priv08-10T17:24:12      0      0        1          0       1       0   0.027 mysql.proxies_priv08-10T17:24:12      0      0        6          0       1       0   0.026 mysql.server_cost08-10T17:24:13      0      0        0          0       1       0   0.024 mysql.servers08-10T17:24:13      0      1        2          0       1       0   0.026 mysql.tables_priv08-10T17:24:13      0      0        0          0       1       0   0.025 mysql.time_zone08-10T17:24:13      0      0        0          0       1       0   0.022 mysql.time_zone_leap_second08-10T17:24:13      0      0        0          0       1       0   0.025 mysql.time_zone_name08-10T17:24:13      0      0        0          0       1       0   0.025 mysql.time_zone_transition08-10T17:24:13      0      0        0          0       1       0   0.027 mysql.time_zone_transition_type08-10T17:24:13      0      1        5          1       1       0   0.030 mysql.user08-10T17:24:13      0      0        6          0       1       0   0.026 sys.sys_config08-10T17:24:13      0      0        5          0       1       0   0.025 test.checksums08-10T17:24:13      0      0        1          0       1       0   0.026 test.heartbeat08-10T17:24:13      0      0        4          0       1       0   0.026 test.t_table08-10T17:24:13      0      0        3          0       1       0   0.028 test.test_for08-10T17:24:13      0      0        0          0       1       0   0.030 test.test_osc208-10T17:24:13      0      0        6          0       1       0   0.031 test.test_oscbk#速度非常快,加上级联复制,时间是29m,不加级联是2s#停掉129的级联复制和从131(只剩128->129)再检测主从所有的库是否一致[root@localhost ~]# pt-table-checksum -upcloud -ppcloud -h172.18.40.128Checking if all tables can be checksummed ...Starting checksum ...            TS ERRORS  DIFFS     ROWS  DIFF_ROWS  CHUNKS SKIPPED    TIME TABLE08-10T17:26:26      0      0        0          0       1       0   0.014 mysql.columns_priv08-10T17:26:26      0      0        2          0       1       0   0.015 mysql.db08-10T17:26:26      0      0        2          0       1       0   0.014 mysql.engine_cost08-10T17:26:26      0      0        0          0       1       0   0.015 mysql.event08-10T17:26:26      0      0        0          0       1       0   0.015 mysql.func08-10T17:26:26      0      0       48          0       1       0   0.015 mysql.help_category08-10T17:26:26      0      0      908          0       1       0   0.015 mysql.help_keyword08-10T17:26:26      0      0     1804          0       1       0   0.015 mysql.help_relation08-10T17:26:26      0      0      659          0       1       0   0.016 mysql.help_topic08-10T17:26:26      0      0        0          0       1       0   0.014 mysql.ndb_binlog_index08-10T17:26:26      0      0        0          0       1       0   0.014 mysql.plugin08-10T17:26:26      0      1       48          0       1       0   0.017 mysql.proc08-10T17:26:26      0      0        0          0       1       0   0.019 mysql.procs_priv08-10T17:26:26      0      0        1          0       1       0   0.013 mysql.proxies_priv08-10T17:26:26      0      0        6          0       1       0   0.012 mysql.server_cost08-10T17:26:26      0      0        0          0       1       0   0.012 mysql.servers08-10T17:26:26      0      1        2          0       1       0   0.013 mysql.tables_priv08-10T17:26:26      0      0        0          0       1       0   0.014 mysql.time_zone08-10T17:26:26      0      0        0          0       1       0   0.014 mysql.time_zone_leap_second08-10T17:26:26      0      0        0          0       1       0   0.012 mysql.time_zone_name08-10T17:26:26      0      0        0          0       1       0   0.015 mysql.time_zone_transition08-10T17:26:26      0      0        0          0       1       0   0.014 mysql.time_zone_transition_type08-10T17:26:26      0      1        5          0       1       0   0.017 mysql.user08-10T17:26:26      0      0        6          0       1       0   0.015 sys.sys_config08-10T17:26:26      0      0        5          0       1       0   0.014 test.checksums08-10T17:26:26      0      0        1          0       1       0   0.012 test.heartbeat08-10T17:26:26      0      0        4          0       1       0   0.011 test.t_table08-10T17:26:26      0      0        3          0       1       0   0.012 test.test_for08-10T17:26:26      0      0        0          0       1       0   0.012 test.test_osc208-10T17:26:26      0      0        6          0       1       0   0.012 test.test_oscbk#检测主从单个库是否一致并只显示不同信息[root@localhost ~]# pt-table-checksum -upcloud -ppcloud -h172.18.40.128 --databases=testChecking if all tables can be checksummed ...Starting checksum ...            TS ERRORS  DIFFS     ROWS  DIFF_ROWS  CHUNKS SKIPPED    TIME TABLE08-10T17:26:53      0      0        5          0       1       0   0.018 test.checksums08-10T17:26:53      0      0        1          0       1       0   0.018 test.heartbeat08-10T17:26:53      0      0        4          0       1       0   0.018 test.t_table08-10T17:26:53      0      0        3          0       1       0   0.019 test.test_for08-10T17:26:53      0      0        0          0       1       0   0.017 test.test_osc208-10T17:26:53      0      0        6          0       1       0   0.017 test.test_oscbk#检测主从单个库是否一致并只显示不同信息[root@localhost ~]# pt-table-checksum -upcloud -ppcloud -h172.18.40.128 --databases=test --replicate-check-onlyChecking if all tables can be checksummed ...Starting checksum ...Differences on localhost.localdomainTABLE CHUNK CNT_DIFF CRC_DIFF CHUNK_INDEX LOWER_BOUNDARY UPPER_BOUNDARYtest.test_osc2 1 6 1#开启129的级联检测主从单个库是否一致并只显示不同信息[root@localhost ~]# pt-table-checksum -upcloud -ppcloud -h172.18.40.128 --databases=test --replicate-check-onlyChecking if all tables can be checksummed ...Starting checksum ...Differences on localhost.localdomainTABLE CHUNK CNT_DIFF CRC_DIFF CHUNK_INDEX LOWER_BOUNDARY UPPER_BOUNDARYtest.test_osc2 1 6 1Differences on localhost.localdomainTABLE CHUNK CNT_DIFF CRC_DIFF CHUNK_INDEX LOWER_BOUNDARY UPPER_BOUNDARYtest.test_osc2 1 6 1#显示主机的结果是一样的,所以这个工具并不能正确显示级联复制的不一致的信息#检测128->129的主从一致性信息并写入表中#	如果创建了表,不需要用--create-replicate-table参数,创建表规范详细见用法参数--replicate[[root@localhost ~]# pt-table-checksum -upcloud -ppcloud -h172.18.40.128 --databases=test --create-replicate-table --replicate=test.checksumsChecking if all tables can be checksummed ...Starting checksum ...            TS ERRORS  DIFFS     ROWS  DIFF_ROWS  CHUNKS SKIPPED    TIME TABLE08-11T16:25:36      0      0        1          0       1       0   0.060 test.heartbeat08-11T16:25:36      0      0       30          0       1       0   0.016 test.kill_log08-11T16:25:36      0      0        4          0       1       0   0.015 test.t_table08-11T16:25:36      0      0        3          0       1       0   0.018 test.test_for08-11T16:25:36      0      1        0          6       1       0   0.016 test.test_osc208-11T16:25:36      0      0        6          0       1       0   0.019 test.test_oscbk#查看表mysql> select * from test.checksums\G;*************************** 1. row ***************************            db: test           tbl: heartbeat         chunk: 1    chunk_time: 0.000986   chunk_index: NULLlower_boundary: NULLupper_boundary: NULL      this_crc: e68ca37b      this_cnt: 1    master_crc: e68ca37b    master_cnt: 1            ts: 2021-08-11 16:25:36*************************** 2. row ***************************            db: test           tbl: kill_log         chunk: 1    chunk_time: 0.002355   chunk_index: NULLlower_boundary: NULLupper_boundary: NULL      this_crc: bd8dc978      this_cnt: 30    master_crc: bd8dc978    master_cnt: 30            ts: 2021-08-11 16:25:36*************************** 3. row ***************************            db: test           tbl: test_for         chunk: 1    chunk_time: 0.001295   chunk_index: NULLlower_boundary: NULLupper_boundary: NULL      this_crc: 1e98dd80      this_cnt: 3    master_crc: 1e98dd80    master_cnt: 3            ts: 2021-08-11 16:25:36*************************** 4. row ***************************            db: test           tbl: test_osc2         chunk: 1    chunk_time: 0.001344   chunk_index: NULLlower_boundary: NULLupper_boundary: NULL      this_crc: 0      this_cnt: 0    master_crc: 0    master_cnt: 0            ts: 2021-08-11 16:25:36*************************** 5. row ***************************            db: test           tbl: test_oscbk         chunk: 1    chunk_time: 0.00146   chunk_index: NULLlower_boundary: NULLupper_boundary: NULL      this_crc: ac50919      this_cnt: 6    master_crc: ac50919    master_cnt: 6            ts: 2021-08-11 16:25:36*************************** 6. row ***************************            db: test           tbl: t_table         chunk: 1    chunk_time: 0.001381   chunk_index: NULLlower_boundary: NULLupper_boundary: NULL      this_crc: 76dc419      this_cnt: 4    master_crc: 76dc419    master_cnt: 4            ts: 2021-08-11 16:25:366 rows in set (0.00 sec)

pt-kill

功能

杀死符合特定条件的 MySQL 查询。

基本原理

pt-kill从 SHOW PROCESSLIST 捕获查询,过滤它们,然后杀死或打印它们。

第一步是将查询分组到类中。 --group-by选项控制分组。 默认情况下,该选项没有值,因此所有查询都被分组到一个默认类中。 对每个类应用所有类型的匹配和过滤(下一步)。 因此,您可能需要对查询进行分组,以便匹配/过滤某些类,而不是其他类。

第二步是匹配。 匹配意味着过滤,因为如果查询不符合某些条件,它就会从类中删除。 对每个类都进行匹配。 首先,通过各种Query Matches(查询匹配)选项(如--match-user)从类中过滤查询。 然后,通过各种类匹配选项(如--query-count)过滤整个类。

第三步是victim(牺牲者)选择,也就是说,在每个类中要杀死哪个匹配查询。 这是由--victims选项控制的。 尽管类中的许多查询可能匹配,但您可能只想终止最古老的查询,或所有查询,等等。

第四步也是最后一步是对来自所有类的所有匹配查询采取一些操作。 Actions选项指定将采取哪些操作。 在这个步骤中,没有更多的类,只有一个查询列表要销毁、打印等。

流程图

pt-kill原理

用法

pt-kill [OPTIONS] [DSN]#OPTIONS#指定的至少一个--kill,--kill-query,--print,--execute-command或--stop。#--any-busy-time并且--each-busy-time是互斥的。#--kill并且--kill-query是互斥的。#--daemonize并且--test-matching是互斥的。--ask-pass#略,详见pt-online-schema-change工具用法--charset#略,详见pt-online-schema-change工具用法--config#略,详见pt-online-schema-change工具用法--create-log-table#--log-dsn如果表不存在,则创建该表。#此选项导致使用该选项--log-dsn的文档中显示的默认结构创建指定的表--daemonize#略,详见pt-online-schema-change工具用法--database#略,详见pt-online-schema-change工具用法--defaults-file#略,详见pt-online-schema-change工具用法--filter#类型:字符串#丢弃此 Perl 代码未返回 true 的事件。#这个选项是一串 Perl 代码或一个包含 Perl 代码的文件,它被编译成一个带有一个参数的子程序:$event。这是一个哈希引用。如果给定值是可读文件,则pt-kill读取整个文件并将其内容用作代码。该文件不应包含shebang (#!/usr/bin/perl) 行。#如果代码返回 true,则回调链继续;否则结束。--group-by#类型:字符串#将匹配应用于按此 SHOW PROCESSLIST 列分组的每一类查询。除了 SHOW PROCESSLIST 的基本列(user、host、command、state 等)之外,查询还可以通过fingerprint抽象Info列中的 SQL 查询进行匹配。#默认情况下,查询未分组,因此匹配项和操作适用于所有查询。如果类中的任何查询匹配,则分组允许将匹配和操作应用于类似查询的类。#例如,检测缓存踩踏(请参阅下文all-but-oldest以 --victims了解该术语的解释)要求查询按arg属性分组。 这将创建相同查询的类(去掉注释)。 所以查询“SELECT c FROM t WHERE id=1”和“SELECT c FROM t WHERE id=1”被分组到同一个类中,但是查询c<“SELECT c FROM t WHERE id=3”>与前两个查询不相同,所以它被分组到另一个类中。 然后,当指定——victims all-but-oldest时,对于每个匹配匹配条件的查询类,每个类中除最老查询外的所有查询将被杀死。--help#显示帮助并退出。--host#简写:-h; 类型:字符串;默认:本地主机#连接到主机。--interval#类型:时间#检查要终止的查询的频率。如果--busy-time未给出,则默认间隔为 30 秒。否则默认值是--busy-time的一半。如果同时给出--interval和--busy-time,则使用显式--interval值。#另见--run-time。--log#类型:字符串#守护进程时将所有输出打印到此文件。--log-dsn#类型:DSN#存储在此 DSN 中杀死的每个查询。#该参数指定一个表来存储所有终止的查询。传入的 DSN 必须具有数据库 (D) 和表 (t) 选项。该表必须至少包含以下列。您可以为自己的特殊目的添加更多列,但pt-kill不会使用它们。以下 CREATE TABLE 定义也用于--create-log-table. MAGIC_create_log_table:#CREATE TABLE kill_log (#   kill_id     int(10) unsigned NOT NULL AUTO_INCREMENT,#   server_id   bigint(4) NOT NULL DEFAULT '0',#   timestamp   DATETIME,#   reason      TEXT,#   kill_error  TEXT,#   Id          bigint(4) NOT NULL DEFAULT '0',#   User        varchar(16) NOT NULL DEFAULT '',#   Host        varchar(64) NOT NULL DEFAULT '',#   db          varchar(64) DEFAULT NULL,#   Command     varchar(16) NOT NULL DEFAULT '',#   Time        int(7) NOT NULL DEFAULT '0',#   State       varchar(64) DEFAULT NULL,#   Info        longtext,#   Time_ms     bigint(21) DEFAULT '0', # NOTE, TODO: currently not used#   PRIMARY KEY (kill_id)#) DEFAULT CHARSET=utf8--password#略,详见pt-online-schema-change工具用法--pid#略,详见pt-online-schema-change工具用法--port#略,详见pt-online-schema-change工具用法--query-id#打印刚刚终止的查询的 ID。这相当于 pt-query-digest 的“ID”输出。这允许交叉引用两个工具的输出。#例子:#	查询 ID 0xE9800998ECF8427E#请注意,这是查询“指纹”的摘要(或哈希),因此具有相同形式但具有不同值的查询将具有相同的 ID。有关更多信息,请参阅 pt-query-digest。--rds#表示有问题的实例在 Amazon RDS 上。默认情况下,pt-kill运行 MySQL 命令“kill”--kill和“kill query” --kill-query。在 RDS 上,这两个命令不可用,由函数调用代替。此选项修改--kill为使用“CALL mysql.rds_kill(thread-id)”并--kill-query使用“CALL mysql.rds_kill_query(thread-id)”--run-time#类型:time#退出前运行多长时间。默认情况下pt-kill 会一直运行,或者直到它的进程被创建一个--sentinel文件而终止或停止。如果指定了此选项,pt-kill将运行指定的时间量并--interval在每次检查 PROCESSLIST 之间休眠数秒。--sentinel#类型:字符串;默认值:/tmp/pt-kill-sentinel#如果此文件存在,则退出。#指定的文件的存在--sentinel将导致所有正在运行的pt-kill实例退出。如有必要,您可能会发现这有助于优雅地停止 cron 作业。另见--stop。--slave-user#略,详见pt-online-schema-change工具用法--slave-password#略,详见pt-online-schema-change工具用法--set-vars#略,详见pt-online-schema-change工具用法--socket#略,详见pt-online-schema-change工具用法--stop#通过创建--sentinel文件停止运行实例。#使pt-kill创建由指定的哨兵文件--sentinel并退出。这应该具有停止所有正在监视相同哨兵文件的正在运行的实例的效果。--[no]strip-comments#默认:yes#从 PROCESSLIST 的 Info 列中的查询中删除 SQL 注释。--user#略,详见pt-online-schema-change工具用法--version#略,详见pt-online-schema-change工具用法--[no]version-check#略,详见pt-online-schema-change工具用法--victims#类型:字符串;默认:oldest#每个类中的哪些匹配查询将被杀死。匹配/过滤类后,此选项指定每个类中的哪个匹配查询将被终止(或打印等)。以下值是可能的:#1.oldest:只终止单个最旧的查询。这是为了防止杀死不是真正长时间运行的查询,它们只是等待很长时间。这会按时间对匹配的查询进行排序,并删除具有最高时间值的查询。#2.all:终止类中的所有查询。#3.all-but-oldest:除最旧的查询之外的所有查询。这是oldest值的倒数。#	此值可用于防止“缓存踩踏”,即在第一个查询尝试完成时执行多个相同查询并创建积压的情况。由于所有查询	 都是相同的,除了第一个查询之外的所有查询都被终止,以便它可以完成并填充缓存。--wait-after-kill#类型:time#在杀死查询之后等待,然后再寻找更多要杀死的查询。这样做的目的是给被阻塞的查询一个执行的机会,所以我们不会杀死一个阻塞了一堆其他人的查询,然后立即杀死其他人。--wait-before-kill#类型:time#在终止查询之前等待。这样做的目的是让你 --execute-command有机会看到匹配的查询并在它被杀死之前收集其他 MySQL 或系统信息。#OPTIONS-QUERY MATCHES(查询匹配)#这些选项从它们的类中过滤查询。如果查询不匹配,则将其从其类中删除。该--ignore选项优先。command、db、host 等的匹配对应于 SHOW PROCESSLIST 返回的列:Command、db、Host 等。默认情况下,所有模式匹配都区分大小写,但可以通过指定正则表达式使它们不区分大小写模式像(?i-xsm:select)。--busy-time#类型:时间;#匹配运行时间超过此时间的查询。查询必须处于 Command=Query 状态。这与 SHOW PROCESSLIST 报告的查询的时间值相匹配。--idle-time#类型:时间;#匹配空闲/休眠时间超过此时间的查询。查询必须处于 Command=Sleep 状态。这与 SHOW PROCESSLIST 报告的查询的时间值相匹配。--ignore-command#类型:字符串;#忽略其命令与此 Perl 正则表达式匹配的查询。#见--match-command。--ignore-db#类型:字符串;#忽略数据库(数据库)与此 Perl 正则表达式匹配的查询。#见--match-db。--ignore-host#类型:字符串;#忽略主机与此 Perl 正则表达式匹配的查询。#见--match-host--ignore-info#类型:字符串;#忽略其信息(查询)与此 Perl 正则表达式匹配的查询。#见--match-info。--[no]ignore-self#默认:是;#不要杀死pt-kill自己的连接。--ignore-state#类型:字符串;默认值:Locked#忽略状态与此 Perl 正则表达式匹配的查询。如果线程被锁定等待另一个线程,默认设置是防止线程被杀死。#见--match-state。--ignore-user#类型:字符串;#忽略用户与此 Perl 正则表达式匹配的查询。#见--match-user。--match-all#匹配所有未被忽略的查询。如果没有指定忽略选项,则每个查询都匹配(复制线程除外,除非——replication-threads也指定了)。 这个选项允许你指定负匹配,例如“匹配每个查询,除了… ,其中通过指定各种——忽略选项来定义异常。   #这个选项和所有受害者不一样。这个选项匹配一个类中的所有查询,而——victims all指定一个类中的所有匹配查询(无论它们是否匹配)将被杀死。 然而,通常情况下,这两个查询是一起使用的,因为如果您指定——受害者最古老的查询,那么尽管所有查询都可能匹配,但只有最古老的查询会被杀死。  --match-command#类型:字符串;#仅匹配其 Command 与此 Perl 正则表达式匹配的查询。#常用命令值为:#Query#Sleep#Binlog Dump#Connect#Delayed insert#Execute#Fetch#Init DB#Kill#Prepare#Processlist#Quit#Reset stmt#Table Dump--match-db#类型:字符串;#仅匹配 db(数据库)与此 Perl 正则表达式匹配的查询。--match-host#类型:字符串;#仅匹配 Host 与此 Perl 正则表达式匹配的查询。#Host 值通常包括端口,如“host:port”。--match-info#类型:字符串;组:查询匹配#仅匹配其信息(查询)与此 Perl 正则表达式匹配的查询。#processlist 的 Info 列显示正在执行的查询,如果没有查询正在执行,则显示为 NULL。--match-state#类型:字符串;#仅匹配状态与此 Perl 正则表达式匹配的查询。#常见的状态值是:#Locked#login#copy to tmp table#Copying to tmp table#Copying to tmp table on disk#Creating tmp table#executing#Reading from net#Sending data#Sorting for order#Sorting result#Table lock#Updating--match-user#类型:字符串;组:查询匹配#仅匹配用户与此 Perl 正则表达式匹配的查询。--replication-threads#允许匹配和杀死复制线程。#默认情况下,匹配不适用于复制线程;即复制线程被完全忽略。指定此选项允许匹配匹配(并可能杀死)主节点和从节点上的复制线程。--test-matching#类型:数组;#带有用于测试匹配选项的进程列表快照的文件。由于匹配选项可能很复杂,您可以将 processlist 的快照保存在文件中,然后针对这些文件中的查询测试匹配选项。#该选项禁用--run-time,--interval和--[no]ignore-self。#OPTIONS-CLASS MATCHES#这些匹配适用于整个查询类。类是通过指定--group-by选项创建的,否则所有查询都是单个默认类的成员。#另请参阅“分组、匹配和杀死”。--any-busy-time#类型:时间;#如果任何查询运行时间超过此时间,则匹配查询类。“长于”意味着,10例如,如果您指定,则该类将仅在至少有一个已运行超过 10 秒的查询时匹配。#有关--each-busy-time更多详细信息,请参阅。--each-busy-time#类型:时间;#如果每个查询的运行时间超过此时间,则匹配查询类。“Longer than”意味着,10例如,如果您指定,则该类仅在每个查询运行时间超过 10 秒时才匹配。#另请参阅--any-busy-time(如果任何查询的运行时间超过指定时间,则匹配类)和--busy-time.--query-count#类型:int;#如果查询类至少有这么多查询,则匹配查询类。当通过指定将查询分组到类中时--group-by,此选项会导致匹配仅应用于至少具有这么多查询的类。如果--group-by 未指定,则仅当整个 SHOW PROCESSLIST 中至少有这么多查询时,此选项才会导致匹配应用。--verbose#简短形式:-v#将有关正在执行的操作的信息打印到 STDOUT。#OPTIONS-ACTIONS#对来自所有类的每个匹配查询执行这些操作。操作按以下顺序执行:--print, --execute-command, --kill/ --kill-query。此顺序允许--execute-command 查看/--print之前的输出和查询 。这可能会有所帮助,因为pt-kill不会将任何信息传递给.--kill--kill-query--execute-command#另请参阅“分组、匹配和杀死”。--execute-command#类型:字符串;#当查询匹配时执行此命令。#命令执行后,pt-kill无法控制它,所以命令负责自己的信息收集,日志记录,间隔等。 每次查询匹配时都会执行该命令,因此请注意命令表现良好运行多个实例时。没有来自pt-kill 的信息传递给命令。#另见--wait-before-kill。--kill#终止匹配查询的连接。#此选项使pt-kill终止具有匹配查询的连接(也称为进程、线程)。使用--kill-query,如果你只是想杀死单个查询,而不是它们的连接。#除非--print也给出,否则不会打印其他信息表明pt-kill匹配并终止了查询。#另见--wait-before-kill和--wait-after-kill。--kill-busy-commands#类型:字符串;默认:查询#逗号分隔的命令列表,如果它们运行超过--busy-time几秒钟,将被监视/杀死。默认:Query#默认情况下,--busy-time只杀死Query命令,但在某些情况下,需要 make--busy-time来监视和杀死其他命令。例如,准备好的语句执行命令是Execute代替Query。在这种情况下,指定--kill-busy-commands=Query,Execute也将终止准备好的 stamente 执行。--kill-query#杀死匹配的查询。#此选项使pt-kill终止匹配查询。这需要 MySQL 5.0 或更新版本。与--kill杀死匹配查询的连接不同,此选项仅杀死查询,而不是其连接。--print#打印匹配查询的 KILL 语句;实际上并没有终止查询。#如果您只想查看哪些查询匹配并且会在不实际杀死它们的情况下被杀死,请指定--print. 要同时终止和打印匹配查询,请同时指定--kill和--print。

使用示例

#kill掉运行时间超过10秒的sql[root@localhost ~]# pt-kill --busy-time 10 --kill#查看sql运行情况mysql> select sleep(60) id from test.test_oscbk where id = 1;ERROR 2013 (HY000): Lost connection to MySQL server during querymysql> select sleep(60) id from test.test_oscbk where id = 2;ERROR 2013 (HY000): Lost connection to MySQL server during query#打印运行时间超过10秒的sql,不杀死#	如果单纯的打印不杀死,pt-kill会一致打印检测到的第一条的信息,知道这条语句结束才会打印下一条语句[root@localhost ~]# pt-kill --busy-time 10 --print# 2021-08-11T14:27:53 KILL 113 (Query 11 sec) select sleep(60) id from test.test_oscbk where id = 1# 2021-08-11T14:27:58 KILL 113 (Query 16 sec) select sleep(60) id from test.test_oscbk where id = 1# 2021-08-11T14:28:03 KILL 113 (Query 21 sec) select sleep(60) id from test.test_oscbk where id = 1# 2021-08-11T14:28:08 KILL 113 (Query 26 sec) select sleep(60) id from test.test_oscbk where id = 1# 2021-08-11T14:28:13 KILL 113 (Query 31 sec) select sleep(60) id from test.test_oscbk where id = 1# 2021-08-11T14:28:18 KILL 113 (Query 36 sec) select sleep(60) id from test.test_oscbk where id = 1# 2021-08-11T14:28:23 KILL 113 (Query 41 sec) select sleep(60) id from test.test_oscbk where id = 1# 2021-08-11T14:28:28 KILL 113 (Query 46 sec) select sleep(60) id from test.test_oscbk where id = 1# 2021-08-11T14:28:33 KILL 113 (Query 51 sec) select sleep(60) id from test.test_oscbk where id = 1# 2021-08-11T14:28:38 KILL 113 (Query 56 sec) select sleep(60) id from test.test_oscbk where id = 1# 2021-08-11T14:28:43 KILL 114 (Query 59 sec) select sleep(60) id from test.test_oscbk where id = 2#kill掉运行时间超过10秒的sql并打印信息[root@localhost ~]# pt-kill --busy-time 10 --kill --print# 2021-08-11T14:34:21 KILL 113 (Query 11 sec) select sleep(60) id from test.test_oscbk where id = 1# 2021-08-11T14:34:26 KILL 114 (Query 13 sec) select sleep(60) id from test.test_oscbk where id = 2#kill掉运行时间超过10秒的sql并打印信息,将kill掉sql的信息写入到表#	加上--run-time=30s目的是让这条sql运行30秒后结束,不加,pt-kill会一直运行#	如果你已经按标准创建了kill_log表则不需要加--create-log-table参数[root@localhost ~]# pt-kill --busy-time 10 --kill --print --create-log-table --log-dsn D=test,t=kill_log -h172.18.40.128 -upcloud -ppcloud --run-time=30s# 2021-08-11T14:37:41 KILL 118 (Query 12 sec) select sleep(60) id from test.test_oscbk where id = 1# 2021-08-11T14:37:46 KILL 117 (Query 11 sec) select sleep(60) id from test.test_oscbk where id = 2#查看表信息mysql> select * from kill_log\G;*************************** 1. row ***************************   kill_id: 1 server_id: 128 timestamp: 2021-08-11 14:37:41    reason: Exceeds busy timekill_error:        Id: 118      User: root      Host: localhost        db: NULL   Command: Query      Time: 12     State: User sleep      Info: select sleep(60) id from test.test_oscbk where id = 1   Time_ms: NULL*************************** 2. row ***************************   kill_id: 2 server_id: 128 timestamp: 2021-08-11 14:37:46    reason: Exceeds busy timekill_error:        Id: 117      User: pcloud      Host: localhost        db: test   Command: Query      Time: 11     State: User sleep      Info: select sleep(60) id from test.test_oscbk where id = 2   Time_ms: NULL2 rows in set (0.00 sec)#kill掉Query状态的所有的sql#	--match-command参数按sql的状态查询所需sql,当然还有按sql信息查询的--match-info、按sql声明	查询的--match-state、按主机查询的--ignore-host/--match-host、按数据查询的--ignore-db/-	-match-user、按用户查询的--ignore-user/--match-user#	--victims all会kill掉所有符合条件的sql,详细见用法参数介绍[root@localhost ~]# pt-kill --kill --print --match-command Query --victims all --log-dsn D=test,t=kill_log --run-time=30s# 2021-08-11T14:53:54 KILL 123 (Query 6 sec) select sleep(60) id from test.test_oscbk where id = 1# 2021-08-11T14:53:54 KILL 122 (Query 3 sec) select sleep(60) id from test.test_oscbk where id = 2#查看表信息*************************** 3. row ***************************   kill_id: 3 server_id: 128 timestamp: 2021-08-11 14:53:54    reason: Query matches Command speckill_error:        Id: 123      User: pcloud      Host: localhost        db: NULL   Command: Query      Time: 6     State: User sleep      Info: select sleep(60) id from test.test_oscbk where id = 1   Time_ms: NULL*************************** 4. row ***************************   kill_id: 4 server_id: 128 timestamp: 2021-08-11 14:53:54    reason: Query matches Command speckill_error:        Id: 122      User: pcloud      Host: localhost        db: NULL   Command: Query      Time: 3     State: User sleep      Info: select sleep(60) id from test.test_oscbk where id = 2   Time_ms: NULL4 rows in set (0.00 sec)#每5s检查一次,kill掉Query超过10秒的sql[root@localhost ~]# pt-kill --kill --print --busy-time 10 --match-command Query --victims all --log-dsn D=test,t=kill_log --interval=5s# 2021-08-11T15:12:22 KILL 155 (Query 12 sec) select sleep(60) id from test.test_oscbk where id = 1# 2021-08-11T15:12:22 KILL 156 (Query 10 sec) select sleep(60) id from test.test_oscbk where id = 2# 2021-08-11T15:12:37 KILL 157 (Query 14 sec) select sleep(60) id from test.test_oscbk where id = 1# 2021-08-11T15:12:37 KILL 158 (Query 11 sec) select sleep(60) id from test.test_oscbk where id = 2# 2021-08-11T15:12:52 KILL 159 (Query 13 sec) select sleep(60) id from test.test_oscbk where id = 1# 2021-08-11T15:12:52 KILL 160 (Query 11 sec) select sleep(60) id from test.test_oscbk where id = 2# 2021-08-11T15:13:07 KILL 161 (Query 14 sec) select sleep(60) id from test.test_oscbk where id = 1# 2021-08-11T15:13:07 KILL 162 (Query 11 sec) select sleep(60) id from test.test_oscbk where id = 2

pt-duplicate-key-checker

功能

在 MySQL 表上查找重复的索引和外键。

基本原理

该程序检查 MySQL 表上的 SHOW CREATE TABLE 的输出,如果它发现索引以相同的顺序覆盖与另一个索引相同的列,或者覆盖另一个索引的最左边的前缀,它会打印出可疑索引。默认情况下,索引必须是相同的类型,因此 BTREE 索引不是 FULLTEXT 索引的副本,即使它们具有相同的列。您可以覆盖它。

它还查找重复的外键。重复的外键覆盖与同一个表中的另一个相同的列,并引用同一个父表。

输出以简短摘要结尾,其中包括对重复索引正在使用的总大小(以字节为单位)的估计。这是通过将索引长度乘以各自表中的行数来计算的。

用法

pt-duplicate-key-checker [OPTIONS] [DSN]#OPTIONS--all-structs#比较具有不同结构(BTREE、HASH 等)的索引。#默认情况下这是禁用的,因为例如,覆盖与 FULLTEXT 索引相同的列的 BTREE 索引并不是真正的重复项。--ask-pass#略,详见pt-online-schema-change工具用法--charset#略,详见pt-online-schema-change工具用法--[no]clustered#默认:yes#附加到辅助键的 PK 列是重复的。#检测辅助键的后缀是否为主键的最左边前缀,并将其视为重复键。仅在主键为集群的存储引擎(当前为InnoDB和solidDB)上检测到此情况。  #集群存储引擎无论如何都会将主键列附加到所有辅助键的叶节点,因此您可能会认为让它们也出现在内部节点中是多余的。当然,您可能还希望在内部节点中使用它们,因为仅在叶节点中使用它们对某些查询没有帮助。不过,它确实有助于覆盖索引查询。  #下面是这个选项中一个被认为是冗余的键的例子:#	PRIMARY KEY  (`a`)#	KEY `b` (`b`,`a`)#这种索引的使用相当微妙。例如,假设你有以下查询:#	SELECT ... WHERE b=1 ORDER BY a;#如果我们删除b,a上的索引,这个查询将执行文件排序。但如果我们将b,a上的索引缩短为b,并删除ORDER BY,查询应该返回相同的结果。#该工具建议通过删除键并在没有主键前缀的情况下重新添加它来缩短重复聚集键。缩短的聚集键仍然可能重复另一个键,但如果不再次运行以重新检查新缩短的聚集键,工具目前无法检测到这种情况。因此,如果你缩短了任何重复的集群键,你应该再次运行该工具。--config#略,详见pt-online-schema-change工具用法--databases#略,详见pt-online-schema-change工具用法--defaults-file#略,详见pt-online-schema-change工具用法--engines#简写:-e; 类型:哈希#仅检查其存储引擎在此逗号分隔列表中的表。--help#略,详见pt-online-schema-change工具用法--host#略,详见pt-online-schema-change工具用法--ignore-databases#类型:哈希#忽略这个以逗号分隔的数据库列表。--ignore-engines#类型:哈希#忽略此逗号分隔的存储引擎列表。--ignore-order#忽略索引顺序,因此 KEY(a,b) 复制 KEY(b,a)。--ignore-tables#类型:哈希#忽略这个以逗号分隔的表格列表。表名可以用数据库名来限定。--key-types#类型:字符串;默认值:fk#检查重复的 f=外键、k=keys 或 fk=both。--password#略,详见pt-online-schema-change工具用法--pid#略,详见pt-online-schema-change工具用法--port#略,详见pt-online-schema-change工具用法--set-vars#略,详见pt-online-schema-change工具用法--socket#略,详见pt-online-schema-change工具用法--[no]sql#默认:yes#为每个重复键打印 DROP KEY 语句。默认情况下,ALTER TABLE DROP KEY 语句打印在每个重复键下方,因此,如果您想删除重复键,可以将该语句复制粘贴到 MySQL 中。#要禁用打印这些语句,请指定--no-sql.--[no]summary#默认:yes#在输出结束时打印索引摘要。--tables#简写:-t; 类型:哈希#仅检查此逗号分隔的表格列表。#表名可以用数据库名来限定。--user#略,详见pt-online-schema-change工具用法--verbose#略,详见pt-online-schema-change工具用法--version#略,详见pt-online-schema-change工具用法

使用示例

#打印test库里的重复索引情况并输出建议#--clustered:将二级索引包含主键的情况也打印出来#--all-structs:同一个的不同种类索引也打印出来,比如某列c1,有fulltext索引个BTREE索引,这样的情况也会检查[root@localhost ~]# pt-duplicate-key-checker --host=172.18.40.128 -upcloud -ppcloud --databases=test --clustered --all-structs# ######################################################################### test.child# ######################################################################### FOREIGN KEY child_ibfk_2 (`c2`) REFERENCES `test`.`parent` (`c2`) is a duplicate of FOREIGN KEY child_ibfk_1 (`c2`) REFERENCES `test`.`parent` (`c2`)# Key definitions:#   CONSTRAINT `child_ibfk_2` FOREIGN KEY (`c2`) REFERENCES `parent` (`c2`)#   CONSTRAINT `child_ibfk_1` FOREIGN KEY (`c2`) REFERENCES `parent` (`c2`)# Column types:#         `c2` varchar(32) default null# To remove this duplicate foreign key, execute:ALTER TABLE `test`.`child` DROP FOREIGN KEY `child_ibfk_2`;# MySQL uses the c2 index for this foreign key constraint# ######################################################################### test.duplicate_key_check# ######################################################################### index_b is a duplicate of index_a# Key definitions:#   KEY `index_b` (`c2`,`c3`,`c4`),#   KEY `index_a` (`c2`,`c3`,`c4`),# Column types:#         `c2` varchar(32) default null#         `c3` varchar(32) default null#         `c4` varchar(32) default null# To remove this duplicate index, execute:ALTER TABLE `test`.`duplicate_key_check` DROP INDEX `index_b`;# index_c is a left-prefix of index_a# Key definitions:#   KEY `index_c` (`c2`,`c3`)#   KEY `index_a` (`c2`,`c3`,`c4`),# Column types:#         `c2` varchar(32) default null#         `c3` varchar(32) default null#         `c4` varchar(32) default null# To remove this duplicate index, execute:ALTER TABLE `test`.`duplicate_key_check` DROP INDEX `index_c`;# ######################################################################### Summary of indexes# ######################################################################### Size Duplicate Indexes   495# Total Duplicate Indexes  3# Total Indexes            20

pt-deadlock-logger

功能

记录 MySQL 死锁

基本原理

pt-deadlock-logger通过轮询和解析SHOW ENGINE INNODB STATUS来打印MySQL死锁信息。 当发生新的死锁时,它被打印到STDOUT,如果指定,则保存到--dest

只打印新的死锁。 使用死锁的服务器、ts(时间戳)和线程值(即使这些列不是由——列指定的)为每个死锁创建一个指纹。 如果死锁的指纹与上一个死锁的指纹不同,则会打印死锁。

--dest语句使用INSERT IGNORE来消除重复的死锁,因此为每个--iterations保存每个死锁。

用法

pt-deadlock-logger [OPTIONS] DSN#pt-deadlock-logger记录给定DSN上的MySQL死锁信息。 信息被打印到STDOUT,也可以通过指定--dest保存到表中。 除非指定了--run-time时或--iterations,否则工具将永远运行。--ask-pass#略,详见pt-online-schema-change工具用法--charset#略,详见pt-online-schema-change工具用法--clear-deadlocks#使用这个表可以创建一个小死锁。这通常会清除一个巨大的死锁,否则会消耗整个SHOW INNODB STATUS的输出。该表必须不存在。pt-deadlock-logger将使用以下结构创建它:#CREATE TABLE percona_schema.clear_deadlocks (#  a INT PRIMARY KEY#) ENGINE=InnoDB#创建表并导致小死锁后,该工具将再次删除该表。--columns#类型: Array; 默认: server, ts, thread, txn_id, txn_time, user, hostname, ip, db, tbl, idx, lock_type, lock_mode, wait_hold, victim, query#列是:#	1.server:发生死锁的(源)服务器。如果您要跟踪许多服务器上的死锁,这可能很有用。#	2.ts:上次检测到的死锁的日期和时间。#	3.thread:MySQL 线程号,与 SHOW FULL PROCESSLIST 中的连接 ID 相同。#	4.txn_id:InnoDB 事务 ID,InnoDB 表示为两个无符号整数。我已经将它们相乘成为一个数字。#	5.txn_time:发生死锁时事务处于活动状态的时间。#	6.user:连接的数据库用户名。#	7.hostname:连接的主机。#	8.ip:连接的 IP 地址。如果指定--numeric-ip,则将其转换为无符号整数。#	9.db:发生死锁的数据库。#	10.tbl:发生死锁的表。#	11.idx:发生死锁的索引。#	12.lock_type:锁类型在导致死锁的锁上持有的事务。#	13.lock_mode:导致死锁的锁的锁模式。#	14.wait_hold:事务是等待锁还是持有锁。通常你会看到两个等待的锁。#	15.victim:事务是否被选为死锁受害者并回滚。#	16.query:导致死锁的查询。--config#略,详见pt-online-schema-change工具用法--create-dest-table#创建由 指定的表--dest。#通常该--dest表应该已经存在。此选项会导致pt-deadlock-logger使用建议的表结构自动创建表。--daemonize#略,详见pt-online-schema-change工具用法--database#略,详见pt-online-schema-change工具用法--defaults-file#略,详见pt-online-schema-change工具用法--dest#类型:DSN#DSN 用于存储死锁的位置;至少指定一个数据库 (D) 和表 (t)。#缺失值由源主机中的相同值填充,因此如果您将死锁存储在发生死锁的同一台服务器上,通常可以省略此参数的大部分内容。#如果要存储pt-deadlock-logger可以提取的有关死锁的所有信息,建议使用以下表结构:#CREATE TABLE deadlocks (#  server char(20) NOT NULL,#  ts timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,#  thread int unsigned NOT NULL,#  txn_id bigint unsigned NOT NULL,#  txn_time smallint unsigned NOT NULL,#  user char(16) NOT NULL,#  hostname char(20) NOT NULL,#  ip char(15) NOT NULL, -- alternatively, ip int unsigned NOT NULL#  db char(64) NOT NULL,#  tbl char(64) NOT NULL,#  idx char(64) NOT NULL,#  lock_type char(16) NOT NULL,#  lock_mode char(1) NOT NULL,#  wait_hold char(1) NOT NULL,#  victim tinyint unsigned NOT NULL,#  query text NOT NULL,#  PRIMARY KEY  (server,ts,thread)#) ENGINE=InnoDB#如果使用--columns,则可以省略不想存储的列。--help#显示帮助并退出。--host#简写:-h; 类型:字符串#连接到主机。--interval#类型:时间;默认值:30#检查死锁的频率。如果没有--run-time指定, pt-deadlock-logger将永远运行,在每个时间间隔检查死锁。另见--run-time。--iterations#类型:int#检查死锁的次数。 默认情况下,该选项是未定义的,这意味着无限次的迭代。 无论为该选项指定的值如何,该工具总是在——run-time时退出。 例如,该工具将在1分钟后以——run-time 1m——iterations 4——interval 30退出,因为以30秒为间隔的4次迭代将花费2分钟,比1分钟的运行时间更长。  --log#类型:字符串#守护进程时将所有输出打印到此文件。--numeric-ip#将 IP 地址表示为整数。--password#简写形式:-p; 类型:字符串#连接时使用的密码。--pid#略,详见pt-online-schema-change工具用法--port#简写:-P; 类型:int#用于连接的端口号。--quiet#不要死锁;只将错误和警告打印到STDERR.--run-time#类型:时间#退出前运行多长时间。默认情况下pt-deadlock-logger永远运行,每--interval秒钟检查一次死锁。--set-vars#略,详见pt-online-schema-change工具用法--socket#略,详见pt-online-schema-change工具用法--tab#使用制表符来分隔列而不是空格。--user#略,详见pt-online-schema-change工具用法--version#略,详见pt-online-schema-change工具用法--[no]version-check#略,详见pt-online-schema-change工具用法

使用示例

模拟死锁:(左边session 1,右边session 2)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bmYBlpBy-1629711178815)(C:\Users\powersi\AppData\Roaming\Typora\typora-user-images\image-20210812102108283.png)]

#输出服务器死锁信息[root@localhost ~]# pt-deadlock-logger h=172.18.40.128,u=pcloud,p=pcloudserver ts thread txn_id txn_time user hostname ip db tbl idx lock_type lock_mode wait_hold victim query172.18.40.128 2021-08-12T10:08:40 176 0 45 pcloud localhost  test lock_test PRIMARY RECORD X w 0 select * from lock_test where c1=2 for update172.18.40.128 2021-08-12T10:08:40 178 0 25 pcloud localhost  test lock_test PRIMARY RECORD X w 1 select * from lock_test where c1=1 for updateserver ts thread txn_id txn_time user hostname ip db tbl idx lock_type lock_mode wait_hold victim query172.18.40.128 2021-08-12T10:16:52 176 0 27 pcloud localhost  test lock_test PRIMARY RECORD X w 0 select * from lock_test where c1=1 for update172.18.40.128 2021-08-12T10:16:52 178 0 33 pcloud localhost  test lock_test PRIMARY RECORD X w 1 select * from lock_test where c1=2 for update#输出某张表死锁信息[[root@localhost ~]# pt-deadlock-logger h=172.18.40.128,u=pcloud,p=pcloud --database=test t=lock_testserver ts thread txn_id txn_time user hostname ip db tbl idx lock_type lock_mode wait_hold victim query172.18.40.128 2021-08-12T10:23:10 176 0 27 pcloud localhost  test lock_test PRIMARY RECORD X w 0 select * from lock_test where c1=2 for update172.18.40.128 2021-08-12T10:23:10 180 0 10 pcloud localhost  test lock_test PRIMARY RECORD X w 1 select * from lock_test where c1=1 for update#输出死锁的信息到表中#如果已经创建deadlocks表则不需要加--create-dest-table参数[[root@localhost ~]# pt-deadlock-logger h=172.18.40.128,u=pcloud,p=pcloud --create-dest-table --dest D=test,t=deadlocksserver ts thread txn_id txn_time user hostname ip db tbl idx lock_type lock_mode wait_hold victim query172.18.40.128 2021-08-12T10:23:10 176 0 27 pcloud localhost  test lock_test PRIMARY RECORD X w 0 select * from lock_test where c1=2 for update172.18.40.128 2021-08-12T10:23:10 180 0 10 pcloud localhost  test lock_test PRIMARY RECORD X w 1 select * from lock_test where c1=1 for update#查看表信息mysql> select * from deadlocks\G;*************************** 1. row ***************************   server: 172.18.40.128       ts: 2021-08-12 10:23:10   thread: 176   txn_id: 0 txn_time: 27     user: pcloud hostname: localhost       ip:       db: test      tbl: lock_test      idx: PRIMARYlock_type: RECORDlock_mode: Xwait_hold: w   victim: 0    query: select * from lock_test where c1=2 for update*************************** 2. row ***************************   server: 172.18.40.128       ts: 2021-08-12 10:23:10   thread: 180   txn_id: 0 txn_time: 10     user: pcloud hostname: localhost       ip:       db: test      tbl: lock_test      idx: PRIMARYlock_type: RECORDlock_mode: Xwait_hold: w   victim: 1    query: select * from lock_test where c1=1 for update2 rows in set (0.01 sec)#运行120s每隔20s检查一次死锁输出死锁的信息到表中[root@localhost ~]# pt-deadlock-logger h=172.18.40.128,u=pcloud,p=pcloud --dest D=test,t=deadlocks --run-time=120s --interval=20sserver ts thread txn_id txn_time user hostname ip db tbl idx lock_type lock_mode wait_hold victim query172.18.40.128 2021-08-12T10:43:28 176 0 51 pcloud localhost  test lock_test PRIMARY RECORD X w 0 select * from lock_test where c1=2 for update172.18.40.128 2021-08-12T10:43:28 180 0 43 pcloud localhost  test lock_test PRIMARY RECORD X w 1 select * from lock_test where c1=1 for updateserver ts thread txn_id txn_time user hostname ip db tbl idx lock_type lock_mode wait_hold victim query172.18.40.128 2021-08-12T10:44:20 176 0 20 pcloud localhost  test lock_test PRIMARY RECORD X w 0 select * from lock_test where c1=2 for update172.18.40.128 2021-08-12T10:44:20 180 0 14 pcloud localhost  test lock_test PRIMARY RECORD X w 1 select * from lock_test where c1=1 for update

pt-table-sync

功能

在 MySQL 表之间有效地同步数据。

描述

pt-table-sync对表数据进行单向和双向同步。它并没有同步表结构,索引,或任何其他模式对象。下面介绍单向同步。稍后描述“双向同步”。

这个工具很复杂,有几种不同的功能。 为了安全有效地使用它,您应该了解三件事:复制(--replicate)的目的、查找差异和指定主机。 这三个概念紧密相关,并决定了工具将如何运行。 下面是缩写的逻辑:

如果DSN 有一部分,则仅同步该表:   如果 1 个DSN:      如果--sync-to-master:         DSN 是一个从属设备。连接到它的主人并同步。   如果超过1 个DSN:      第一个 DSN 是源。依次同步每个 DSN。否则 如果--replicate:   如果--sync-to-master:      DSN 是一个从属设备。连接到它的主人,查找记录      的差异,并修复。   其他:      DSN 是主人。找到slave并连接到每个,      查找差异记录并修复。否则:   如果只有1 个DSN 和 --sync-to-master:      DSN 是一个从属设备。连接到它的主人,找到表和      使用 --databases 等过滤,并将每个表同步到主表。   其他:      查找表,使用 --databases 等进行过滤,并同步每个表      以DSN为先。

pt-table-sync可以通过以下两种方式运行:有--replication或没有。 默认情况下运行时不带--replication,这会导致pt-table-sync使用几种算法中的一种自动有效地查找差异(请参阅“算法”)。 或者,如果指定了--replication的值,则会导致pt-table-sync使用先前使用自己的--replication选项运行pt-table-checksum所找到的差异。 严格地说,您不需要使用--replication,因为pt-table-sync可以找到差异,但许多人使用--replication,例如,如果他们定期使用pt-table-checksum校验和,然后根据需要使用pt-table-sync修复差异。 如果不确定,请仔细阅读每个工具的文档并自己做出决定,或者咨询专家。

无论是否使用--replication,都需要指定要同步的主机。 有两种方法:使用--sync-to-master或不使用。 指定--sync-to-master使pt-table-sync在命令行中只需要一个从DSN。 该工具将自动发现奴隶的主人和同步它,使其数据是相同的主人。 这是通过在主服务器上进行更改,然后通过复制流并更新从服务器来解决其差异来实现的。 但是要小心:尽管这个选项指定并同步一个从服务器,但是如果同一个主服务器上还有其他从服务器,它们将通过复制接收到您试图同步的从服务器的更改。

或者,如果没有指定--sync-to-master,则命令行上给出的第一个DSN是源主机。 只有一个源主机。 如果不指定--replication,则必须至少指定一个其他DSN作为目标主机。 可以有一个或多个目标主机。 源主机和目标主机必须是独立的; 它们不能在相同的复制拓扑中。 如pt-table-sync检测到目标主机是从属主机,因为更改直接写入目标主机(直接写入从属主机是不安全的),它将死并出现错误。 或者,如果指定--replication(而不是--sync-to-master),那么pt-table-sync需要命令行上有且只有一个主DSN。 该工具将自动发现所有的主的奴隶和同步他们的主。 这是一次同步多个(所有)奴隶的唯一方法(因为--sync-to-master只指定一个slave)。

命令行上的每个主机都被指定为DSN。 第一个DSN(或仅在类似--sync-to-master的情况下的DSN)为其他DSN提供默认值,无论这些其他DSN是在命令行上指定的还是由工具自动发现的。 在这个例子中,

pt-table-sync --execute h = host1,u = msandbox,p = msandbox h = host2

host2 DSN 继承了 host1 DSN的upDSN 部分。使用该--explain-hosts选项查看pt-table-sync将如何解释命令行上给出的 DSN。

算法

pt-table-sync有一个通用的数据同步框架,它使用不同的算法来寻找差异。 该工具根据索引、列类型和——algorithms指定的算法首选项,自动为每个表选择最佳算法。 以下是可用的算法,按照它们的默认优先顺序列出:

  • Chunk

    查找第一列是数字(包括日期和时间类型)的索引,并将该列的值范围划分为近似--chunk-size行的块 。通过对整个块进行校验和,一次同步一个块。如果块在源和目标上不同,则单独校验每个块的行以找到不同的行。

    当列具有足够的基数以使块最终达到正确的大小时,这是有效的。

    初始的每个块校验和非常小,导致最小的网络流量和内存消耗。如果必须检查块的行,则仅通过网络发送主键列和校验和,而不是整行。如果发现某行不同,则将获取整行,但不会在此之前获取。

    请注意,如果对所有值都以相同字符开头的 char 列进行分块,则此算法将不起作用。在这种情况下,该工具将退出并建议选择不同的算法。

  • Nibble

    使用非回溯算法查找索引并在行的固定大小半字节中递增索引(有关此算法的更多信息,请参阅 pt-archiver)。它与“Chunk”非常相似,但它不是根据索引基数预先计算每个表的边界,而是用于 LIMIT定义每个半字节的上限,并使用前一个半字节的上限来定义下限。

    它分步骤工作:一个查询找到将定义下一个半字节上边界的行,下一个查询对整个半字节进行校验和。如果源和目标之间的半字节不同,它会逐行检查半字节,就像“块”一样。

  • GroupBy

    选择按所有列分组的整个表,并添加一个 COUNT() 列。比较所有列,如果它们相同,则比较 COUNT() 列的值以确定要在目标中插入或删除多少行。适用于没有主键或唯一索引的表。

  • Stream

    在一个大流中选择整个表并比较所有列。选择所有列。效率远低于其他算法,但在没有合适的索引可供使用时有效。

  • Future Plans

    未来算法的可能性是 TempTable(我在此工具的早期版本中最初称为自下而上)、DrillDown(我最初称为自上而下)和 GroupByPrefix(类似于 SqlYOG 作业代理的工作方式)。每种算法都有优点和缺点。如果您想实施您最喜欢的技术来查找可能不同服务器上的两个数据源之间的差异,我愿意提供帮助。算法遵循一个简单的界面,这使得编写自己的算法变得非常容易。

双向同步

双向同步是一项新的实验性功能。为了使其可靠地工作,有许多严格的限制:

1.仅在将一台服务器同步到其他独立服务器时有效2.对复制不起作用3.要求表( s )可使用 Chunk 算法分块4.不是N路,在两个服务器之间唯一的双向时间5.不处理 DELETE 更改

例如,假设我们有三台服务器:c1、r1、r2。c1 是中央服务器,是其他服务器的伪主服务器(即 r1 和 r2 不是 c1 的从属服务器)。r1 和 r2 是远程服务器。表 foo 中的行被更新并插入到所有三台服务器上,我们希望同步所有服务器之间的所有更改。表 foo 有列:

id    int PRIMARY KEYts    timestamp auto updatedname  varchar

使用自动增量偏移量,以便来自任何服务器的新行不会创建冲突的主键 (id) 值。通常,当在双向同步期间发现相同但不同的行时,由 ts 列确定的较新行优先。“相同但不同”意味着两行具有相同的主键 (id) 值,但其他列的值不同,例如本示例中的名称列。相同但不同的冲突由“冲突”解决。冲突比较竞争行的某些列以确定“赢家”。获胜行成为源,其值用于更新另一行。

您应该熟悉的用于实现双向同步的三列之间存在细微差别:块列 ( --chunk-column)、比较列 ( --columns) 和冲突列 ( --conflict-column)。chunk 列仅用于对表进行分块;例如“WHERE id >= 5 AND id < 10”。对块进行校验和,当块校验和显示差异时,该工具会选择该块中的行--columns并对每行进行校验和。如果列校验和不同,则行具有一个或多个冲突的列值。在传统的单向同步中,冲突是一个有争议的问题,因为它可以通过用源行的值更新整个目标行来解决。然而,在双向同步中,--conflict-column (根据其他--conflict-*下面的选项列表)比较以确定哪一行是“正确的”或“权威的”;该行成为“源”。

要完全同步所有三个服务器,需要运行两次pt-table-sync。第一次运行同步 c1 和 r1,然后同步 c1 和 r2,包括来自 r1 的任何更改。此时 c1 和 r2 完全同步,但 r1 缺少来自 r2 的任何更改,因为 c1 和 r1 同步时没有这些更改。所以需要第二次运行以相同的顺序同步服务器,但是这次当 c1 和 r1 同步时,r1 得到 r2 的更改。

该工具不同步 N 路,仅在命令行上给出的第一个 DSN 和每个后续 DSN 之间双向同步。因此,此示例中的工具将运行两次,如下所示:

pt-table-sync --bidirectional h = c1 h = r1 h = r2

该[--bidirectionalt-table-sync.html#cmdoption-pt-table-sync-bidirectional)选项启用此功能并导致执行各种健全性检查。您必须指定其他选项,告诉 pt-table-sync如何解决相同但不同行的冲突。这些选项是:

* --conflict-column* --conflict-comparison* --conflict-value* --conflict-threshold* --conflict-error">  (optional)

使用--print测试之前这个选项--execute。打印的 SQL 语句将有注释说明如果您使用--execute.

技术说明:第一个 DSN 始终是“左”服务器,其他 DSN 始终是“右”服务器。由于任一服务器都可以成为源或目标,因此将它们视为“src”和“dst”会令人困惑。因此,它们通常被称为左和右。很容易记住这一点,因为第一个 DSN 总是在命令行中其他服务器DSN 的左侧。

限制

使用基于行复制的副本

当使用--sync-to-master--replication选项时,pt-table-sync需要基于语句的复制。 因此,如果需要,它会在主服务器上为其会话设置binlog_format=STATEMENT。 要做到这一点,用户必须有超级特权。

基本原理

1、单行数据checksum值的计算

和pt-table-checksum一样,也是先检查表结构,并获取每一列的数据类型,把所有数据类型都转化为字符串,然后用concat_ws()函数进行连接,由此计算出该行的checksum值。Checksum默认采用crc32计算。

2、数据块checksum值的计算

和pt-table-checksum工具一样,pt-table-sync会将表的数据split成若干个chunk,计算的时候以chunk为单位。可以理解为将chunk内的所有行的数据拼接起来,再计算crc32的值,既可以得到该chunk的checksum值。

3、数据修复

前面两步,pt-table-sync与pt-table-checksum的算法和原理是一样的。再往下,就开始有所不同了:

pt-table-checksum只是校验,它把checksum结果存储到统计表,然后把执行过的sql语句记录到binlog,任务就算完成。语句级的复制把计算逻辑传递到从库,并且在从库执行相同的计算。

pt-table-sync则不同,它首先要完成chunk的checksum值计算,一旦发现主从上相同的chunk的checksum值不一样,就会深入到该chunk内部,逐行比较并且修复有问题的行。它的计算逻辑描述如下:

1)、对每一个从库,每一个表,循环进行如下校验和修复过程。

2)、对每一个chunk,校验时加上for update锁。一旦获得锁,就记录下当前主库的show master status值。

3)、在从库上执行select master_pos_wait()函数,等待从库的sql线程执行到show master status得到位置。以此保证,主从上关于这个chunk的内容不再改变。【select master_pos_wait(‘master_log_file’,’master_log_pos’);该函数会阻塞直到从服务器达到指定的日志文件和偏移量。此时从服务器和主服务器就同步了,语句返回值为0】.

4)、对这个chunk执行checksum计算,然后与主库的checksum进行比较。

5)、如果checksum相同,说明主从数据一致,接着就可以继续下一个chunk。

6)、如果checksum值不同,说明该chunk有不一致。就会深入到chunk内部,逐行计算checksum并比较(单行checksum的比较过程与chunk的比较过程一样,单行实际是chunk的size等于1的特例)。

7)、如果发现某行不一致,则标记下来。继续检测剩余行,直到这个chunk结束。

8)、对找到的主从不一致的行,采用replace into语句,在主库上执行一遍以生成该行全量的binlog, 并同步到从库,这就会以主库数据为基准来修复从库;对于主库有的,而从库没有的行,采用replace into在主库上插入(注意,不能是insert。这分为两种情况:一是有唯一性主键,如果有唯一性主键或者索引,则insert相同记录会在主库上插入失败;二是没有唯一性主键或者索引,insert相同记录会造成记录重复。故要求pt-table-sync的表必须要有唯一性主键或者索引)。

9)、直到修复该chunk所有不一致的行。继续检查和修复下一个chunk。

10)、直到这个从库上的所有表修复结束。接着继续修复下一个从库。

用法

pt-table-sync [OPTIONS] DSN [DSN]#OPTIONS#指定的至少一个--print,--execute或--dry-run。#并且--where和--replicate是互斥的。--algorithms#类型:字符串;默认值:Chunk,Nibble,GroupBy,Stream#比较表格时使用的算法,按优先顺序排列。#对于每个表,pt-table-sync将检查该表是否可以按照给定的顺序与给定的算法同步。使用第一个可以同步表的算法。请参阅“算法”。--ask-pass#略,详见pt-online-schema-change工具用法--bidirectional#在第一台主机和后续主机之间启用双向同步。#有关详细信息,请参阅“双向同步”。--[no]bin-log#默认:是#二进制日志(SET SQL_LOG_BIN=1)。  #指定--no-bin-log将设置SQL_LOG_BIN=0。--buffer-in-mysql#指示 MySQL 在其内存中缓冲查询。#此选项将选项添加SQL_BUFFER_RESULT到比较查询。这会导致 MySQL 在将结果发送回pt-table-sync之前执行查询并将它们放在内部的临时表中。这种策略的优点是pt-table-sync可以根据需要获取行,而无需在 Perl 进程中使用大量内存,同时释放 MySQL 表上的锁(以减少与其他查询的争用)。缺点是它在 MySQL 服务器上使用更多内存。#你可能也希望保持--[no]buffer-to-client启用状态,因为缓冲到临时表中然后将其全部提取到 Perl 的内存中可能是一件愚蠢的事情。此选项对于 GroupBy 和 Stream 算法最有用,它们可能会从服务器获取大量数据。--[no]buffer-to-client#默认:yes#比较时从 MySQL 中一一获取行。#此选项启用mysql_use_result这会导致 MySQL 将所选行保存在服务器上,直到该工具获取它们。这允许该工具使用更少的内存,但可能会使行在服务器上锁定更长时间。#如果通过指定禁用此选项,--no-buffer-to-client则 mysql_store_result使用使 MySQL 一次将所有选定行发送到该工具的选项。这可能会导致结果“光标”在服务器上保持打开的时间较短,但如果表很大,无论如何它可能需要很长时间,并且会占用您所有的内存。#对于大多数重要的数据大小,您希望启用此选项。#--bidirectional使用时禁用此选项。--channel#略,详见pt-online-schema-change工具用法--charset#略,详见pt-online-schema-change工具用法--[no]check-child-tables#默认:yes#检查是否--execute会对子表产生不利影响。时 --replace,--replicate或--sync-to-master指定,该工具可以利用同步表REPLACE语句。如果正在同步的表具有带有、或 的子表,则该工具会打印错误并跳过该表,因为 变为then ,因此将级联到子表并删除其行。在最坏的情况下,这会删除子表中的所有行!ON DELETE CASCADEON UPDATE CASCADEON UPDATE SET NULLREPLACEDELETEINSERTDELETE#指定--no-check-child-tables禁用此检查。为了完全避免影响子表,还要指定--no-foreign-key-checks MySQL 不会从父表到子表级联任何操作。#这种检查只预制如果--execute和一个--replace, --replicate或--sync-to-master指定。 --print 不检查子表。#错误消息只打印与找到的第一个子表 ,或 外键约束。可能还有其他受影响的子表。ON DELETE CASCADEON UPDATE CASCADEON UPDATE SET NULL--[no]check-master#默认:yes#使用--sync-to-master,尝试验证检测到的 master 是真正的 master。--[no]check-slave#默认:yes#检查目标服务器是否为从服务器。#如果目标服务器是从服务器,则对其进行更改通常是不安全的。但是,有时您必须这样做;--replace例如,除非有唯一索引,否则将无法工作,因此在这种情况下您无法对主服务器进行更改。默认情况下,如果您尝试更改从站上的数据,pt-table-sync会报错。指定--no-check-slave禁用此检查。需要您自担风险使用它。--[no]check-triggers#默认:yes#检查目标表上是否未定义触发器。#MySQL v5.0.2 中引入了触发器,因此对于旧版本此选项无效,因为不会检查触发器。--chunk-column#类型:字符串#在此列上分块表格。--chunk-index#类型:字符串#使用此索引对表进行分块。--chunk-size#类型:字符串;默认值:1000#每个块的行数或数据大小。#“Chunk”和“Nibble”算法的每个行块的大小。大小可以是行数,也可以是数据大小。数据大小指定后缀为 k=kibibytes、M=mebibytes、G=gibibytes。通过除以平均行长度将数据大小转换为行数。--columns#简写形式:-c; 类型:数组#比较此逗号分隔的列列表。--config#略,详见pt-online-schema-change工具用法--conflict-column#类型:字符串#在--bidirectional同步期间行发生冲突时比较此列。#当相同的,但不同的行是发现从各行此列的值根据相比--conflict-comparison,--conflict-value 并--conflict-threshold确定哪些行具有正确的数据和成为源。列可以是任何有合适的--conflict-comparison类型(这几乎是所有类型,例如 blob 除外)。#此选项仅适用于--bidirectional. 有关详细信息,请参阅“双向同步”。--conflict-comparison#类型:字符串#选择--conflict-column以该属性作为源。#该选项会影响--conflict-column冲突行中的值的比较方式。可能的比较是这些 MAGIC_comparisons 之一:#newest|oldest|greatest|least|equals|matches#COMPARISON  CHOOSES ROW WITH#==========  =========================================================#newest      Newest temporal --conflict-column value#oldest      Oldest temporal --conflict-column value#greatest    Greatest numerical "--conflict-column value#least       Least numerical --conflict-column value#equals      --conflict-column value equal to --conflict-value#matches     --conflict-column value matching Perl regex pattern#            --conflict-value#此选项仅适用于--bidirectional. 有关详细信息,请参阅“双向同步”。--conflict-error#类型:字符串;默认值:warn#如何报告无法解决的矛盾和冲突的错误#此选项会更改在无法解决冲突或导致某种错误时通知用户的方式。可能的值为:#	warn: Print a warning to STDERR about the unresolvable conflict#	die:  Die, stop syncing, and print a warning to STDERR#此选项仅适用于--bidirectional. 有关详细信息,请参阅“双向同步”。--conflict-threshold#类型:字符串#一个--conflict-column必须超过另一个的数量。#所述--conflict-threshold防止被解决,如果两者之间的绝对差冲突--conflict-column值是小于该量。例如,如果两个--conflict-column具有时间戳值“2009-12-01 12点00分〇 〇秒”和“12时05分00秒2009-12-01”的差为5分钟。如果--conflict-threshold设置为对“5M”的矛盾将得到解决,但如果--conflict-threshold设置为“6米”因为差不大于或等于6分钟的冲突将无法解决。在后一种情况下,--conflict-error将报告故障。#此选项仅适用于--bidirectional. 有关详细信息,请参阅“双向同步”。--conflict-value#类型:字符串#使用某些此值--conflict-comparison。#此选项给出的数值equals和matches --conflict-comparison。#此选项仅适用于--bidirectional. 有关详细信息,请参阅“双向同步”。--databases#简写:-d; 类型:哈希#仅同步的数据库,这个逗号分隔的列表。#一个常见的请求是将一个数据库中的表与同一或不同服务器上的另一个数据库中的表同步。这是不可能的。 --databases不会这样做,你也不能用 DSN 的 D 部分来做,因为在没有表名的情况下,它假设整个服务器应该同步,并且 D 部分只控制连接的默认数据库。--defaults-file#略,详见pt-online-schema-change工具用法--dry-run#分析、决定使用的同步算法、打印和退出。#意味着--verbose这样你就可以看到结果。结果是在相同的输出格式,你会从实际运行的工具中看到,但将是受影响的行零。这是因为实际的工具执行,但停止它比较的任何数据,只是返回零点之前。零点并不意味着没有进行的更改。--engines#短形式:-e; 类型:哈希#仅同步存储引擎的这个逗号分隔的列表。--execute#执行查询,使表具有相同的数据。#这个选项使得PT-表同步通过执行,它创建的表决心分歧所有查询实际同步表中的数据。因此,该表将被改变! 除非你也指定--verbose,这些变化将被默默地做。如果这不是你想要的,见 --print或--dry-run。--explain-hosts#打印连接信息并退出。#打印出pt-table-sync将连接到的主机列表,以及所有各种连接选项,然后退出。--float-precision#类型:int#精度FLOAT和DOUBLE数字到字符串转换。使用 MySQL 中的 ROUND() 函数使 FLOAT 和 DOUBLE 值四舍五入到小数点后指定的位数。这有助于避免由于不同 MySQL 版本和硬件上相同值的不同浮点表示而导致的校验和不匹配。默认不舍入;这些值由 CONCAT() 函数转换为字符串,MySQL 选择字符串表示形式。例如,如果指定值 2,则值 1.008 和 1.009 将四舍五入为 1.01,并且校验和相等。--[no]foreign-key-checks#默认:yes#启用外键检查 ( )。SET FOREIGN_KEY_CHECKS=1#指定--no-foreign-key-checks将。SET FOREIGN_KEY_CHECKS=0--function#类型:字符串#你想将哪个哈希函数用于校验和。#默认值为CRC32. 其他不错的选择包括MD5和SHA1。如果你已经安装了FNV_64用户自定义函数,pt-table-sync会检测到它并且更喜欢使用它,因为它比内置函数快得多。如果您已经安装了该用户定义的函数,您还可以使用 MURMUR_HASH。这两个都是随 Percona Server 分发的。有关更多信息和基准,请参阅 pt-table-checksum。--help#显示帮助并退出。--[no]hex-blob#默认:yes#HEX() BLOB,TEXT和BINARY列。#当从源获取行数据以创建查询以同步数据(即通过 看到--print和执行的查询--execute)时,二进制列被包装在 HEX() 中,因此二进制数据不会产生无效的 SQL 语句。你可以禁用此选项,但你可能不应该禁用。--host#简写:-h; 类型:字符串#连接到主机。--ignore-columns#类型:哈希#在比较中忽略此逗号分隔的列名列表。#此选项会导致不比较列。但是,如果确定某行在表之间不同,则无论如何都会同步该行中的所有列。(目前无法从同步过程本身中排除列,只能从比较中排除。)--ignore-databases#类型:哈希#忽略这个以逗号分隔的数据库列表。#(默认忽略information_schema、performance_schema等系统数据库)--ignore-engines#类型:哈希;默认值:联邦,MRG_MyISAM#忽略这个逗号分隔的存储引擎列表。--ignore-tables#类型:哈希#忽略这个以逗号分隔的表格列表。#表名可以用数据库名来限定。--ignore-tables-regex#类型:字符串;#忽略名称与 Perl 正则表达式匹配的表。--[no]index-hint#默认:yes#向块和行查询添加 FORCE/USE INDEX 提示。#默认情况下,pt-table-sync会向每个 SQL 语句添加一个 FORCE/USE INDEX 提示,以强制 MySQL 使用同步算法选择的或由--chunk-index. 这通常是一件好事,但在极少数情况下,索引可能不是查询的最佳选择,因此您可以通过指定--no-index-hint并让 MySQL 选择索引来抑制索引提示。#这不会影响由--print;打印的查询。它只影响pt-table-sync用于选择和比较行的块和行查询。--lock#类型:int#锁定表:0=无,1=每个同步周期,2=每个表,或 3=全局。#这使用了LOCK TABLES。 这有助于防止在检查表时更改表。 可能取值如下:#VALUE  MEANING(意义)#=====  =======================================================#0      从不锁定表。#1      锁定和解锁一个时间每循环同步(如实施#       通过同步算法)。这是最细的#       可用的锁定级别。例如,块#       算法将锁定 C 行的每个块,然后如果它们在源和源上相同,则#       解锁它们目的地,在移动到下一个块之前。#2      在每个表之前和之后锁定和解锁。#3      使用C对每个同步的服务器(DSN)进行一次锁定和解锁。#如果指定了--replication或--sync-to-master,复制从端不会被锁定,因为从理论上讲,锁定主端上的表应该可以防止发生任何更改。 (你不会更改slave上的数据,对吧?) 如果给出了--wait,则主(源)被锁定,然后工具等待从(slave)赶上主(master),然后继续。   #如果指定--transaction,则不使用LOCK TABLES。 相反,锁定和解锁是通过开始和提交事务来实现的。 异常是--lock为3时。   #如果指定了--no-transaction,那么LOCK TABLES将用于--LOCK的任何值。 看到--[no]transaction。  --lock-and-rename#锁定源表和目标表,同步,然后交换名称。这作为阻塞较少的 ALTER TABLE 很有用,一旦表彼此合理同步(您可以选择通过多种方式完成,包括转储和重新加载,甚至像 pt-archiver 之类的东西)。它正好需要两个 DSN 并假设它们在同一台服务器上,因此它不需要等待复制等。表被锁定表锁定。--password#简写形式:-p; 类型:字符串#连接时使用的密码。--pid#略,详见pt-online-schema-change工具用法--port#简写:-P; 类型:int#用于连接的端口号。--print#打印将解决差异的查询。#如果你不信任pt-table-sync,或者只是想看看它会做什么,这是一个安全的好方法。这些查询是有效的 SQL,如果您想手动同步表,您可以自己运行它们。--recursion-method#略,详见pt-online-schema-change工具用法--replace#将所有INSERT和UPDATE语句写为REPLACE。#当存在唯一索引违规时,它会根据需要自动打开。--replicate#类型:字符串#在此表中列为不同的同步表。#指定pt-table-sync应该检查指定的表以查找不同的数据。 该表与pt-table-checksum的同名参数完全相同。 也就是说,它包含主从表(和值的范围)不同的记录。 #对于显示主和从表之间差异的每个表和值范围,pt-table-checksum将使用适当的WHERE子句将该表同步到它的主表。  #这会自动将--wait设置为60,并导致对主服务器而不是从服务器进行更改。  #如果指定了--ync-to-master,该工具将假定您指定的服务器是从服务器,并像往常一样连接到主服务器进行同步。  #否则,它将尝试使用SHOW PROCESSLIST来查找指定服务器的从服务器。如果它无法通过SHOW PROCESSLIST找到任何从服务器,它将转而检查SHOW SLAVE HOSTS。 您必须配置每个从服务器的报告-主机、报告-报告和其他选项,以使其正常工作。在找到slave后,它将检查每个slave上的指定表,以找到需要同步的数据,并对其进行同步。  #该工具首先检查主表的副本,假设主表可能也是从表。任何显示差异的表都不会在从机上同步。例如,假设您的复制设置为A->B, B->C, B->D。假设您使用这个参数并指定服务器B,该工具将检查服务器B的表副本。如果它看起来像表中服务器B的数据test. tbl1与服务器A的副本不同,该工具不会同步服务器C和D上的表。--slave-user#略,详见pt-online-schema-change工具用法--slave-password#略,详见pt-online-schema-change工具用法--set-vars#略,详见pt-online-schema-change工具用法--socket#略,详见pt-online-schema-change工具用法--sync-to-master#将 DSN 视为从站并将其同步到其主站。#将指定的服务器视为从属服务器。 检查SHOW SLAVE STATUS,连接到服务器的主服务器,并将主服务器作为源服务器,从服务器作为目的服务器。 导致主机上的更改。 默认设置——wait为60,默认设置——lock为1,默认禁用——[no]transaction。 请参见——replication,它更改此选项的行为。--tables#简写:-t; 类型:哈希#仅同步此逗号分隔的表列表。#表名可以用数据库名来限定。--timeout-ok#继续下去,如果--wait失败。#如果您指定--wait并且从站在等待超时之前没有赶上主站的位置,则默认行为是中止。无论如何,此选项使该工具继续运行。警告:如果您试图在两台服务器之间进行一致的比较,您可能不想在超时后继续进行。--[no]transaction#使用事务而不是LOCK TABLES。#开始和提交事务的粒度由——lock控制。这在默认情况下是启用的,但是因为——lock在默认情况下是禁用的,所以它没有效果。#大多数启用锁定的选项在默认情况下也禁用事务,因此如果您想使用事务锁定(通过LOCK IN SHARE MODE和FOR UPDATE,您必须显式指定——transaction。#如果没有明确指定——transaction, pt-table-sync将根据每个表来决定是使用事务锁还是表锁。 它目前在InnoDB表上使用事务,在所有其他表上使用表锁。#如果指定了——no-transaction, pt-table-sync将完全不使用事务(即使是InnoDB表),锁由——lock控制。#当显式或隐式启用时,将设置事务隔离级别REPEATABLE READ,并使用CONSISTENT SNAPSHOT启动事务。--trim#TRIM() VARCHAR列BIT_XOR和ACCUM模式。将 MySQL 4.1 与 >= 5.0 进行比较时会有所帮助。#当你不关心的MySQL版本之间的尾随空间差异这在他们处理尾随空格的变化,这非常有用。MySQL的5.0和更高版本都保留在尾部的空格VARCHAR,而之前的版本会删除它们。--[no]unique-checks#默认:yes#启用唯一键检查(SET UNIQUE_CHECKS=1)。  #指定——no-unique-checks将设置UNIQUE_CHECKS=0。--user#略,详见pt-online-schema-change工具用法--verbose#短形式:-v; 累计:是#打印同步操作的结果。#请参阅“输出”关于输出的更多细节。--version#略,详见pt-online-schema-change工具用法--[no]version-check#略,详见pt-online-schema-change工具用法--wait#简写:-w; 类型:time#等待slave追上他们的主人需要多长时间。#在比较表之前,让主服务器等待从服务器赶上复制。该值是超时前等待的秒数(另请参阅--timeout-ok)。默认设置--lock为 1 和--[no]transaction0。如果您看到如下错误:#	MASTER_POS_WAIT returned -1#这意味着超时已超出,您需要增加它。#此选项的默认值受其他选项的影响。要查看有效值,请使用--help.#要完全禁用等待(锁除外),请指定--wait0。这有助于从属设备滞后于未同步的表。--where#类型:字符串#WHERE 子句限制同步到表的一部分。--[no]zero-chunk#默认:yes#为具有零或零等效值的行添加块。只有在--chunk-size指定时才有效。零块的目的是捕获可能会使第一个块的大小不平衡的大量零值。例如,如果许多负数被插入到一个无符号整数列中,导致它们被存储为零,那么这些零值将被零块而不是第一个块及其所有非零值捕获

使用示例

#将主的 test 数据库的test_osc2同步到 172.18.40.129,使从上具有一样的数据#先查看数据不同的表[root@localhost ~]# pt-table-checksum -upcloud -ppcloud -h172.18.40.128Checking if all tables can be checksummed ...Starting checksum ...            TS ERRORS  DIFFS     ROWS  DIFF_ROWS  CHUNKS SKIPPED    TIME TABLE08-12T16:03:31      0      1        0          6       1       0   0.019 test.test_osc2#可以看到test.test_osc2不一致#开始同步[root@localhost ~]# pt-table-sync --execute --sync-to-master -upcloud -ppcloud h=172.18.40.129,D=test,t=test_osc2#查看[root@localhost ~]# pt-table-checksum -upcloud -ppcloud -h172.18.40.128Checking if all tables can be checksummed ...Starting checksum ...            TS ERRORS  DIFFS     ROWS  DIFF_ROWS  CHUNKS SKIPPED    TIME TABLE08-12T16:11:06      0      0        0          0       1       0   0.018 test.test_osc2#已同步#将主的 test 数据库同步到172.18.40.129,使从上具有一样的数据并输出同步信息#查看库一致性[root@localhost ~]# pt-table-checksum -upcloud -ppcloud -h172.18.40.128 --databases=testChecking if all tables can be checksummed ...Starting checksum ...            TS ERRORS  DIFFS     ROWS  DIFF_ROWS  CHUNKS SKIPPED    TIME TABLE08-12T16:47:16      0      0        6          0       1       0   0.016 test.checksums08-12T16:47:16      0      0        6          0       1       0   0.018 test.deadlocks08-12T16:47:16      0      0        0          0       1       0   0.019 test.duplicate_key_check08-12T16:47:16      0      0        1          0       1       0   0.019 test.heartbeat08-12T16:47:16      0      0       30          0       1       0   0.018 test.kill_log08-12T16:47:16      0      0        4          0       1       0   0.020 test.lock_test08-12T16:47:16      0      1        9          3       1       0   0.021 test.t_table08-12T16:47:16      0      1       10          1       1       0   0.019 test.t_table208-12T16:47:16      0      0        3          0       1       0   0.019 test.test_for08-12T16:47:16      0      0        0          0       1       0   0.017 test.test_osc208-12T16:47:16      0      0        6          0       1       0   0.018 test.test_oscbk#开始同步[root@localhost ~]# pt-table-sync --execute --sync-to-master -upcloud -ppcloud h=172.18.40.129 --databases=test --printREPLACE INTO `test`.`t_table`(`id`) VALUES ('1') /*percona-toolkit src_db:test src_tbl:t_table src_dsn:P=3306,h=172.18.40.128,p=...,u=pcloud dst_db:test dst_tbl:t_table dst_dsn:h=172.18.40.129,p=...,u=pcloud lock:1 transaction:1 changing_src:1 replicate:0 bidirectional:0 pid:25467 user:root host:localhost.localdomain*/;REPLACE INTO `test`.`t_table`(`id`) VALUES ('2') /*percona-toolkit src_db:test src_tbl:t_table src_dsn:P=3306,h=172.18.40.128,p=...,u=pcloud dst_db:test dst_tbl:t_table dst_dsn:h=172.18.40.129,p=...,u=pcloud lock:1 transaction:1 changing_src:1 replicate:0 bidirectional:0 pid:25467 user:root host:localhost.localdomain*/;REPLACE INTO `test`.`t_table`(`id`) VALUES ('3') /*percona-toolkit src_db:test src_tbl:t_table src_dsn:P=3306,h=172.18.40.128,p=...,u=pcloud dst_db:test dst_tbl:t_table dst_dsn:h=172.18.40.129,p=...,u=pcloud lock:1 transaction:1 changing_src:1 replicate:0 bidirectional:0 pid:25467 user:root host:localhost.localdomain*/;REPLACE INTO `test`.`t_table2`(`id`) VALUES ('1') /*percona-toolkit src_db:test src_tbl:t_table2 src_dsn:P=3306,h=172.18.40.128,p=...,u=pcloud dst_db:test dst_tbl:t_table2 dst_dsn:h=172.18.40.129,p=...,u=pcloud lock:1 transaction:1 changing_src:1 replicate:0 bidirectional:0 pid:25467 user:root host:localhost.localdomain*/;#查看[root@localhost ~]# pt-table-checksum -upcloud -ppcloud -h172.18.40.128 --databases=testChecking if all tables can be checksummed ...Starting checksum ...            TS ERRORS  DIFFS     ROWS  DIFF_ROWS  CHUNKS SKIPPED    TIME TABLE08-12T16:48:34      0      0        6          0       1       0   0.014 test.checksums08-12T16:48:34      0      0        6          0       1       0   0.013 test.deadlocks08-12T16:48:34      0      0        0          0       1       0   0.017 test.duplicate_key_check08-12T16:48:34      0      0        1          0       1       0   0.018 test.heartbeat08-12T16:48:34      0      0       30          0       1       0   0.014 test.kill_log08-12T16:48:34      0      0        4          0       1       0   0.013 test.lock_test08-12T16:48:34      0      0        9          0       1       0   0.013 test.t_table08-12T16:48:34      0      0       10          0       1       0   0.015 test.t_table208-12T16:48:34      0      0        3          0       1       0   0.015 test.test_for08-12T16:48:34      0      0        0          0       1       0   0.016 test.test_osc208-12T16:48:34      0      0        6          0       1       0   0.021 test.test_oscbk#按检查一致性结果将主的 test 数据库同步到129上,使从上具有一样的数据#检查并存储信息root@localhost ~]# pt-table-checksum -upcloud -ppcloud -h172.18.40.128 --databases=test --replicate=test.checksumsChecking if all tables can be checksummed ...Starting checksum ...            TS ERRORS  DIFFS     ROWS  DIFF_ROWS  CHUNKS SKIPPED    TIME TABLE08-12T16:51:44      0      0        6          0       1       0   0.015 test.deadlocks08-12T16:51:44      0      0        0          0       1       0   0.015 test.duplicate_key_check08-12T16:51:44      0      0        1          0       1       0   0.015 test.heartbeat08-12T16:51:44      0      0       30          0       1       0   0.014 test.kill_log08-12T16:51:44      0      0        4          0       1       0   0.013 test.lock_test08-12T16:51:44      0      1        9          3       1       0   0.012 test.t_table08-12T16:51:44      0      1       10          3       1       0   0.012 test.t_table208-12T16:51:44      0      0        3          0       1       0   0.014 test.test_for08-12T16:51:44      0      0        0          0       1       0   0.014 test.test_osc208-12T16:51:44      0      0        6          0       1       0   0.012 test.test_oscbk#开始同步[root@localhost ~]# pt-table-sync --execute --sync-to-master --replicate=test.checksums -upcloud -ppcloud h=172.18.40.129 --databases=test --printREPLACE INTO `test`.`t_table`(`id`) VALUES ('1') /*percona-toolkit src_db:test src_tbl:t_table src_dsn:P=3306,h=172.18.40.128,p=...,u=pcloud dst_db:test dst_tbl:t_table dst_dsn:h=172.18.40.129,p=...,u=pcloud lock:1 transaction:1 changing_src:test.checksums replicate:test.checksums bidirectional:0 pid:17308 user:root host:localhost.localdomain*/;REPLACE INTO `test`.`t_table`(`id`) VALUES ('2') /*percona-toolkit src_db:test src_tbl:t_table src_dsn:P=3306,h=172.18.40.128,p=...,u=pcloud dst_db:test dst_tbl:t_table dst_dsn:h=172.18.40.129,p=...,u=pcloud lock:1 transaction:1 changing_src:test.checksums replicate:test.checksums bidirectional:0 pid:17308 user:root host:localhost.localdomain*/;REPLACE INTO `test`.`t_table`(`id`) VALUES ('3') /*percona-toolkit src_db:test src_tbl:t_table src_dsn:P=3306,h=172.18.40.128,p=...,u=pcloud dst_db:test dst_tbl:t_table dst_dsn:h=172.18.40.129,p=...,u=pcloud lock:1 transaction:1 changing_src:test.checksums replicate:test.checksums bidirectional:0 pid:17308 user:root host:localhost.localdomain*/;REPLACE INTO `test`.`t_table2`(`id`) VALUES ('1') /*percona-toolkit src_db:test src_tbl:t_table2 src_dsn:P=3306,h=172.18.40.128,p=...,u=pcloud dst_db:test dst_tbl:t_table2 dst_dsn:h=172.18.40.129,p=...,u=pcloud lock:1 transaction:1 changing_src:test.checksums replicate:test.checksums bidirectional:0 pid:17308 user:root host:localhost.localdomain*/;REPLACE INTO `test`.`t_table2`(`id`) VALUES ('2') /*percona-toolkit src_db:test src_tbl:t_table2 src_dsn:P=3306,h=172.18.40.128,p=...,u=pcloud dst_db:test dst_tbl:t_table2 dst_dsn:h=172.18.40.129,p=...,u=pcloud lock:1 transaction:1 changing_src:test.checksums replicate:test.checksums bidirectional:0 pid:17308 user:root host:localhost.localdomain*/;REPLACE INTO `test`.`t_table2`(`id`) VALUES ('3') /*percona-toolkit src_db:test src_tbl:t_table2 src_dsn:P=3306,h=172.18.40.128,p=...,u=pcloud dst_db:test dst_tbl:t_table2 dst_dsn:h=172.18.40.129,p=...,u=pcloud lock:1 transaction:1 changing_src:test.checksums replicate:test.checksums bidirectional:0 pid:17308 user:root host:localhost.localdomain*/;#查看[root@localhost ~]# pt-table-checksum -upcloud -ppcloud -h172.18.40.128 --databases=test --replicate=test.checksumsChecking if all tables can be checksummed ...Starting checksum ...            TS ERRORS  DIFFS     ROWS  DIFF_ROWS  CHUNKS SKIPPED    TIME TABLE08-12T16:55:33      0      0        6          0       1       0   0.015 test.deadlocks08-12T16:55:33      0      0        0          0       1       0   0.015 test.duplicate_key_check08-12T16:55:33      0      0        1          0       1       0   0.015 test.heartbeat08-12T16:55:33      0      0       30          0       1       0   0.014 test.kill_log08-12T16:55:33      0      0        4          0       1       0   0.016 test.lock_test08-12T16:55:33      0      0        9          0       1       0   0.016 test.t_table08-12T16:55:33      0      0       10          0       1       0   0.017 test.t_table208-12T16:55:33      0      0        3          0       1       0   0.019 test.test_for08-12T16:55:33      0      0        0          0       1       0   0.019 test.test_osc208-12T16:55:33      0      0        6          0       1       0   0.015 test.test_oscbk

pt-visual-explain

功能

将 EXPLAIN 输出格式化为树

用法

pt-visual-explain [OPTIONS] [FILES]#OPTIONS--ask-pass#略,详见pt-online-schema-change工具用法--charset#略,详见pt-online-schema-change工具用法--clustered-pk#假设 PRIMARY KEY 索引访问不需要进行书签查找来检索行。InnoDB 就是这种情况。--config#略,详见pt-online-schema-change工具用法--connect#将输入视为查询,并通过连接到 MySQL 实例并在查询上运行 EXPLAIN 来获取 EXPLAIN 输出。给出此选项时, pt-visual-explain使用其他特定--user于连接的选项,例如 连接到 MySQL 实例。如果您有 .my.cnf 文件,它将读取它,因此您可能不需要指定任何特定于连接的选项。--database#简写:-D; 类型:字符串#连接到这个数据库。--defaults-file#简写:-F; 类型:字符串#仅从给定文件中读取 mysql 选项。您必须提供绝对路径名。--format#类型:字符串;默认值:树#设置输出格式。#默认是一个简洁的漂亮印刷树。有效值为:#Value  Meaning#=====  ================================================#tree   印刷精美的简洁树。#dump   Data::Dumper 输出(有关更多信息,请参阅 Data::Dumper )。--help#显示帮助并退出。--host#简写:-h; 类型:字符串#连接到主机。--password#简写形式:-p; 类型:字符串#连接时使用的密码。--pid#略,详见pt-online-schema-change工具用法--port#简写:-P; 类型:int#用于连接的端口号。--set-vars#略,详见pt-online-schema-change工具用法--socket#简写:-S; 类型:字符串#用于连接的套接字文件。--user#简写:-u; 类型:字符串#如果不是当前用户,则用于登录的用户。--version#显示版本并退出。

使用示例

#查看包含explain结果的a.sql文件的范例[root@localhost ~]# mysql -upcloud -ppcloud -e "explain select * from test.checksums,test.test_oscbk" > a.sql[root@localhost ~]# pt-visual-explain a.sqlJOIN+- Join buffer|  +- Table scan|     rows           35|     +- Table|        table          checksums+- Table scan   rows           6   +- Table      table          test_oscbk      #查看包含查询语句的select.out文件的范例[root@localhost ~]# echo "select * from test.test_oscbk,test.checksums" > select.out[root@localhost ~]# pt-visual-explain --connect /root/select.out -upcloud -ppcloudJOIN+- Join buffer|  +- Table scan|     rows           35|     +- Table|        table          checksums+- Table scan   rows           6   +- Table      table          test_oscbk      #通过管道直接查看explain输出结果的范例[root@localhost ~]# mysql -upcloud -ppcloud -e "explain select * from test.test_oscbk,test.checksums" | pt-visual-explainmysql: [Warning] Using a password on the command line interface can be insecure.JOIN+- Join buffer|  +- Table scan|     rows           35|     +- Table|        table          checksums+- Table scan   rows           6   +- Table      table          test_oscbk

pt-variable-advisor

功能

分析 MySQL 变量并就可能出现的问题提出建议。

描述

pt-variable-advisor根据下面描述的“规则”检查SHOW VARIABLES是否有错误值和设置。 它会报告符合规则的变量,因此你可以在MySQL服务器中找到错误的设置。

规则

这些是pt-variable-advisor将应用于 SHOW VARIABLES 的规则。每个规则由三部分组成:ID、严重性和描述。

规则的 ID 是规则的简短唯一名称。它通常与规则检查的变量有关。如果一个变量被多个规则检查,则规则的 ID 编号为“-1”、“-2”、“-N”。

规则的严重性表明此规则与查询匹配的重要性。我们使用 NOTE、WARN 和 CRIT 来表示这些级别。

规则的描述是对当变量与此规则匹配时的含义的文本、人类可读的解释。根据你生成的报告的详细程度,你将在描述中看到更多的文本。默认情况下,你只会看到第一句话,这是规则含义的简要概要。在更详细的情况下,你将看到后续句子。

  • auto_increment

    严重程度:注意

    你是否尝试在双主或环复制配置中写入多个服务器?这可能非常危险,并且在大多数情况下是一个严重的错误。大多数人这样做的理由实际上根本站不住脚。

  • concurrent_insert

    严重程度:注意

    MyISAM 表中的空洞(删除留下的空间)可能永远不会被重用。

  • connect_timeout

    严重程度:注意

    此设置的较大值可能会创建拒绝服务漏洞。

  • debug

    严重程度:暴击

    由于性能影响很大,因此不应在生产中使用带有调试功能的服务器。

  • delay_key_write

    严重程度:警告

    MyISAM 索引块在必要时不会被刷新。如果服务器崩溃,MyISAM 表上的数据损坏可能比平时严重得多。

  • flush

    严重程度:警告

    此选项可能会大大降低性能。

  • flush_time

    严重程度:警告

    此选项可能会大大降低性能。

  • have_bdb

    严重程度:注意

    BDB 引擎已弃用。如果您不使用它,则应使用 skip_bdb 选项禁用它。

  • init_connect

    严重程度:注意

    此服务器上启用了 init_connect 选项。

  • init_file

    严重程度:注意

    此服务器上启用了 init_file 选项。

  • init_slave

    严重程度:注意

    此服务器上启用了 init_slave 选项。

  • innodb_additional_mem_pool_size

    严重程度:警告

    这个变量一般不需要大于20MB。

  • innodb_buffer_pool_size

    严重程度:警告

    InnoDB 缓冲池大小未配置。在生产环境中,它应该始终明确配置,默认的 10MB 大小并不合适。

  • innodb_checksums

    严重程度:警告

    InnoDB 校验和被禁用。您的数据不受硬件损坏或其他错误的保护!

  • innodb_doublewrite

    严重程度:警告

    InnoDB 双写被禁用。除非您使用防止部分页面写入的文件系统,否则您的数据是不安全的!

  • innodb_fast_shutdown

    严重程度:警告

    InnoDB 的关闭行为不是默认的。这可能会导致性能不佳,或者需要在启动时执行崩溃恢复。

  • innodb_flush_log_at_trx_commit-1

    严重程度:警告

    InnoDB 没有在严格的 ACID 模式下配置。如果发生崩溃,一些交易可能会丢失。

  • innodb_flush_log_at_trx_commit-2

    严重程度:警告

    将 innodb_flush_log_at_trx_commit 设置为 0 与设置为 2 相比没有性能优势,并且可能会丢失更多类型的数据。如果出于性能原因尝试将其从 1 更改,则应将其设置为 2 而不是 0。

  • innodb_force_recovery

    严重程度:警告

    InnoDB 处于强制恢复模式!这应该仅在从数据损坏或其他错误中恢复时临时使用,而不是正常使用。

  • innodb_lock_wait_timeout

    严重程度:警告

    这个选项有一个异常长的值,如果没有释放锁,它会导致系统过载。

  • innodb_log_buffer_size

    严重程度:警告

    InnoDB 日志缓冲区大小一般不应设置为大于 16MB。如果您正在执行大型 BLOB 操作,InnoDB 无论如何都不是真正的引擎选择。

  • innodb_log_file_size

    严重程度:警告

    InnoDB 日志文件大小设置为其默认值,这在生产系统上不可用。

  • innodb_max_dirty_pages_pct

    严重程度:注意

    innodb_max_dirty_pages_pct 低于默认值。这会导致过度的刷新并增加 I/O 系统的负载。

  • flush_time

    严重程度:警告

    这个设置很可能每flush_time 秒导致非常糟糕的性能。

  • key_buffer_size

    严重程度:警告

    密钥缓冲区大小设置为其默认值,这对大多数生产系统都不利。在生产环境中,key_buffer_size 应该大于默认的 8MB 大小。

  • large_pages

    严重程度:注意

    大页面已启用。

  • locked_in_memory

    严重程度:注意

    服务器使用-memlock 锁定在内存中。

  • log_warnings-1

    严重程度:注意

    Log_warnings 已禁用,因此异常事件(例如对复制不安全的语句和中止的连接)将不会记录到错误日志中。

  • log_warnings-2

    严重程度:注意

    Log_warnings 必须设置为大于 1 以记录异常事件,例如中止连接。

  • low_priority_updates

    严重程度:注意

    服务器正在以非默认的更新锁定优先级运行。这可能会导致更新查询意外等待读取查询。

  • max_binlog_size

    严重程度:注意

    max_binlog_size 小于默认值 1GB。

  • max_connect_errors

    严重程度:注意

    max_connect_errors 可能应该设置为您的平台允许的尽可能大。

  • max_connections

    严重程度:警告

    如果服务器真的有超过一千个线程在运行,那么系统可能会花更多的时间来调度线程而不是真正做有用的工作。应根据您的工作量考虑此变量的值。

  • myisam_repair_threads

    严重程度:注意

    myisam_repair_threads > 1 启用多线程修复,相对未经测试,官方文档中仍列为测试质量代码。

  • old_passwords

    严重程度:警告

    旧式密码不安全。它们通过网络以纯文本形式发送。

  • optimizer_prune_level

    严重程度:警告

    优化器在规划复杂查询时将使用穷举搜索,这会导致规划过程花费很长时间。

  • port

    严重程度:注意

    服务器正在侦听非默认端口。

  • query_cache_size-1

    严重程度:注意

    查询缓存不会扩展到大尺寸,当大于 128MB 时会导致性能不稳定,尤其是在多核机器上。

  • query_cache_size-2

    严重程度:警告

    当查询缓存大于 256MB 时,会导致严重的性能问题,尤其是在多核机器上。

  • read_buffer_size-1

    严重程度:注意

    read_buffer_size 变量通常应保留其默认值,除非专家确定有必要更改它。

  • read_buffer_size-2

    严重程度:警告

    read_buffer_size 变量不应大于 8MB。除非专家确定有必要更改它,否则它通常应保留默认值。使其大于 2MB 会显着影响性能,并可能导致服务器崩溃、交换死亡或变得极其不稳定。

  • read_rnd_buffer_size-1

    严重程度:注意

    read_rnd_buffer_size 变量通常应保留其默认值,除非专家确定有必要更改它。

  • read_rnd_buffer_size-2

    严重程度:警告

    read_rnd_buffer_size 变量不应大于 4M。除非专家确定有必要更改它,否则它通常应保留默认值。

  • relay_log_space_limit

    严重程度:警告

    设置relay_log_space_limit 会导致副本立即停止从其主节点获取二进制日志。如果 master 崩溃,这可能会增加数据丢失的风险。如果副本遇到中继日志空间的限制,则可能最新的事务仅存在于主服务器上,而没有副本检索到它们。

  • slave_net_timeout

    严重程度:警告

    此变量设置得太高。在注意到与 master 的连接失败并重试之前,等待时间太长了。这可能应该设置为 60 秒或更短。使用 pt-heartbeat 来确保连接不会在 master 空闲时出现超时也是一个好主意。

  • slave_skip_errors

    严重程度:暴击

    您不应设置此选项。如果复制出现错误,您需要找到并解决其原因;你的奴隶的数据很可能与主人不同。你可以用 pt-table-checksum 找出来。

  • sort_buffer_size-1

    严重程度:注意

    sort_buffer_size 变量通常应保留其默认值,除非专家确定有必要更改它。

  • sort_buffer_size-2

    严重程度:注意

    sort_buffer_size 变量通常应保留其默认值,除非专家确定有必要更改它。使其大于几 MB 会显着影响性能,并可能导致服务器崩溃、交换死亡或变得极其不稳定。

  • sql_notes

    严重程度:注意

    此服务器配置为不将注释级别的警告记录到错误日志中。

  • sync_frm

    严重程度:警告

    最好设置sync_frm,以便在服务器崩溃时将.frm 文件安全地刷新到磁盘。

  • tx_isolation-1

    严重程度:注意

    此服务器的事务隔离级别是非默认的。

  • tx_isolation-2

    严重程度:警告

    大多数应用程序应该使用默认的 REPEATABLE-READ 事务隔离级别,或者在少数情况下使用 READ-COMMITTED。

  • expire_logs_days

    严重程度:警告

    二进制日志已启用,但未启用自动清除。如果您不清除二进制日志,您的磁盘将被填满。如果您在 MySQL 外部删除二进制日志,则会导致不需要的行为。总是要求 MySQL 清除过时的日志,永远不要从外部删除它们。

  • innodb_file_io_threads

    严重程度:注意

    除了在 Windows 上,此选项没有用。

  • innodb_data_file_path

    严重程度:注意

    自动扩展 InnoDB 文件会消耗大量磁盘空间,以后很难回收。有些人更喜欢设置 innodb_file_per_table 并为 ibdata1 分配一个固定大小的文件。

  • innodb_flush_method

    严重程度:注意

    大多数使用 InnoDB 的生产数据库服务器应该将 innodb_flush_method 设置为 O_DIRECT 以避免双缓冲,除非 I/O 系统性能非常低。

  • innodb_locks_unsafe_for_binlog

    严重程度:警告

    如果使用基于语句的日志记录,则此选项会使从二进制日志和复制的时间点恢复不可信。

  • innodb_support_xa

    严重程度:警告

    MySQL 的 InnoDB 和二进制日志之间的内部 XA 事务支持被禁用。崩溃恢复后,二进制日志可能与 InnoDB 的状态不匹配,并且由于二进制日志中的乱序语句,复制可能会不同步。

  • log_bin

    严重程度:警告

    二进制日志被禁用,因此无法进行时间点恢复和复制。

  • log_output

    严重程度:警告

    将日志输出定向到表具有很高的性能影响。

  • max_relay_log_size

    严重程度:注意

    定义了自定义 max_relay_log_size。

  • myisam_recover_options

    严重程度:警告

    myisam_recover_options 应设置为某个值,例如 BACKUP,FORCE,以确保注意到表损坏。

  • storage_engine

    严重程度:注意

    服务器默认使用非标准存储引擎。

  • sync_binlog

    严重程度:警告

    启用了二进制日志记录,但未配置 sync_binlog 以便每个事务都刷新到二进制日志以保持持久性。

  • tmp_table_size

    严重程度:注意

    查询执行期间内部使用的内存中隐式临时表的有效最小大小为 min(tmp_table_size, max_heap_table_size),因此 max_heap_table_size 应至少与 tmp_table_size 一样大。

  • old mysql version

    严重程度:警告

    这些是每个主要版本的推荐最低版本:3.23、4.1.20、5.0.37、5.1.30。

  • end-of-life mysql version

    严重程度:注意

    每个早于 5.1 的版本现在都正式终止。

用法

pt-variable-advisor [OPTIONS]  [ DSN ]--ask-pass#略,详见pt-online-schema-change工具用法--charset#略,详见pt-online-schema-change工具用法--config#略,详见pt-online-schema-change工具用法--daemonize#略,详见pt-online-schema-change工具用法--database#略,详见pt-online-schema-change工具用法--defaults-file#略,详见pt-online-schema-change工具用法--help#略,详见pt-online-schema-change工具用法--host#略,详见pt-online-schema-change工具用法--ignore-rules#类型:哈希#忽略这些规则 ID。#指定要忽略的规则 ID(例如 LIT.001、RES.002 等)的逗号分隔列表。--password#略,详见pt-online-schema-change工具用法--pid#略,详见pt-online-schema-change工具用法--port#略,详见pt-online-schema-change工具用法--set-vars#略,详见pt-online-schema-change工具用法--socket#略,详见pt-online-schema-change工具用法--source-of-variables#类型:字符串;默认值:mysql#从这个源文件中读取SHOW VARIABLES。 取值为“mysql”、“none”或文件名。 如果指定了" mysql ",那么你也必须在命令行上指定一个DSN。  --user#略,详见pt-online-schema-change工具用法--verbose#简短形式:-v; 累计:是;默认值:1#增加输出的详细程度。在默认的详细级别,程序只打印每个规则描述的第一句话。在更高的级别,程序会打印更多的描述。--version#略,详见pt-online-schema-change工具用法--[no]version-check#略,详见pt-online-schema-change工具用法

使用示例

#检查本机mysql参数[root@localhost ~]# pt-variable-advisor localhost# WARN delay_key_write: MyISAM index blocks are never flushed until necessary.# WARN innodb_flush_log_at_trx_commit-1: InnoDB is not configured in strictly ACID mode.# WARN innodb_log_buffer_size: The InnoDB log buffer size generally should not be set larger than 16MB.# NOTE innodb_max_dirty_pages_pct: The innodb_max_dirty_pages_pct is lower than the default.# NOTE log_warnings-2: Log_warnings must be set greater than 1 to log unusual events such as aborted connections.# WARN max_connections: If the server ever really has more than a thousand threads running, then the system is likely to spend more time scheduling threads than really doing useful work.# NOTE read_buffer_size-1: The read_buffer_size variable should generally be left at its default unless an expert determines it is necessary to change it.# NOTE read_rnd_buffer_size-1: The read_rnd_buffer_size variable should generally be left at its default unless an expert determines it is necessary to change it.# WARN read_rnd_buffer_size-2: The read_rnd_buffer_size variable should not be larger than 4M.# NOTE sort_buffer_size-1: The sort_buffer_size variable should generally be left at its default unless an expert determines it is necessary to change it.# NOTE sort_buffer_size-2: The sort_buffer_size variable should generally be left at its default unless an expert determines it is necessary to change it.# NOTE innodb_data_file_path: Auto-extending InnoDB files can consume a lot of disk space that is very difficult to reclaim later.# NOTE innodb_flush_method: Most production database servers that use InnoDB should set innodb_flush_method to O_DIRECT to avoid double-buffering, unless the I/O system is very low performance.# WARN myisam_recover_options: myisam_recover_options should be set to some value such as BACKUP,FORCE to ensure that table corruption is noticed.

pt-mysql-summary

功能

精细地对mysql的配置和status信息进行汇总

描述

pt-mysql-summary通过连接到 MySQL 数据库服务器并查询它的状态和配置信息来工作。它将这些位数据保存到临时目录中的文件中,然后使用 awk 和其他脚本语言将它们整齐地格式化。

该工具与其运行的服务器的交互最少。例如,它假定您将在正在检查的同一台服务器上运行它,因此它假定它能够找到 my.cnf 配置文件。但是,如果不是这种情况,它应该优雅地降级。但是请注意,它的输出并未指明哪些信息来自 MySQL 数据库,哪些来自主机操作系统,因此如果您在一台服务器上运行该工具并连接到 MySQL 数据库,则可能会生成令人困惑的输出服务器运行在另一台服务器上。

输出

  • 报告是在哪台服务器上生成的

  • 服务器上正在运行哪些 MySQL 实例

  • MySQL 实例的快速摘要:版本、正常运行时间和其他非常基本的参数

  • SHOW PROCESSLIST 输出的摘要

  • 从 SHOW GLOBAL STATUS 的两个快照中选择的计数器,这些快照相隔大约 10 秒收集并进行模糊四舍五入。它仅包括递增计数器的项目

    第一列是变量名,第二列是第一个快照的计数器除以 86400(一天中的秒数),因此您可以看到计数器每天变化的幅度。86400 模糊舍入到 90000,因此正常运行时间计数器应始终约为 90000。

    第三列是第一个快照的值,除以正常运行时间,然后进行模糊四舍五入,因此它表示计数器在服务器正常运行时间内每秒增长的大约速度。

    第三列是第一个和第二个快照的增量差异,除以正常运行时间的差异,然后进行模糊四舍五入。因此,它显示了在生成报告时计数器每秒增长的速度。

  • 显示表缓存的大小,然后是正在使用的表缓存的百分比

  • 显示 Percona Server 中可用的功能以及它们是否已启用

  • 显示特定插件以及它们是否已启用

  • 显示查询缓存是否已启用及其大小,然后是正在使用的缓存百分比和命中插入比率

  • 指定--databases--all-databases,该工具将打印数据库中对象的数量和类型

    该部分中的第一个子报告是每个数据库中按类型划分的对象计数:表、视图等。第二个显示了每个数据库中有多少表使用了各种存储引擎。第三个子报告显示每个数据库中每种类型的索引的数量。

    最后一部分显示了每个数据库中各种数据类型的列数。对于紧凑显示,列标题采用垂直格式,因此您需要从顶部向下阅读。在此示例中,第一列是 char,第二列是timestamp。此示例被截断,因此它不会在终端上换行。

  • 服务器上使用的一些特定技术

  • InnoDB 存储引擎的重要配置变量

  • 显示 MyISAM 密钥缓存的大小,然后是使用中的缓存百分比和未刷新(模糊四舍五入)的百分比

  • 对mysql系统数据库中表的查询生成

  • 显示二进制日志的配置和状态

  • 显示了几个值得注意的服务器配置变量,在使用此服务器时可能需要了解这些变量

  • 显示了 my.cnf 文件的漂亮打印版本,删除了注释并添加了空格以对齐内容以便于阅读

用法

pt-mysql-summary [OPTIONS]--all-databases#mysqldump 并汇总所有数据库。见--databases。--ask-pass#略,详见pt-online-schema-change工具用法--config#略,详见pt-online-schema-change工具用法--databases#略,详见pt-online-schema-change工具用法--defaults-file#略,详见pt-online-schema-change工具用法--help#略,详见pt-online-schema-change工具用法--host#略,详见pt-online-schema-change工具用法--list-encrypted-tables#默认值:假#包括所有数据库中加密表的列表。这可能会导致速度变慢,因为查询信息架构表可能会很慢。--password#略,详见pt-online-schema-change工具用法--port#略,详见pt-online-schema-change工具用法--read-samples#类型:字符串#从此目录中找到的文件创建报告。--save-samples#类型:字符串#将用于生成摘要的数据文件保存在此目录中。--sleep#类型:int;默认值:10#收集状态计数器时休眠的秒数。--socket#略,详见pt-online-schema-change工具用法--user#略,详见pt-online-schema-change工具用法--version#略,详见pt-online-schema-change工具用法

使用示例

#打出mysql所有信息[root@localhost ~]# pt-mysql-summary# Percona Toolkit MySQL Summary Report #######################              System time | 2021-08-20 07:27:22 UTC (local TZ: CST +0800)# Instances ##################################################  Port  Data Directory             Nice OOM Socket  ===== ========================== ==== === ======   3306 /mysql/data/               0    0   /tmp/mysql.sock# MySQL Executable ###########################################       Path to executable | /mysql/service/mysql-5.7.32/bin/mysqld              Has symbols | Yes# Slave Hosts ################################################*************************** 1. row *************************** Server_id: 129      Host:      Port: 3306 Master_id: 128Slave_UUID: 9b6ccf89-f59e-11eb-8c6c-005056954d25*************************** 2. row *************************** Server_id: 131      Host:      Port: 3306 Master_id: 128Slave_UUID: 9de7e07e-f65f-11eb-bbdd-00505695983f# Report On Port 3306 ########################################                     User | root@localhost                     Time | 2021-08-20 15:27:22 (CST)                 Hostname | localhost.localdomain                  Version | 5.7.32-log Source distribution                 Built On | Linux x86_64                  Started | 2021-08-10 15:23 (up 10+00:03:36)                Databases | 8                  Datadir | /mysql/data/                Processes | 4 connected, 3 running              Replication | Is not a slave, has 2 slaves connected                  Pidfile | /mysql/data/mysql.pid (exists)# Processlist ################################################  Command                        COUNT(*) Working SUM(Time) MAX(Time)  ------------------------------ -------- ------- --------- ---------  Binlog Dump GTID                      2       2    900000    700000  Query                                 1       1         0         0  Sleep                                 1       0      1750      1750  User                           COUNT(*) Working SUM(Time) MAX(Time)  ------------------------------ -------- ------- --------- ---------  pcloud                                1       0         0         0  pt                                    2       2    900000    700000  root                                  1       1         0         0  Host                           COUNT(*) Working SUM(Time) MAX(Time)  ------------------------------ -------- ------- --------- ---------  172.18.40.129                         1       1    700000    700000  172.18.40.131                         1       1    250000    250000  172.26.67.156                         1       0         0         0  localhost                             1       1         0         0  db                             COUNT(*) Working SUM(Time) MAX(Time)  ------------------------------ -------- ------- --------- ---------  NULL                                  3       3    900000    700000  pttest                                1       0         0         0  State                          COUNT(*) Working SUM(Time) MAX(Time)  ------------------------------ -------- ------- --------- ---------                                        1       0         0         0  Master has sent all binlog to         2       2    900000    700000  starting                              1       1         0         0# Status Counters (Wait 10 Seconds) ##########################Variable                                Per day  Per second     11 secsAborted_clients                              20Aborted_connects                             35Binlog_cache_use                       10000000         125Binlog_stmt_cache_use                        20Bytes_received                      12500000000      150000         450Bytes_sent                          35000000000      400000        3500Com_admin_commands                        60000Com_alter_table                               1Com_begin                                     5Com_change_db                               200Com_commit                                   15Com_create_db                                 4Com_create_table                              7Com_create_trigger                            1Com_delete                                   45Com_drop_table                                1Com_drop_trigger                              1Com_insert                             10000000         125Com_kill                                      4Com_replace                                   2Com_replace_select                           45Com_select                                  700                       2Com_set_option                              450Com_show_create_func                         10Com_show_create_proc                         15Com_show_create_table                       125Com_show_databases                           15Com_show_engine_status                        5Com_show_fields                              60Com_show_grants                              35Com_show_master_status                    60000Com_show_processlist                         80Com_show_slave_status                     60000Com_show_status                              50Com_show_storage_engines                     20Com_show_table_status                         1Com_show_tables                              25Com_show_triggers                             1Com_show_variables                          175Com_show_warnings                           350Com_unlock_tables                             1Com_update                                60000Connections                                 100                       1Created_tmp_disk_tables                     200                       1Created_tmp_files                             3Created_tmp_tables                         1500                       5Handler_commit                         20000000         225Handler_delete                               40Handler_external_lock                  20000000         225Handler_prepare                        20000000         225Handler_read_first                          125Handler_read_key                          60000Handler_read_last                             2Handler_read_next                      90000000        1000Handler_read_prev                             9Handler_read_rnd                           1750Handler_read_rnd_next                  50000000         600          70Handler_rollback                              2Handler_update                            60000Handler_write                          10000000         125          35Innodb_buffer_pool_bytes_data         400000000        5000       -4468Innodb_buffer_pool_pages_flushed         300000           3Innodb_buffer_pool_read_ahead            600000           6Innodb_buffer_pool_read_ahead_evicted          60Innodb_buffer_pool_read_requests      200000000        2250          25Innodb_buffer_pool_reads                 450000           4Innodb_buffer_pool_write_requests      70000000         900          20Innodb_data_fsyncs                       125000           1Innodb_data_read                    17500000000      200000Innodb_data_reads                       1000000          10Innodb_data_writes                      7000000          80Innodb_data_written                 25000000000      300000       10000Innodb_dblwr_pages_written               300000           3Innodb_dblwr_writes                       30000Innodb_log_write_requests              15000000         175Innodb_log_writes                       7000000          80Innodb_os_log_fsyncs                      60000Innodb_os_log_written               17500000000      200000Innodb_pages_created                     250000           3Innodb_pages_read                       1000000          10Innodb_pages_written                     300000           3Innodb_row_lock_time                      17500Innodb_row_lock_waits                        60Innodb_rows_deleted                          60Innodb_rows_inserted                   10000000         125           4Innodb_rows_read                      125000000        1500           4Innodb_rows_updated                       60000Innodb_num_open_files                         4Innodb_available_undo_logs                   15Key_read_requests                            80Key_reads                                     1Open_table_definitions                       25Opened_files                                700                      15Opened_table_definitions                     35Opened_tables                              1750Performance_schema_file_instances_lost           3Qcache_not_cached                           700                       2Queries                                10000000         125           4Questions                              10000000         125           4Select_full_join                              3Select_scan                                 600Slow_queries                                250Sort_merge_passes                             1Sort_rows                                  1750Sort_scan                                    20Ssl_accepts                                  30Ssl_finished_accepts                         30Ssl_session_cache_misses                      2Ssl_session_cache_overflows                  15Ssl_used_session_cache_entries                5Table_locks_immediate                       300Table_open_cache_hits                  10000000         125Table_open_cache_misses                    1750Table_open_cache_overflows                 1750Threads_created                               2Uptime                                    90000           1           1# Table cache ################################################                     Size | 512                    Usage | 90%# Key Percona Server features ################################      Table & Index Stats | Not Supported     Multiple I/O Threads | Enabled     Corruption Resilient | Not Supported      Durable Replication | Not Supported     Import InnoDB Tables | Not Supported     Fast Server Restarts | Not Supported         Enhanced Logging | Not Supported     Replica Perf Logging | Disabled      Response Time Hist. | Not Supported          Smooth Flushing | Not Supported      HandlerSocket NoSQL | Not Supported           Fast Hash UDFs | Unknown# Percona XtraDB Cluster ###################################### Plugins ####################################################       InnoDB compression | ACTIVE# Query cache ################################################         query_cache_type | OFF                     Size | 1.0M                    Usage | 1%         HitToInsertRatio | 0%# Schema #####################################################Specify --databases or --all-databases to dump and summarize schemas# Noteworthy Technologies ####################################                      SSL | Yes     Explicit LOCK TABLES | Yes           Delayed Insert | No          XA Transactions | No              NDB Cluster | No      Prepared Statements | No Prepared statement count | 0# InnoDB #####################################################                  Version | 5.7.32         Buffer Pool Size | 4.0G         Buffer Pool Fill | 100%        Buffer Pool Dirty | 0%           File Per Table | ON                Page Size | 16k            Log File Size | 3 * 1.0G = 3.0G          Log Buffer Size | 32M             Flush Method |      Flush Log At Commit | 2               XA Support | ON                Checksums | ON              Doublewrite | ON          R/W I/O Threads | 4 4             I/O Capacity | 2000       Thread Concurrency | 40      Concurrency Tickets | 5000       Commit Concurrency | 0      Txn Isolation Level | REPEATABLE-READ        Adaptive Flushing | ON      Adaptive Checkpoint |           Checkpoint Age | 9             InnoDB Queue | 0 queries inside InnoDB, 0 queries in queue       Oldest Transaction | 0 Seconds         History List Len | 0               Read Views | 0         Undo Log Entries | 0 transactions, 0 total undo, 0 max undo        Pending I/O Reads | 0 buf pool reads, 0 normal AIO, 0 ibuf AIO, 0 preads       Pending I/O Writes | 0 buf pool (0 LRU, 0 flush list, 0 page); 0 AIO, 0 sync, 0 log IO (0 log, 0 chkp); 0 pwrites      Pending I/O Flushes | 0 buf pool, 0 log       Transaction States | 3xnot started# MyISAM #####################################################                Key Cache | 64.0M                 Pct Used | 20%                Unflushed | 0%# Security ###################################################                    Users | 3 users, 0 anon, 0 w/o pw, 0 old pw            Old Passwords | 0# Encryption #################################################No keyring plugins found# Binary Logging #############################################                  Binlogs | 149               Zero-Sized | 0               Total Size | 148.7G            binlog_format | STATEMENT         expire_logs_days | 3              sync_binlog | 1                server_id | 128             binlog_do_db |         binlog_ignore_db |# Noteworthy Variables #######################################     Auto-Inc Incr/Offset | 1/1   default_storage_engine | InnoDB               flush_time | 0             init_connect |                init_file |                 sql_mode | STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION         join_buffer_size | 8M         sort_buffer_size | 8M         read_buffer_size | 4M     read_rnd_buffer_size | 8M       bulk_insert_buffer | 0.00      max_heap_table_size | 256M           tmp_table_size | 256M       max_allowed_packet | 1G             thread_stack | 256k                      log |                log_error | /mysql/log/mysql-error-log.err             log_warnings | 1         log_slow_queries |log_queries_not_using_indexes | OFF        log_slave_updates | ON# Configuration File #########################################              Config File | /etc/my.cnf[client]port                                = 3306socket                              = /tmp/mysql.sock[mysqld]basedir                             = /mysql/service/mysql-5.7.32binlog_cache_size                   = 4Mbinlog_format                       = STATEMENTbinlog_rows_query_log_events        = 1bulk_insert_buffer_size             = 64Mcharacter-set-server                = utf8datadir                             = /mysql/data/enforce-gtid-consistency            = 1event_scheduler                     = 0expire_logs_days                    = 3explicit_defaults_for_timestamp     = 1gtid-mode                           = ONinnodb_buffer_pool_size             = 4Ginnodb_data_file_path               = ibdata1:1G:autoextendinnodb_data_home_dir                = /mysql/data/innodb_file_per_table               = 1innodb_flush_log_at_trx_commit      = 2innodb_flush_neighbors              = 0innodb_io_capacity                  = 2000innodb_io_capacity_max              = 4000innodb_lock_wait_timeout            = 50innodb_log_buffer_size              = 32Minnodb_log_file_size                = 1Ginnodb_log_files_in_group           = 3innodb_log_group_home_dir           = /mysql/data/innodb_max_dirty_pages_pct          = 40innodb_sort_buffer_size             = 64Minnodb_thread_concurrency           = 40interactive_timeout                 = 3600join_buffer_size                    = 8Mkey_buffer_size                     = 64Mlog-bin                             = /mysql/log/mysql-binlog-error                           = /mysql/log/mysql-error-log.errlog-slave-updates                   = 1log_error_verbosity                 = 2log_slave_updates                   = 1long_query_time                     = 1lower_case_table_names              = 1master_info_repository              = TABLEmax_allowed_packet                  = 1024Mmax_binlog_cache_size               = 2Gmax_binlog_size                     = 1Gmax_connect_errors                  = 100000max_connections                     = 2040max_heap_table_size                 = 256Mmax_relay_log_size                  = 1Gmyisam_max_sort_file_size           = 1Gmyisam_sort_buffer_size             = 128Mnet_read_timeout                    = 3600net_write_timeout                   = 3600open_files_limit                    = 65535pid-file                            = /mysql/data/mysql.pidport                                = 3306read_buffer_size                    = 4Mread_rnd_buffer_size                = 8Mrelay_log                           = /mysql/log/mysql-relay-binrelay_log_info_repository           = TABLErelay_log_purge                     = 1relay_log_recovery                  = 1server-id                           = 128skip-external-lockingskip_name_resolveslave_exec_mode                     = idempotentslow_query_log                      = 1slow_query_log_file                 = /mysql/log/mysql-slow.logsocket                              = /tmp/mysql.socksort_buffer_size                    = 8Msql_mode                            = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTIONsymbolic-links                      = 0sync_binlog                         = 1sync_master_info                    = 1sync_relay_log                      = 0sync_relay_log_info                 = 0table_open_cache                    = 512thread_cache_size                   = 1024thread_stack                        = 256Ktmp_table_size                      = 256Muser                                = mysqlwait_timeout                        = 3600[mysqld_safe]log-error                           = /mysql/log/mysql-error-log.err# Memory management library ##################################jemalloc is not enabled in mysql config for process with id 18567# The End ####################################################

你可能感兴趣的:(学习,dba,数据库开发,数据库架构)