全文约定:
$
为命令提示符、greatsql>
为GreatSQL数据库提示符。在后续阅读中,依据此约定进行理解与操作
实用类
在Percona Toolkit中实用类共有以下工具
-
pt-align
:将其它工具输出内容与列对齐 -
pt-archiver
:将表中的行存档到另一个表或文件中 -
pt-find
:查找表并执行命令 -
pt-fingerprint
:将查询转成密文 -
pt-kill
:Kill掉符合条件的SQL -
pt-k8s-debug-collector
:从 k8s/OpenShift 集群收集调试数据(日志、资源状态等) -
pt-secure-collect
:收集、清理、打包和加密数据
pt-align
概要
通过读取行并将其分成单词的方式来执行列对齐。该工具首先计算每行包含的单词数量,并尝试确定是否有一个占主导地位的数字,将其假设为每行的单词数量。接下来,pt-align
会排除所有不符合该数量的行,并将下一行视为第一个非标题行。根据每个单词是否看起来像数字,它会决定列的对齐方式。最后,工具会遍历数据集,确定每列的宽度,并将它们格式化打印出来。
这对于调整vmstat或iostat的输出非常有帮助,使其更易于阅读。
用法
将其它工具的输出与列对齐,如果未指定FILES(文件)则读取STDIN(输入)
- pt-align [FILES]
如果工具打印以下输出(没有对齐)
DATABASE TABLE ROWS
foo bar 100
long_db_name table 1
another long_name 500
使用 pt-align 将输出重新打印为(有对齐)
DATABASE TABLE ROWS
foo bar 100
long_db_name table 1
another long_name 500
选项
该工具的命令行参数如下
| 参数 | 含义 |
|---|---|
| –help | 帮助,显示帮助并退出 |
| –version | 版本,显示版本并推出 |
最佳实践
对齐vmstat
当查看 vmstat 时,有时会遇到列对齐不整齐的情况。此时,可以使用 pt-align 工具来解决这个问题
# 未使用pt-align工具
$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 205472 181304 60 948960 0 0 0 1 1 1 1 2 98 0 0
# 使用pt-align工具
$ vmstat | pt-align
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 205472 181260 60 948992 0 0 0 1 1 1 1 2 98 0 0
对齐iostat
当查看 iostat 时,有时会遇到列对齐不整齐的情况。此时,可以使用 pt-align 工具来解决这个问题
# 未使用pt-align工具
$ iostat
avg-cpu: %user %nice %system %iowait %steal %idle
0.86 0.00 1.51 0.00 0.00 97.62
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 0.11 0.33 1.31 6746368 27046909
dm-0 0.09 0.30 1.23 6263958 25261569
dm-1 0.03 0.02 0.09 452072 1782864
# 使用pt-align工具
$ iostat | pt-align
0.86 0.00 1.51 0.00 0.00 97.62
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 0.11 0.33 1.31 6746368 27049993
dm-0 0.09 0.30 1.23 6263958 25264653
dm-1 0.03 0.02 0.09 452072 1782864
pt-archiver
将MySQL/GreatSQL表中的行存档到另一个表或文件中
概要
pt-archiver 是一款在线归档工具,不会影响生产,但是用此命令操作的表必须要有主键,它可以实现如下功能:
- 归档历史数据
- 在线删除大量数据
- 数据导出和备份
- 数据远程归档
- 数据清理
用法
- pt-archiver [OPTIONS] –source DSN –where WHERE
将表从oltp实例归档到olap的实例中
$ pt-archiver --source h=oltp_server,D=test,t=tbl --dest h=olap_server --file '/var/log/archive/%Y-%m-%d-%D.%t' --where "1=1" --limit 1000 --commit-each
从子表删除孤立行
$ pt-archiver --source h=host,D=db,t=child --purge --where 'NOT EXISTS(SELECT * FROM parent WHERE col=child.col)'
选项
-
至少指定
--dest
、--file
或--purge
之一 -
如果 COPY 为 yes,
--dest
中的 DSN 值默认为--source
中的值
部分参数选项存在互斥,不可同时存在,详见:
| 选项A | 选项B | 关系 |
|---|---|---|
| –ignore | –replace | 互斥 |
| –txn-size | –commit-each | 互斥 |
| –low-priority-insert | –delayed-insert | 互斥 |
| –share-lock | –for-update | 互斥 |
| –analyze | –optimize | 互斥 |
| –no-ascend | –no-delete | 互斥 |
所有参数选项如下:
| 参数 | 含义 |
|---|---|
| –analyze | 为d则在dest上使用analyze,为s则在source上使用analyze,ds则表示两者都执行 |
| –ascend-first | 仅升序第一个索引列 |
| –ask-pass | 连接 MySQL/GreatSQL 时提示输入密码 |
| –buffer | 指定file时,仅在事务提交的时候刷新到磁盘 |
| –bulk-delete | 批量删除 |
| –[no]bulk-delete-limit | 是否开启批量删除限制,delete … limit |
| –bulk-insert | 通过LOAD DATA批量插入 |
| –channel | 指定复制通道 |
| –charset | 字符集 |
| –[no]check-charset | 是否检查字符集,默认检查 |
| –[no]check-columns | 检查列,确保 –source 和 –dest 具有相同的列 |
| –check-interval | 定义归档每次暂停多长时间 |
| –check-slave-lag | 暂停归档,直到此副本的滞后小于–max-lag |
| –columns | 归档指定的字段,逗号分隔 |
| –commit-each | 提交每组获取和归档的行,与–limit配合使用 |
| –config | 读取这个逗号分隔的配置文件列表,如果指定,这必须是命令行上的第一个选项 |
| –database | 连接到该数据库 |
| –delayed-insert | 将 DELAYED 修饰符添加到 INSERT 或 REPLACE 语句,低优先级插入。 不过此参数在5.6版本弃用,8.0版本不支持,服务器识别但忽略DELAYED关键字 |
| –dest | 此项指定一个表。pt-archiver 将插入从 –source 归档的行。 它使用与 –source 相同的 key=val 参数格式。 大多数缺失值默认为与 –source 相同的值,因此您不必重复 –source 和 –dest 中相同的选项。 使用 –help 选项查看从 –source 复制了哪些值。 |
| –dry-run | 打印查询并退出而不执行任何操作 |
| –file | 要存档到的文件,%D Database name;%t Table name,时间的格式化如例子中所描述,与–output-format结合使用可以指定输出的内容是dump(使用制表符作为分隔符)还是csv(使用逗号作为分隔符),与–header配合使用指定是否打印字段名字在第一行 |
| –for-update | 指定加读锁还是写锁。将 FOR UPDATE 修饰符添加到 SELECT 语句。与–share-lock互斥。 |
| –header | 在–file顶部打印列标题 |
| –help | 显示帮助 |
| –high-priority-select | 将 HIGH_PRIORITY 修饰符添加到 SELECT 语句。只适用表级别存储引擎(MyISAM、MEMORY等) |
| –host | 连接到主机 |
| –ignore | 忽略在执行INSERT时出现的可忽略错误。与–replace互斥 |
| –limit | 每个语句要获取和归档的行数。默认为一行 |
| –local | 不要将 OPTIMIZE 或 ANALYZE 查询写入 binlog |
| –low-priority-delete | 将 LOW_PRIORITY 修饰符添加到 DELETE 语句。此时会延迟执行该 DELETE 直到没有其他客户端从表中读取数据为止。只适用表级别存储引擎(MyISAM、MEMORY等) |
| –low-priority-insert | 低优先级插入。只适用表级别存储引擎(MyISAM、MEMORY等) |
| –max-flow-ctl | 用于pxc集群的类max-lag参数 |
| –max-lag | 暂停校验和,直到所有副本的滞后小于此值 |
| –no-ascend | 不使用升序索引优化。和no-delete互斥 |
| –no-delete | 不删除数据。和no-ascend互斥 |
| –optimize | 表示执行optimize,使用方式与analyze一致。和analyze互斥 |
| –output-format | 与–file一起使用指定输出格式 |
| –password | 连接时使用的密码 |
| –pid | 创建给定的 PID 文件。如果 PID 文件已存在且其中包含的 PID 与当前 PID 不同,则该工具将不会启动。但是,如果 PID 文件存在并且其中包含的 PID 不再运行,则该工具将使用当前 PID 覆盖 PID 文件。工具退出时,PID 文件会自动删除 |
| –plugin | 用作通用插件的 Perl 模块名称 |
| –port | 用于连接的端口号 |
| –primary-key-only | 仅主键列。使用主键列指定–columns的快捷方式 |
| –progress | 指定多少行打印一次进度信息 |
| –purge | 只清除,不归档。最好配合 –primary-key-only 指定表的主键列。这将防止无缘无故地从服务器获取所有列。 |
| –quick-delete | 给DELETE加quick修饰符。使用 QUICK 修饰符时,存储引擎不会合并索引叶子节点,从而提高删除操作的速度。只适用表级别存储引擎(MyISAM、MEMORY等) |
| –quiet | 不输出任何信息,包括statistics信息 |
| –replace | 导致–dest中的 INSERT 被写入 REPLACE。与–ignore互斥 |
| –retries | 遇到超时或死锁的重试次数 |
| –run-time | 指定运行时间,s=seconds, m=minutes, h=hours, d=days; 如果不指定用的是s |
| –[no]safe-auto-increment | 不要归档具有最大 AUTO_INCRMENT 的行 |
| –sentinel | 默认文件是/tmp/pt-archiver-sentinel,该文件存在则退出归档 |
| –slave-user | 从库用户 |
| –slave-password | 从库密码 |
| –set-vars | 设置执行时的MySQL/GreatSQL参数 |
| –share-lock | 指定加读锁还是写锁。将 LOCK IN SHARE MODE 修饰符添加到 SELECT 语句。与–for-update互斥 |
| –skip-foreign-key-checks | 使用 SET FOREIGN_KEY_CHECKS=0 禁用外键检查 |
| –sleep | 两次提取中间的休眠时间,默认不休眠 |
| –sleep-coef | 指定sleep时间为最后一次 SELECT 时间的多少倍 |
| –socket | 用于连接的套接字文件 |
| –source | 对于制动归档的表,选项“i”用于指定索引,默认情况下使用主键。选项“a”和“b”可用于调整语句通过二进制日志的流向。使用“b”选项会禁用指定连接上的二进制日志记录。若选择“a”选项,则连接将使用指定的数据库,可通过此方式防止二进制日志事件在服务器上执行时使用 –replicate-ignore-db 选项。这两个选项提供了实现相同目标的不同方法,即将数据从主服务器归档,同时在从服务器上保留它。可以在主服务器上运行清理作业,并通过所选方式防止其在从服务器上执行。 |
| –statistics | 收集和打印时间统计数据 |
| –stop | 通过创建sentine文件来停止归档 |
| –txn-size | 指定每次事务提交的行数。与commit-each互斥 |
| –unstop | 删除sentine文件 |
| –user | 登录的用户 |
| –version | 显示版本号 |
| –[no]version-check | 自动检查更新功能,默认是检查的 |
| –where | 指定 WHERE 子句限制归档哪些行。如果不需要 WHERE 条件,可使用 WHERE 1=1 |
| –why-quit | 打印退出原因 |
最佳实践
创建一张archiver_test表,并生成1000条数据
greatsql> CREATE TABLE archiver_test (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255),
age INT,
gender VARCHAR(10),
timestamp TIMESTAMP
);
greatsql> select count(*) from archiver_test;
+----------+
| count(*) |
+----------+
| 1000 |
+----------+
1 row in set (0.01 sec)
在使用过程中可能会需要依赖例如:Cannot connect to MySQL because the Perl DBD::mysql module is not installed or not found.
此时按提示安装相应依赖包即可
归档到同一实例上的不同表
注意!此操作会删除源表数据,若不删除源表数据请加上使用
--no-delete
$ pt-archiver --source h=localhost,P=3306,u=root,D=test_db,t=archiver_test -- --ask-pass --dest h=localhost,P=3306,u=root,D=test_db,t=archiver_test2 --ask-pass --where "id


