深度解析Percona Toolkit工具集
![](http://www.pozzm.com/caiji/data/images/2024-05-29/2bdd1617fa53f7de18883edffa1b2ac8.jpg)
作者 | 吴守阳
审校 | 重楼
介绍
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等开源数据库。精通性能优化、备份恢复和高可用性架构设计。善于故障排除和自动化运维,保障系统稳定可靠。具备良好的团队合作和沟通能力,致力于为企业提供高效可靠的数据库解决方案。