percona-toolkit常用工具的使用

percona-toolkit工具的使用

说明

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 <<EOF
    export PATH=$PATH:/app/percona-toolkit/bin
    EOF
    
    source /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
流程图

pt-online-schema-change

用法
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
#不要复制比所需块大小大得多的块。
#当表没有唯一索引时,块大小可能不准确。此选项指定不准确度的最大可容忍限制。该工具使用 <EXPLAIN> 来估计块中有多少行。如果该估计值超过所需块大小乘以限制,则该工具将跳过该块。
#此选项的最小值为 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 <thread_id>)
#	Connection is killed (KILL CONNECTION <thread_id>)
#	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 N
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值