AI 日报

深度解析Percona Toolkit工具集

  • By 51ITO
  • May 29, 2024 - 2 min read



作者 | 吴守阳

审校 | 重楼

介绍

Percona Toolkit是一套专业的MySQL和MariaDB数据库管理工具,涵盖了从性能优化到数据同步和备份恢复的多个方面。本文将深入探讨Percona Toolkit工具集的核心功能和使用场景,帮助你更好地理解和利用这些强大的数据库工具。

主要功能和用途

性能优化和分析:

  • 使用pt-query-digest分析慢查询,优化数据库性能。
  • 使用pt-index-usage检查和优化索引的使用情况。

数据归档:

  • 使用pt-archiver归档和清理历史数据。

数据同步和比较:

  • 使用pt-table-checksum检查表之间的数据一致性。
  • 使用pt-table-sync在数据库服务器之间同步表数据。

Schema变更:

  • 使用pt-online-schema-change在线执行表结构更改,避免表锁定问题。

实用工具:

  • 使用pt-config-diff比较MySQL配置文件的不同之处。
  • 使用pt-mysql-summary生成MySQL服务器的摘要信息,方便日常管理和监控。

Percona Toolkit工具

1.pt-align

作用:对齐查询输出,方便人们阅读和分析。

示例

echo -e "col1 col2
val1 val2" | pt-align

2.pt-archiver

作用:从MySQL表中归档旧数据,以保持表的高性能。

参数:

--limit10000 每次取1000行数据用pt-archive处理
--txn-size 1000 设置1000行为一个事务提交一次
--where‘id<3000‘ 设置操作条件
--progress5000 每处理5000行输出一次处理信息
--statistics 输出执行过程及最后的操作统计。(只要不加上--quiet,默认情况下pt-archive都会输出执行过程的)
-- 指定字符集为UTF8
--bulk-delete 批量删除source上的旧数据(例如每次1000行的批量删除操作)
--bulk-insert 批量插入数据到dest主机 (看dest的general log发现它是通过在dest主机上LOAD DATA LOCAL INFILE插入数据的)
--replace 将insert into 语句改成replace写入到dest库
--sleep120 每次归档了limit个行记录后的休眠120秒(单位为秒)
--file‘/root/test.txt‘
--purge 删除source数据库的相关匹配记录
--header 输入列名称到首行(和--file一起使用)
--no-check-charset 不指定字符集
--check-columns 检验dest和source的表结构是否一致,不一致自动拒绝执行(不加这个参数也行。默认就是执行检查的)
--no-check-columns 不检验dest和source的表结构是否一致,不一致也执行(会导致dest上的无法与source匹配的列值被置为null或者0)
--chekc-interval 默认1s检查一次
--local 不把optimize或analyze操作写入到binlog里面(防止造成主从延迟巨大)
--retries 超时或者出现死锁的话,pt-archiver进行重试的间隔(默认1s)
--no-version-check 目前为止,发现部分pt工具对阿里云RDS操作必须加这个参数
--analyze=ds 操作结束后,优化表空间(d表示dest,s表示source)
--no-delete 表示不删除原来的数据,注意:如果不指定此参数,所有处理完成后,都会清理原表中的数据

示例:

  • 将表中小于2018-07-01时间的数据进行归档,不删除原表记录pt-archiver --source h=192.168.153.148,P=3306,u=mss,p=mss,D=d1,t=t4 --dest h=192.168.153.148,P=3306,u=mss,p=mss,D=d1,t=t5 --no-check-charset --where 'day<"2018-07-01"' --progress 5000 --no-delete --limit=10000 --statistics
  • 将表中小于2018-07-01时间的数据进行归档,删除原表记录,优化表空间(因为这种操作费时间,并且需要你提前预估有足够的磁盘空间用于拷贝表)pt-archiver --source h=192.168.153.148,P=3306,u=mss,p=mss,D=d1,t=t4 --dest h=192.168.153.148,P=3306,u=mss,p=mss,D=d1,t=t5 --no-check-charset --where 'day<"2018-07-01"' --progress 5000 --purge --check-columns --analyze=ds --limit=10000 --statistics
  • 用于把数据导出文件,不用删除原表中数据 pt-archiver --source h=192.168.153.148,P=3306,u=mss,p=mss,D=d1,t=t4 --no-check-charset --where 'day<"2018-06-01"' --progress 4000 --no-delete --file "/tmp/pt-archiver.dat" --header --limit=10000
  • 将表中小于2018-07-01时间的数据进行归档,每10000条一次删除原表记录pt-archiver --source h=192.168.153.148,P=3306,u=mss,p=mss,D=d1,t=t4 --dest h=192.168.153.148,P=3306,u=mss,p=mss,D=d1,t=t5 --no-check-charset --where 'day<"2018-07-01"' --progress 5000 --bulk-delete --limit=10000 --statistics
  • 将表中6个月前的数据归档pt-archiver --source h=host,D=db,t=table --dest h=host,D=db,t=archive_table --where "created < NOW() - INTERVAL 6 MONTH"

3.pt-config-diff

作用:比较两个MySQL配置文件并显示差异。

示例:

pt-config-diff /etc/my.cnf /etc/mysql/my.cnf

4.pt-deadlock-logger

作用:记录MySQL中的死锁事件。

参数:

 --ask-pass            Prompt for a password when connecting to MySQL
  --charset=s       -A  Default character set
  --clear-deadlocks=s   Use this table to create a small deadlock
  --columns=A           The columns are: (default server, ts, thread, txn_id,
                        txn_time, user, hostname, ip, db, tbl, idx, lock_type,
                        lock_mode, wait_hold, victim, query)
  --config=A            Read this comma-separated list of config files; if
                        specified, this must be the first option on the command
                        line
  --create-dest-table   Create the table specified by --dest
  --daemonize           Fork to the background and detach from the shell
  --database=s      -D  Connect to this database
  --defaults-file=s -F  Only read mysql options from the given file
  --dest=d              DSN for where to store deadlocks; specify at least a
                        database (D) and table (t)
  --help                Show help and exit
  --host=s          -h  Connect to host
  --interval=m          How often to check for deadlocks (default 30).
                        Optional suffix s=seconds, m=minutes, h=hours, d=days;
                        if no suffix, s is used.
  --iterations=i        How many times to check for deadlocks
  --log=s               Print all output to this file when daemonized
  --numeric-ip          Express IP addresses as integers
  --password=s      -p  Password to use when connecting
  --pid=s               Create the given PID file
  --port=i          -P  Port number to use for connection
  --quiet               Do not deadlocks; only print errors and warnings to
                        STDERR
  --run-time=m          How long to run before exiting.  Optional suffix s=
                        seconds, m=minutes, h=hours, d=days; if no suffix, s is
                        used.
  --set-vars=A          Set the MySQL variables in this comma-separated list of
                        variable=value pairs
  --socket=s        -S  Socket file to use for connection
  --tab                 Use tabs to separate columns instead of spaces
  --user=s          -u  User for login if not current user
  --version             Show version and exit
  --[no]version-check   Check for the latest version of Percona Toolkit, MySQL,
                        and other programs (default yes)

示例:

pt-deadlock-logger h=host1 --iterations 1
pt-deadlock-logger --user=username --password=password
pt-deadlock-logger h=host1 --dest h=host2,D=percona_schema,t=deadlocks

5.pt-diskstats

作用:收集和显示磁盘I/O统计信息。

示例:

pt-diskstats --devices sda,sdb --interval 1

6.pt-duplicate-key-checker

作用:查找和报告重复的MySQL索引。

参数:

Options:

  --all-structs         Compare indexes with different structs (BTREE, HASH,
                        etc)
  --ask-pass            Prompt for a password when connecting to MySQL
  --charset=s       -A  Default character set
  --[no]clustered       PK columns appended to secondary key is duplicate (
                        default yes)
  --config=A            Read this comma-separated list of config files; if
                        specified, this must be the first option on the command
                        line
  --databases=h     -d  Check only this comma-separated list of databases
  --defaults-file=s -F  Only read mysql options from the given file
  --engines=h       -e  Check only tables whose storage engine is in this comma-
                        separated list
  --help                Show help and exit
  --host=s          -h  Connect to host
  --ignore-databases=H  Ignore this comma-separated list of databases
  --ignore-engines=H    Ignore this comma-separated list of storage engines
  --ignore-order        Ignore index order so KEY(a,b) duplicates KEY(b,a)
  --ignore-tables=H     Ignore this comma-separated list of tables
  --key-types=s         Check for duplicate f=foreign keys, k=keys or fk=both (
                        default fk)
  --password=s      -p  Password to use when connecting
  --pid=s               Create the given PID file
  --port=i          -P  Port number to use for connection
  --set-vars=A          Set the MySQL variables in this comma-separated list of
                        variable=value pairs
  --socket=s        -S  Socket file to use for connection
  --[no]sql             Print DROP KEY statement for each duplicate key (
                        default yes)
  --[no]summary         Print summary of indexes at end of output (default yes)
  --tables=h        -t  Check only this comma-separated list of tables
  --user=s          -u  User for login if not current user
  --verbose         -v  Output all keys and/or foreign keys found, not just
                        redundant ones
  --version             Show version and exit
  --[no]version-check   Check for the latest version of Percona Toolkit, MySQL,
                        and other programs (default yes)

示例:

pt-duplicate-key-checker --user=username --password=password

7.pt-fifo-split

作用:将输入文件分割成多个文件,并按FIFO顺序处理。

示例:

pt-fifo-split --lines 1000 input.txt

8.pt-find

作用:查找和列出符合条件的MySQL表。

示例:

pt-find --user=username --password=password --database=db --engine=InnoDB

9.pt-fingerprint

作用:将SQL查询规范化为指纹形式,以便对类似查询进行分组和统计。

参数:

  --match-embedded-numbers  Match numbers embedded in words and replace as
                            single values
  --match-md5-checksums     Match MD5 checksums and replace as single values
  --query=s                 The query to convert into a fingerprint

示例:

pt-fingerprint --query="SELECT * FROM users WHERE id = 123 AND username = 'johndoe';"
输出:SELECT * FROM users WHERE id = ? AND username = ?;

10.pt-fk-error-logger

作用:记录MySQL中的外键错误。

示例:

pt-fk-error-logger --user=username --password=password

11.pt-galera-log-explainer

作用:分析和解释Galera Cluster的日志文件。

示例:

pt-galera-log-explainer --file /path/to/galera.log

12.pt-heartbeat

作用:监控和报告MySQL复制延迟。

示例:

pt-heartbeat --update --database=test --table=heartbeat --interval=1 --user=username --password=password

13.pt-index-usage

作用:分析和报告MySQL表的索引使用情况。

参数:

--ask-pass 连接到 MySQL 时提示输入密码
--charset=s -A 默认字符集
--config=A 读取这个逗号分隔的配置文件列表;如果指定此选项,它必须是命令行上的第一个选项
--create-save-results-database 如果 --save-results-database 不存在,则创建它
--[no]create-views 为 --save-results-database 示例查询创建视图
--database=s -D 连接到的数据库
--databases=h -d 只从这个逗号分隔的数据库列表中获取表和索引
--databases-regex=s 只从名称匹配这个 Perl 正则表达式的数据库中获取表和索引
--defaults-file=s -F 只从指定的文件中读取 MySQL 选项
--drop=H 仅建议删除这些类型的未使用索引(默认非唯一)
--empty-save-results-tables 删除并重新创建 --save-results-database 中所有已存在的表
--help 显示帮助信息并退出
--host=s -h 连接到的主机
--ignore-databases=H 忽略这个逗号分隔的数据库列表
--ignore-databases-regex=s 忽略名称匹配这个 Perl 正则表达式的数据库
--ignore-tables=H 忽略这个逗号分隔的表名列表
--ignore-tables-regex=s 忽略名称匹配这个 Perl 正则表达式的表
--password=s -p 连接时使用的密码
--port=i -P 连接使用的端口号
--progress=a 将进度报告打印到 STDERR(默认 time,30)
--quiet -q 不打印任何警告
--[no]report 打印 --report-format 的报告(默认是)
--report-format=A 目前只有一个报告:drop_unused_indexes(默认 drop_unused_indexes)
--save-results-database=d 将结果保存到这个数据库的表中
--set-vars=A 在这个逗号分隔的变量=值列表中设置 MySQL 变量
--socket=s -S 连接使用的套接字文件
--tables=h -t 只从这个逗号分隔的表列表中获取索引
--tables-regex=s 只从名称匹配这个 Perl 正则表达式的表中获取索引
--user=s -u 登录时使用的用户,如果不是当前用户
--version 显示版本信息并退出
--[no]version-check 检查 Percona Toolkit、MySQL 和其他程序的最新版本(默认是)

示例:

pt-index-usage --user=username --password=password --database=db slow.log

14.pt-ioprofile

作用:记录并显示进程的I/O活动。

示例:

pt-ioprofile --pid 1234

15.pt-k8s-debug-collector

作用:收集Kubernetes集群的调试信息。

参数:

--ask-pass 连接到 MySQL 时提示输入密码
--charset=s -A 默认字符集
--config=A 读取这个逗号分隔的配置文件列表;如果指定此选项,它必须是命令行上的第一个选项
--create-save-results-database 如果 --save-results-database 不存在,则创建它
--[no]create-views 为 --save-results-database 示例查询创建视图
--database=s -D 连接到的数据库
--databases=h -d 只从这个逗号分隔的数据库列表中获取表和索引
--databases-regex=s 只从名称匹配这个 Perl 正则表达式的数据库中获取表和索引
--defaults-file=s -F 只从指定的文件中读取 MySQL 选项
--drop=H 仅建议删除这些类型的未使用索引(默认非唯一)
--empty-save-results-tables 删除并重新创建 --save-results-database 中所有已存在的表
--help 显示帮助信息并退出
--host=s -h 连接到的主机
--ignore-databases=H 忽略这个逗号分隔的数据库列表
--ignore-databases-regex=s 忽略名称匹配这个 Perl 正则表达式的数据库
--ignore-tables=H 忽略这个逗号分隔的表名列表
--ignore-tables-regex=s 忽略名称匹配这个 Perl 正则表达式的表
--password=s -p 连接时使用的密码
--port=i -P 连接使用的端口号
--progress=a 将进度报告打印到 STDERR(默认 time,30)
--quiet -q 不打印任何警告
--[no]report 打印 --report-format 的报告(默认是)
--report-format=A 目前只有一个报告:drop_unused_indexes(默认 drop_unused_indexes)
--save-results-database=d 将结果保存到这个数据库的表中
--set-vars=A 在这个逗号分隔的变量=值列表中设置 MySQL 变量
--socket=s -S 连接使用的套接字文件
--tables=h -t 只从这个逗号分隔的表列表中获取索引
--tables-regex=s 只从名称匹配这个 Perl 正则表达式的表中获取索引
--user=s -u 登录时使用的用户,如果不是当前用户
--version 显示版本信息并退出
--[no]version-check 检查 Percona Toolkit、MySQL 和其他程序的最新版本(默认是)

示例

pt-k8s-debug-collector --namespace default

16.pt-kill

作用:查找并终止符合条件的MySQL会话。

参数:

- `--ask-pass` 连接到MySQL时提示输入密码
- `--charset=s -A` 默认字符集
- `--config=A` 读取这个以逗号分隔的配置文件列表;如果指定,这必须是命令行上的第一个选项
- `--create-log-table` 如果不存在,创建--log-dsn表
- `--daemonize` 后台运行并从shell分离
- `--database=s -D` 用于连接的数据库
- `--defaults-file=s -F` 仅从指定文件读取MySQL选项
- `--filter=s` 丢弃该Perl代码未返回true的事件
- `--group-by=s` 将匹配应用于按此SHOW PROCESSLIST列分组的每类查询
- `--help` 显示帮助并退出
- `--host=s -h` 连接到主机(默认localhost)
- `--interval=m` 检查要杀死的查询的频率。可选后缀s=秒,m=分钟,h=小时,d=天;如果没有后缀,则使用s
- `--json` 以JSON格式打印已杀死的查询,必须与--print一起使用
- `--json-fields=s` 指定在使用--json时要包含在JSON输出中的额外键值对列表,参数值的格式必须为:
- `--kill-busy-commands=s` 组:操作(默认Query)
- `--log=s` 在后台运行时将所有输出打印到该文件
- `--log-dsn=d` 将每个被杀死的查询存储在此DSN中
- `--password=s -p` 连接时使用的密码
- `--pid=s` 创建给定的PID文件
- `--port=i -P` 用于连接的端口号
- `--query-id` 打印刚被杀死的查询的ID
- `--rds` 表示问题实例位于Amazon RDS上
- `--run-time=m` 运行多长时间后退出。可选后缀s=秒,m=分钟,h=小时,d=天;如果没有后缀,则使用s
- `--sentinel=s` 如果此文件存在则退出(默认/tmp/pt-kill-sentinel)
- `--set-vars=A` 在这个以逗号分隔的变量=值对列表中设置MySQL变量
- `--slave-password=s` 设置用于连接从库的密码
- `--slave-user=s` 设置用于连接从库的用户
- `--socket=s -S` 用于连接的套接字文件
- `--stop` 通过创建--sentinel文件停止运行实例
- `--[no]strip-comments` 从PROCESSLIST的Info列中移除SQL注释(默认yes)
- `--user=s -u` 登录用户(如果不是当前用户)
- `--verbose -v` 打印正在执行的操作信息到STDOUT
- `--version` 显示版本并退出
- `--[no]version-check` 检查Percona Toolkit、MySQL和其他程序的最新版本(默认yes)
- `--victims=s` 每类匹配的查询中将被杀死的查询(默认oldest)
- `--wait-after-kill=m` 杀死一个查询后等待,然后再查找更多要杀死的查询。可选后缀s=秒,m=分钟,h=小时,d=天;如果没有后缀,则使用s
- `--wait-before-kill=m` 杀死一个查询前等待。可选后缀s=秒,m=分钟,h=小时,d=天;如果没有后缀,则使用s

操作:

- `--execute-command=s` 当查询匹配时执行此命令
- `--fingerprint` 修改--print行为,强制显示查询指纹而不是原始查询
- `--kill` 杀死匹配查询的连接
- `--kill-query` 杀死匹配查询
- `--print` 打印匹配查询的KILL语句;不实际杀死查询

类匹配:

- `--any-busy-time=m` 如果任何查询运行时间超过此时间,则匹配查询类。“超过”意味着如果您指定10秒,例如,只有在至少有一个查询运行时间超过10秒时,类才会匹配。可选后缀s=秒,m=分钟,h=小时,d=天;如果没有后缀,则使用s
- `--each-busy-time=m` 如果每个查询运行时间超过此时间,则匹配查询类。“超过”意味着如果您指定10秒,例如,只有当每个查询运行时间超过10秒时,类才会匹配。可选后缀s=秒,m=分钟,h=小时,d=天;如果没有后缀,则使用s
- `--query-count=i` 如果类中至少有这么多查询,则匹配查询类

查询匹配:

- `--busy-time=m` 匹配运行时间超过此时间的查询。可选后缀s=秒,m=分钟,h=小时,d=天;如果没有后缀,则使用s
- `--idle-time=m` 匹配空闲/睡眠时间超过此时间的查询。可选后缀s=秒,m=分钟,h=小时,d=天;如果没有后缀,则使用s
- `--ignore-command=s` 忽略Command匹配此Perl正则表达式的查询
- `--ignore-db=s` 忽略db(数据库)匹配此Perl正则表达式的查询
- `--ignore-host=s` 忽略Host匹配此Perl正则表达式的查询
- `--ignore-info=s` 忽略Info(查询)匹配此Perl正则表达式的查询
- `--[no]ignore-self` 不要杀死pt-kill自己的连接(默认yes)
- `--ignore-state=s` 忽略State匹配此Perl正则表达式的查询(默认Locked)
- `--ignore-user=s` 忽略User匹配此Perl正则表达式的查询
- `--match-all` 匹配所有未被忽略的查询
- `--match-command=s` 仅匹配Command匹配此Perl正则表达式的查询
- `--match-db=s` 仅匹配db(数据库)匹配此Perl正则表达式的查询
- `--match-host=s` 仅匹配Host匹配此Perl正则表达式的查询
- `--match-info=s` 仅匹配Info(查询)匹配此Perl正则表达式的查询
- `--match-state=s` 仅匹配State匹配此Perl正则表达式的查询
- `--match-user=s` 仅匹配User匹配此Perl正则表达式的查询
- `--replication-threads` 允许匹配和杀死复制线程
- `--test-matching=a` 包含PROCESSLIST快照的文件,以测试匹配选项

示例:

pt-kill --busy-time 60 --user=username --password=password

17.pt-mext

作用:扩展Percona Toolkit的功能,通过加载外部模块。

示例:

pt-mext /path/to/module.pm

18.pt-mongodb-index-check

作用:检查MongoDB中的索引并报告不必要的索引。

参数:

- `-h, --help` 显示上下文相关的帮助信息
- `--version` 显示版本信息
- `--all-databases` 检查所有数据库(不包括系统数据库)
- `--databases=DATABASES,...` 要检查的数据库列表,用逗号分隔
- `--all-collections` 检查选定数据库中的所有集合
- `--collections=COLLECTIONS,...` 要检查的集合列表,用逗号分隔
- `--mongodb.uri=mongodb://host:port/admindb?options` 连接URI
- `--json` 以JSON格式显示输出

示例:

pt-mongodb-index-check --uri mongodb://localhost:27017

19.pt-mongodb-query-digest

作用:分析和报告MongoDB查询日志。

示例:

pt-mongodb-query-digest /path/to/mongodb.log

20.pt-mongodb-summary

作用:提供MongoDB服务器的摘要信息。

示例:

pt-mongodb-summary --uri mongodb://localhost:27017

21.pt-mysql-summary

作用:提供MySQL服务器的摘要信息。

示例:

pt-mysql-summary --user=username --password=password

22.pt-online-schema-change

作用:在线修改MySQL表的结构,而不会造成服务中断。

参数:

- `--alter=s` 进行架构修改,不包括 ALTER TABLE 关键字
- `--alter-foreign-keys-method=s` 修改外键引用新表的方法
- `--[no]analyze-before-swap` 在交换新旧表之前对新表执行 ANALYZE TABLE(默认是)
- `--ask-pass` 连接 MySQL 时提示输入密码
- `--channel=s` 使用复制通道连接服务器时使用的通道名称
- `--charset=s, -A` 默认字符集
- `--[no]check-alter` 解析指定的 --alter 并尝试警告可能的意外行为(默认是)
- `--[no]check-foreign-keys` 检查自引用外键(默认是)
- `--check-interval=m` 检查 --max-lag 之间的休眠时间(默认 1),可选后缀 s=秒,m=分钟,h=小时,d=天;如果没有后缀,则使用 s
- `--[no]check-plan` 检查查询执行计划的安全性(默认是)
- `--[no]check-replication-filters` 如果在任何服务器上设置了任何复制过滤器,则中止(默认是)
- `--check-slave-lag=s` 暂停数据复制,直到此副本的延迟小于 --max-lag
- `--[no]check-unique-key-change` 如果 --alter 指定的语句尝试添加唯一索引,则避免 pt-online-schema-change 运行(默认是)
- `--chunk-index=s` 为块表选择优先的索引
- `--chunk-index-columns=i` 使用 --chunk-index 的最多左列数
- `--chunk-size=z` 每个复制块选择的行数(默认 1000)
- `--chunk-size-limit=f` 不要复制比期望块大小大很多的块(默认 4.0)
- `--chunk-time=f` 动态调整块大小,以便每个数据复制查询执行时间为该值(默认 0.5)
- `--config=A` 读取此逗号分隔的配置文件列表;如果指定,则必须是命令行上的第一个选项
- `--critical-load=A` 在每个块之后检查 SHOW GLOBAL STATUS,并在负载过高时中止(默认 Threads_running=50)
- `--data-dir=s` 使用 DATA DIRECTORY 特性在不同分区上创建新表
- `--database=s, -D` 连接到此数据库
- `--default-engine` 从新表中删除 ENGINE
- `--defaults-file=s, -F` 仅从给定文件读取 MySQL 选项
- `--[no]drop-new-table` 如果复制原始表失败,则删除新表(默认是)
- `--[no]drop-old-table` 重命名原始表后删除它(默认是)
- `--[no]drop-triggers` 删除旧表上的触发器。--no-drop-triggers 强制 --no-drop-old-table(默认是)
- `--dry-run` 创建并修改新表,但不创建触发器、复制数据或替换原始表
- `--execute` 表明您已阅读文档并希望修改表
- `--[no]fail-on-stopped-replication` 如果复制停止,则失败并显示错误(退出状态 128),而不是等待复制重新启动(默认是)
- `--force` 如果使用 alter-foreign-keys-method=none 可能会破坏外键约束,此选项将绕过确认
- `--help` 显示帮助并退出
- `--host=s, -h` 连接到主机
- `--max-flow-ctl=f` 类似于 --max-lag 但用于 PXC 集群
- `--max-lag=m` 暂停数据复制,直到所有副本的延迟小于此值(默认 1s)。可选后缀 s=秒,m=分钟,h=小时,d=天;如果没有后缀,则使用 s
- `--max-load=A` 在每个块之后检查 SHOW GLOBAL STATUS,并在任何状态变量超过其阈值时暂停(默认 Threads_running=25)
- `--new-table-name=s` 在交换前的新表名称。%T 替换为原始表名称(默认 %T_new)
- `--null-to-not-null` 允许将允许 NULL 值的列修改为不允许 NULL 值的列
- `--only-same-schema-fks` 仅检查与原始表位于同一模式的外键
- `--password=s, -p` 连接时使用的密码
- `--pause-file=s` 当指定的文件存在时,执行将暂停
- `--pid=s` 创建给定的 PID 文件
- `--plugin=s` 定义 pt_online_schema_change_plugin 类的 Perl 模块文件
- `--port=i, -P` 使用的连接端口号
- `--preserve-triggers` 保留旧触发器
- `--print` 将 SQL 语句打印到 STDOUT
- `--progress=a` 复制行时将进度报告打印到 STDERR(默认 time,30)
- `--quiet, -q` 不打印消息到 STDOUT(禁用 --progress)
- `--recurse=i` 发现副本时递归的层次数
- `--recursion-method=a` 发现副本的首选递归方法(默认 processlist,hosts)
- `--remove-data-dir` 如果原始表是使用 DATA DIRECTORY 特性创建的,则删除它,并在 MySQL 默认目录中创建新表而不创建新的 isl 文件(默认否)
- `--reverse-triggers` 警告!此选项在开始复制之前在新表上创建反向触发器
- `--set-vars=A` 在此逗号分隔的变量=值对列表中设置 MySQL 变量
- `--skip-check-slave-lag=d` 检查从库延迟时跳过的 DSN
- `--slave-password=s` 设置连接从库时使用的密码
- `--slave-user=s` 设置连接从库时使用的用户
- `--sleep=f` 复制每个块后休眠的时间(以秒为单位)(默认 0)
- `--socket=s, -S` 使用的连接套接字文件
- `--statistics` 打印内部计数器的统计信息
- `--[no]swap-tables` 交换原始表和新的修改表(默认是)
- `--tries=a` 尝试关键操作的次数
- `--user=s, -u` 登录用户(如果不是当前用户)
- `--version` 显示版本并退出
- `--[no]version-check` 检查 Percona Toolkit、MySQL 和其他程序的最新版本(默认是)

示例:

pt-online-schema-change --user=username --password=password --alter "ADD COLUMN new_col INT" D=db,t=table

23.pt-pg-summary

作用:提供PostgreSQL服务器的摘要信息。

示例:

pt-pg-summary

24.pt-pmp

作用:生成进程的MySQL性能剖析报告。

示例:

pt-pmp --pid 1234

25.pt-query-digest

作用:分析和汇总MySQL查询日志,以找出慢查询和高负载查询。

参数:

--ask-pass                   提示输入连接到MySQL时的密码
--attribute-aliases=a        属性|别名列表,默认为 db|Schema
--attribute-value-limit=i    属性值的合理限制,默认为 0
--charset=s              -A  默认字符集
--config=A                   读取此逗号分隔的配置文件列表;如果指定,必须作为命令行的第一个选项
--[no]continue-on-error      即使出现错误也继续解析,默认为 yes
--[no]create-history-table   如果不存在,则创建 --history 表,默认为 yes
--[no]create-review-table    如果不存在,则创建 --review 表,默认为 yes
--daemonize                  后台运行并从 shell 中分离出来
--database=s             -D  连接到此数据库
--defaults-file=s        -F  仅从给定文件中读取 MySQL 选项
--embedded-attributes=a      两个 Perl 正则表达式模式,用于捕获嵌入在查询中的伪属性
--expected-range=a           当条目多于或少于预期时解释条目,默认为 5,10
--explain=d                  使用此 DSN 运行对示例查询的 EXPLAIN 并打印结果
--filter=s                   丢弃此 Perl 代码返回 false 的事件
--group-by=A                 按此属性的事件分组,默认为 fingerprint
--help                       显示帮助并退出
--history=d                  保存每个查询类的指标到指定表中
--host=s                 -h  连接到此主机
--ignore-attributes=a        不聚合这些属性,默认为 arg, cmd, insert_id, ip, port, Thread_id, timestamp, exptime, flags, key, res, val, server_id, offset, end_log_pos, Xid
--inherit-attributes=a       如果丢失,则从最后一个拥有它们的事件继承这些属性,默认为 db,ts
--interval=f                 查询进程列表的轮询频率,单位为秒,默认为 0.1
--iterations=i               循环收集和报告的次数,默认为 1
--limit=A                    限制输出到给定的百分比或计数,默认为 95%:20
--log=s                      当守护程序时将所有输出打印到此文件
--max-hostname-length=i      在报告中截断主机名到此长度,0=不截断,默认为 10
--max-line-length=i          在报告中截断行到此长度,0=不截断,默认为 74
--order-by=A                 按此属性和聚合函数排序事件,默认为 Query_time:sum
--outliers=a                 按属性:百分位:计数报告异常值,默认为 Query_time:1:10
--output=s                   如何格式化和打印查询分析结果,默认为 report
--password=s             -p  连接时使用的密码
--pid=s                      创建指定的 PID 文件
--port=i                 -P  连接使用的端口号
--preserve-embedded-numbers  在指纹查询时保留数据库/表名中的数字
--processlist=d              使用此 DSN 的进程列表轮询查询,默认间隔为 sleep
--progress=a                 打印进度报告到 STDERR,默认为 time,30
--read-timeout=m             等待输入事件的时间,默认为 0,可选的后缀 s=秒,m=分钟,h=小时,d=天
--[no]report                 打印每个 --group-by 属性的查询分析报告,默认为 yes
--report-all                 报告所有查询,甚至已经审查过的
--report-format=A            打印查询分析报告的这些部分,默认为 rusage,date,hostname,files,header,profile,query_report,prepared
--report-histogram=s         绘制此属性值的分布图,默认为 Query_time
--resume=s                   如果指定,工具将上次的文件偏移量写入指定的文件名
--review=d                   保存查询类以供稍后审查,并不报告已经审查过的类
--run-time=m                 每次迭代运行的时间,默认为时钟,可选的后缀 s=秒,m=分钟,h=小时,d=天
--run-time-mode=s            设置 --run-time 操作的值,默认为 clock
--sample=i                   过滤每个查询的前 N 个事件,默认为 0
--set-vars=A                 设置这些 MySQL 变量的值,以逗号分隔的变量=值对
--show-all=H                 显示这些属性的所有值
--since=s                    解析此日期之后的查询,默认为解析自此日期起的查询
--slave-password=s           设置用于连接到从服务器的密码
--slave-user=s               设置用于连接到从服务器的用户
--socket=s               -S  使用的连接套接字文件
--timeline                   显示事件的时间线
--type=A                     解析的输入类型,默认为 slowlog
--until=s                    解析此日期之前的查询,默认为解析直到此日期的查询
--user=s                 -u  登录时使用的用户,如果不是当前用户
--variations=A               报告这些属性值的变化数量
--version                    显示版本并退出
--[no]version-check          检查 Percona Toolkit、MySQL 和其他程序的最新版本,默认为 yes
--[no]vertical-format        在报告的 SQL 查询中输出一个尾随 "G",默认为 yes
--watch-server=s             告诉 pt-query-digest 解析 tcpdump 时观察的服务器 IP 地址和端口(例如 "10.0.0.1:3306");忽略所有其他服务器
```

示例:

pt-query-digest /path/to/slow.log

26.pt-secure-collect

作用:收集和报告MySQL的安全信息。

示例:

pt-secure-collect --user=username --password=password

27.pt-show-grants

作用:显示MySQL用户的权限。

示例:

pt-show-grants --user=username --password=password

28.pt-sift

作用:收集和分析MySQL服务器的性能数据。

示例:

pt-sift --user=username --password=password

29.pt-slave-delay

作用:延迟MySQL复制以创建时间点恢复的机会。

示例:

pt-slave-delay --delay 1h --user=username --password=password

30.pt-slave-find

作用:查找MySQL复制拓扑中的所有从库。

示例:

pt-slave-find --user=username --password=password

31.pt-slave-restart

作用:监控并自动重启MySQL复制从库。

示例:

pt-slave-restart --user=username --password=password

32.pt-stalk

作用:在检测到MySQL服务器的问题时收集诊断数据。

示例:

pt-stalk --user=username --password=password

33.pt-summary

作用:提供MySQL服务器的摘要信息。

示例:

pt-summary

34.pt-table-checksum

作用:生成MySQL表的校验和以检测复制中的数据差异。

参数:

--binary-index                   修改 --create-replicate-table 行为,使复制表的上限和下限列使用 BLOB 数据类型
--channel=s                      连接到服务器时使用的复制通道名称
--[no]check-binlog-format        检查所有服务器的 binlog_format 是否相同(默认为 yes)
--[no]check-plan                 检查查询执行计划是否安全(默认为 yes)
--chunk-index=s                  首选用于分块表的索引
--chunk-index-columns=i          使用索引的左侧这么多列来分块表
--chunk-size=z                   每个校验查询选择的行数(默认为 1000)
--chunk-time=f                   动态调整分块大小,使每个校验查询执行时间为指定秒数(默认为 0.5)
--[no]create-replicate-table     如果不存在,则创建 --replicate 数据库和表(默认为 yes)
--disable-qrt-plugin             禁用 QRT(查询响应时间)插件(如果已启用)
--[no]empty-replicate-table      在对表进行校验之前删除先前的校验结果(默认为 yes)
--fail-on-stopped-replication    如果复制已停止,则报错退出(退出状态码 128),而不是等待复制重新启动
--float-precision=i              FLOAT 和 DOUBLE 数字到字符串转换的精度
--function=s                     校验和的哈希函数(FNV1A_64、MURMUR_HASH、SHA1、MD5、CRC32 等)
--pause-file=s                   当指定的文件存在时,执行将暂停
--pid=s                          创建指定的 PID 文件
--plugin=s                       定义 pt_table_checksum_plugin 类的 Perl 模块文件
--progress=a                     将进度报告打印到 STDERR(默认为 time,30)
--quiet                      -q  仅打印最重要的信息(禁用 --progress)(默认为 0)
--recurse=i                      在发现复制时递归的层级数
--recursion-method=a             发现复制时的首选递归方法(默认为 processlist,hosts)
--replicate=s                    将校验结果写入此表(默认为 percona.checksums)
--[no]replicate-check            在完成每个表后,检查复制是否存在数据差异(默认为 yes)
--replicate-check-only           仅检查复制是否一致,而不执行校验查询
--replicate-check-retries=i      当遇到差异时,重试校验比较此次数(默认为 1)
--replicate-database=s           仅使用此数据库
--resume                         从上次完成的块继续校验(禁用 --[no]empty-replicate-table)
--retries=i                      当遇到非致命错误时,重试此次数(默认为 2)
--run-time=m                     运行时间,可选的后缀 s=秒,m=分钟,h=小时,d=天;如果没有后缀,默认为 s
--separator=s                    用于 CONCAT_WS() 的分隔符字符(默认为 #)
--skip-check-slave-lag=d         跳过检查从库延迟的 DSN
--slave-password=s               设置用于连接到从库的密码
--slave-skip-tolerance=f         当一个主表标记为仅在一个块中进行校验,但从库表超过此的最大接受大小时,跳过此表(默认为 1.0)
--slave-user=s                   设置用于连接到从库的用户
--trim                           对 VARCHAR 列添加 TRIM()(在比较 4.1 和 >= 5.0 时有帮助)
--truncate-replicate-table       在开始校验之前截断复制表
--[no]version-check              检查最新版本的 Percona Toolkit、MySQL 和其他程序(默认为 yes)
--where=s                        仅执行匹配此 WHERE 子句的行

Config:
--config=A                       读取此逗号分隔的配置文件列表;如果指定,必须作为命令行的第一个选项

Connection:
--ask-pass                       连接到 MySQL 时提示输入密码
--defaults-file=s            -F  仅从给定文件中读取 MySQL 选项
--host=s                     -h  要连接的主机(默认为 localhost)
--password=s                 -p  连接时使用的密码
--port=i                     -P  连接使用的端口号
--set-vars=A                     设置这些 MySQL 变量的值,以逗号分隔的变量=值对
--socket=s                   -S  使用的连接套接字文件
--user=s                     -u  如果不是当前用户,则登录使用的用户

Filter:
--columns=a                  -c  仅校验此逗号分隔的列
--databases=h                -d  仅校验此逗号分隔的数据库
--databases-regex=s              仅校验数据库名称与此 Perl 正则表达式匹配的数据库
--engines=h                  -e  仅校验使用这些存储引擎的表
--ignore-columns=H               在计算校验和时忽略此逗号分隔的列
--ignore-databases=H             忽略此逗号分隔的数据库
--ignore-databases-regex=s       忽略名称与此 Perl 正则表达式匹配的数据库
--ignore-engines=H               忽略此逗号分隔的存储引擎(默认为 FEDERATED,MRG_MyISAM)
--ignore-tables=H                忽略此逗号分隔的表
--ignore-tables-regex=s          忽略名称与此 Perl 正则表达式匹配的表
--tables=h                   -t  仅校验此逗号分隔的表
--tables-regex=s                 仅校验名称与此 Perl 正则表达式匹配的表

示例:

pt-table-checksum --user=username --password=password

35.pt-table-sync

作用:同步MySQL表的数据,以修复复制中的数据差异。

参数:

--algorithms=s              比较表时使用的算法优先级顺序(默认为 Chunk,Nibble,GroupBy,Stream)
--ask-pass                  连接到 MySQL 时提示输入密码
--bidirectional             启用第一个和后续主机之间的双向同步
--[no]bin-log               记录到二进制日志(SET SQL_LOG_BIN=1)(默认为 yes)
--buffer-in-mysql           指示 MySQL 在其内存中缓冲查询
--[no]buffer-to-client      在比较时逐行从 MySQL 获取行(默认为 yes)
--channel=s                 连接到使用复制通道的服务器时的通道名称
--charset=s             -A  默认字符集
--[no]check-child-tables    检查 --execute 是否会对子表产生不利影响(默认为 yes)
--[no]check-master          使用 --sync-to-master 时,尝试验证检测到的主服务器是否真正是主服务器(默认为 yes)
--[no]check-slave           检查目标服务器是否为从服务器(默认为 yes)
--[no]check-triggers        检查目标表上是否定义了触发器(默认为 yes)
--chunk-column=s            使用此列对表进行分块
--chunk-index=s             使用此索引对表进行分块
--chunk-size=s              每个分块的行数或数据大小(默认为 1000)
--columns=a             -c  仅比较此逗号分隔的列
--config=A                  读取此逗号分隔的配置文件列表;如果指定,必须作为命令行的第一个选项
--conflict-column=s         在双向同步期间,当行冲突时比较此列
--conflict-comparison=s     选择具有此属性的 --conflict-column 作为源
--conflict-error=s          如何报告无法解决的冲突和冲突错误(默认为 warn)
--conflict-threshold=s      一个 --conflict-column 必须超过另一个的量
--conflict-value=s          对于某些 --conflict-comparison,使用此值
--databases=h           -d  仅同步此逗号分隔的数据库
--defaults-file=s       -F  仅从给定文件中读取 MySQL 选项
--dry-run                   分析,确定要使用的同步算法,打印并退出
--engines=h             -e  仅同步使用此逗号分隔的存储引擎的表
--execute                   执行查询以使表具有相同的数据
--explain-hosts             打印连接信息并退出
--float-precision=i         FLOAT 和 DOUBLE 数字到字符串转换的精度
--[no]foreign-key-checks    启用外键检查(SET FOREIGN_KEY_CHECKS=1)(默认为 yes)
--function=s                用于校验和的哈希函数
--help                      显示帮助信息并退出
--[no]hex-blob              HEX() BLOB、TEXT 和 BINARY 列(默认为 yes)
--host=s               -h  要连接的主机
--ignore-columns=H          在比较中忽略此逗号分隔的列名
--ignore-databases=H        忽略此逗号分隔的数据库
--ignore-engines=H          忽略此逗号分隔的存储引擎(默认为 FEDERATED,MRG_MyISAM)
--ignore-tables=H           忽略此逗号分隔的表
--[no]index-hint            在分块和行查询中添加 FORCE/USE INDEX 提示(默认为 yes)
--lock=i                    锁定表:0=无,1=每个同步周期,2=每个表,3=全局
--lock-and-rename           锁定源和目标表,同步后交换名称
--password=s            -p  连接时使用的密码
--pid=s                     创建指定的 PID 文件
--port=i                -P  连接使用的端口号
--print                     打印解决差异的查询
--recursion-method=a        用于查找从服务器的首选递归方法(默认为 processlist,hosts)
--replace                   将所有 INSERT 和 UPDATE 语句写为 REPLACE
--replicate=s               同步在此表中列出为不同的表
--set-vars=A                设置此逗号分隔的变量=值对的 MySQL 变量
--slave-password=s          设置用于连接到从服务器的密码
--slave-user=s              设置用于连接到从服务器的用户
--socket=s             -S  使用的连接套接字文件
--sync-to-master            将 DSN 视为从服务器,并将其同步到其主服务器
--tables=h             -t  仅同步此逗号分隔的表
--timeout-ok                如果 --wait 失败,则继续
--[no]transaction           使用事务而不是 LOCK TABLES
--trim                      在 BIT_XOR 和 ACCUM 模式下 TRIM() VARCHAR 列
--[no]unique-checks         启用唯一键检查(SET UNIQUE_CHECKS=1)(默认为 yes)
--user=s               -u  如果不是当前用户,则登录使用的用户
--verbose               -v  打印同步操作的结果
--version                   显示版本信息并退出
--[no]version-check         检查最新版本的 Percona Toolkit、MySQL 和其他程序(默认为 yes)
--wait=m               -w  等待从服务器追上它们的主服务器的时间。可选的后缀 s=秒,m=分钟,h=小时,d=天;如果没有后缀,默认为 s
--where=s                   WHERE 子句,用于将同步限制为表的一部分
--[no]zero-chunk            添加一个用于具有零或等效于零值的行的分块(默认为 yes)

示例:

pt-table-sync --user=username --password=password

36.pt-table-usage

作用:分析MySQL查询日志以报告表的使用情况。

示例:

pt-table-usage --user=username --password=password slow.log

37.pt-upgrade

作用:分析MySQL查询日志以检测升级到新版本后的潜在问题。

示例:

pt-upgrade --user=username --password=password /path/to/slow.log

38.pt-variable-advisor

作用:检查MySQL服务器的变量设置,并给出优化建议。

示例:

pt-variable-advisor --user=username --password=password

39.pt-visual-explain

作用:生成MySQL查询计划的可视化解释。

示例:

pt-visual-explain "SELECT * FROM users WHERE id = 1"

注意事项

  • 安全性:使用工具时需谨慎,避免对生产环境造成负面影响。
  • 版本兼容性:确保工具版本与MySQL版本兼容。
  • 配置文件:使用配置文件能够方便地管理和调整参数。

总结

Percona Toolkit工具集是管理和优化MySQL和MariaDB数据库的强大工具,能够帮助数据库管理员和开发人员提升工作效率,优化数据库性能,确保数据的完整性和一致性。通过本文的介绍和解析,相信你能更全面地理解和应用这些工具,从而更好地管理和维护数据库系统。

作者介绍

吴守阳,51CTO社区编辑,拥有8年DBA工作经验,熟练管理MySQL、Redis、MongoDB等开源数据库。精通性能优化、备份恢复和高可用性架构设计。善于故障排除和自动化运维,保障系统稳定可靠。具备良好的团队合作和沟通能力,致力于为企业提供高效可靠的数据库解决方案。