Percona Toolkit 神器全攻略(实用类)

news2024/11/17 14:59:12

Percona Toolkit 神器全攻略(实用类)

file

Percona Toolkit 神器全攻略系列共八篇,前文回顾:

前文回顾
Percona Toolkit 神器全攻略

全文约定:$为命令提示符、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 --charset=utf8mb4  --ask-pass --dest h=localhost,P=3306,u=root,D=test_db,t=archiver_test2 --ask-pass --where "id<100" --limit 1000 --commit-each
# 会让你输入密码(源端)
# 会让你输入密码(目标端)

伪代码如下

pt-archiver --source h=源ip,P=源端口,u=用户,p=密码,D=库名,t=表名 --ask-pass --dest h=目标IP,P=端口,u=用户,p=密码,D=库名,t=表名 --ask-pass --where "id<100" --limit 1000 --commit-each

需要目标表已创建且字段一致,否则报错:"Table 'test_db.archiver_test2' doesn't exist "

字段不一致报错:”The following columns exist in --dest but not --source: name2“

检查下是否已经归档成功

greatsql> select count(*) from archiver_test2;
+----------+
| count(*) |
+----------+
|       99 |
+----------+
1 row in set (0.00 sec)

因为--dest会从--source继承相同的值,所以上面也可以改写成以下方式

$ pt-archiver --source h=localhost,P=3306,u=root,D=test_db,t=archiver_test --charset=utf8mb4  --ask-pass --dest t=archiver_test2 --where "id<100" --limit 1000 --commit-each

也可用Socket来进行登录,如果使用单机多实例部署GreatSQL的时候采用这种方法要尤其注意选择对应Socket

$ pt-archiver --source u=root,D=test_db,t=archiver_test -S /data/MySQL/GreatSQL.sock  --charset=utf8mb4 --dest t=archiver_test2  --where "id<100" --limit 1000 --commit-each

也可以通过 my.cnf 配置文件读取用户名和密码,但是在 my.cnf 文件中需要配置好用户名和密码

$ vim /etc/my.cnf
[client]
user=your_user_name
pass=sectet

$ pt-archiver --source F=/etc/my.cnf,u=root,D=test_db,t=archiver_test --charset=utf8mb4 --dest t=archiver_test2  --where "id<100" --limit 1000 --commit-each
归档时不写入Binlog

添加b=true指定归档操作不写入Binlog中

$ pt-archiver --source b=true,h=localhost,P=3306,u=root,D=test_db,t=archiver_test --charset=utf8mb4  --ask-pass --dest b=true,t=archiver_test3  --where "id<100" --limit 1000 --commit-each
归档到文件

导出到外部文件,且不删除源端表的数据

$ pt-archiver --source h=localhost,D=test_db,t=archiver_test,u=root --where '1=1' --no-check-charset --no-delete --file="/data/bk/archiver_test.dat"

因文件没有utf8mb4编码,所以设置了no-check-charset不检查字符集

检查备份情况

$ tail -n 3 /data/bk/archiver_test.dat
997     Fukuda Akina    449     F       2022-02-15 05:54:27
998     Sara Nguyen     45      F       2018-07-08 13:35:45
999     Chan Ka Man     644     M       2012-02-08 18:18:14

pt-find

概要

此工具可以查找符合条件的表,并做一些相应的操作。默认操作是打印数据库和表名称

用法

  • pt-find [OPTIONS] [DATABASES]

选项

参数含义
--ask-pass连接 MySQL/GreatSQL 时提示输入密码
--case-insensitive指定所有正则表达式搜索不区分大小写
--charset默认字符集
--config读取这个逗号分隔的配置文件列表,如果指定,这必须是命令行上的第一个选项
--database连接到该数据库
--day-start从今天开始而不是从当前时间开始测量时间
--defaults-file只从给定文件中读取 MySQL/GreatSQL 选项
--help显示帮助
--host连接到主机
--or用 OR(而不是 AND)组合测试
--password连接时使用的密码
--pid创建给定的 PID 文件
--port用于连接的端口号
--[no]quote使用 MySQL/GreatSQL 的标准反引号字符引用 MySQL/GreatSQL 标识符名称
--set-vars在这个以逗号分隔的 variable=value 对列表中设置 MySQL/GreatSQL 变量
--socket用于连接的套接字文件
--user登录的用户
--version显示版本
--[no]version-check版本检查

最佳实践

查找大于1G的表
$ pt-find --socket=/data/GreatSQL/mysql.sock --user=root --port=3306 --tablesize +1G
`tpch`.`customer`
`tpch`.`lineitem`
`tpch`.`orders`
`tpch`.`part`
`tpch`.`partsupp`
查找修改过的表
# 30分钟之内
$ pt-find --socket=/data/GreatSQL/mysql.sock --user=root --port=3306 --mmin -30
`mysql`.`gtid_executed`
`test_db`.`archiver_test`

# 30分钟之前
$ pt-find --socket=/data/GreatSQL/mysql.sock --user=root --port=3306 --mmin +30
`aptest`.`sys_dept`
`aptest`.`sys_user`

此查找基于INFORMATION_SCHEMA.TABLES表中的Update_time列,如果information_schema_stats_expiry设置的更新时间过长,将导致Update_time列不会实时更新。因此,在这种情况下,将无法准确地检索在过去30分钟内发生修改的表。

查找无数据的表
$ pt-find --socket=/data/GreatSQL/mysql.sock --user=root --port=3306 --empty
`db2`.`t1`
`db2`.`t2`
查找表并修改存储引擎
# 查找1天内创建的MyISAM表
$ pt-find --socket=/data/GreatSQL/mysql.sock --user=root --port=3306 --ctime -1 --engine MyISAM
`test_db`.`myisam`

# 查找1天内的MyISAM表并修改为InnoDB
$ pt-find --socket=/data/GreatSQL/mysql.sock --user=root --port=3306 --ctime -1 --engine MyISAM --exec "ALTER TABLE %D.%N ENGINE=InnoDB"

# 验证下是否修改成功,此时可以用到上述的pt-align工具使输出更加美观
$ mysql -e "SHOW TABLE STATUS FROM test_db" | pt-align | grep your_table_name
myisam InnoDB ......

# 查找1天前的InnoDB表
$ pt-find --socket=/data/GreatSQL/mysql.sock --user=root --port=3306 --ctime +1 --engine InnoDB

InnoDBMyISAM两个存储引擎名字必须按照标准输入,否则将无法进行正确的查找

查找空表并删除
# 避免不必要的删除错误,先查找哪些是空表,在删除
$ pt-find --socket=/data/GreatSQL/mysql.sock --empty test_db
`test_db`.`archiver_test3`

# 查找test_db库中空表并删除
$ pt-find --socket=/data/GreatSQL/mysql.sock --empty test_db --exec-plus "DROP TABLE %s"

验证是否删除成功

greatsql> SHOW TABLES IN test_db LIKE 'archiver_test3';
Empty set (0.00 sec)
所有表数据和索引总大小排序
$ pt-find --socket=/data/GreatSQL/mysql.sock --printf "%T\t%D.%N\n" | sort -rn
7992197120      `tpch`.`orders`
7817084928      `tpch`.`lineitem`
......

# 输出有些没对齐,可以使用pt-align工具对齐
$ pt-find --socket=/data/GreatSQL/mysql.sock --printf "%T\t%D.%N\n" | sort -rn | pt-align
7992197120 `tpch`.`orders`                                                            
7817084928 `tpch`.`lineitem`
......

pt-fingerprint

将查询转成密文

概要

此工具可以将SQL语句重新格式化为另一种抽象形式,既所有具体值都以?代替。可以适用于数据脱敏的场景。

用法

  • pt-fingerprint [OPTIONS] [FILES]

选项

参数含义
--config读取这个逗号分隔的配置文件列表,如果指定,这必须是命令行上的第一个选项
--help显示帮助并退出
--match-embedded-numbers匹配单词中嵌入的数字并替换为单个值
--match-md5-checksums匹配 MD5 校验和并替换为单个值
--query要转换为加密的查询
--version显示版本并退出

最佳实践

替换单个语句
$ pt-fingerprint --query "select a, b, c from users where id = 5 and greatsql = 666"
select a, b, c from users where id = ? and greatsql = ?

$ pt-fingerprint --query "INSERT INTO product(ID,NAME,PRICE) VALUES(1,'greatsql',666)"
insert into product(id,name,price) values(?+)

如果SQL语句中字段名或表名有数字,也会被替换

$ pt-fingerprint --query "select a1, b2, c3 from users4 where id = 500 and greatsql = 8032"
select a?, ?, c? from users? where id = ? and greatsql = ?

若不想替换字段名或表名可加上--match-embedded-numbers

$ pt-fingerprint --match-embedded-numbers --query "select a1, b2, c3 from users4 where id = 5 and greatsql = 666"
select a1, b2, c3 from users4 where id = ? and greatsql = ?

--match-md5-checksums参数使用也是同理,避免MD5值被替换

替换文件中语句

创建文件pt_fingerprint_test_sql.txt

$ vim pt_fingerprint_test_sql.txt
select a from users where greatsql = 666;
select b from users where greatsql = 777;
select c from users where 
greatsql = 888;

替换文件中的所有SQL语句

$ pt-fingerprint pt_fingerprint_test_sql.txt
select a from users where greatsql = ?
select b from users where greatsql = ?
select c from users where greatsql = ?

不管文件内格式如何,pt-fingerprint工具都会规范化空格等

当然也可以用作替换慢日志(Slow.log)的SQL内容

pt-kill

Kill掉符合条件的SQL

概要

pt-kill可以Kill掉任何语句,特别出现大量的阻塞,死锁,或某个有问题的SQL导致MySQL/GreatSQL负载很高的情况。会默认过滤掉复制线程。

用法

  • pt-kill [OPTIONS] [DSN]

选项

至少指定 --kill--kill-query--print--execute-command--stop 之一

部分参数选项存在互斥,不可同时存在,详见:

选项A选项B关系
--any-busy-time--each-busy-time互斥
--kill--kill-query互斥
--daemonize--test-matching互斥

所有参数选项如下:

选项含义
--ask-pass连接 MySQL/GreatSQL 时提示输入密码
--charset默认字符集
--config读取这个逗号分隔的配置文件列表,如果指定,这必须是命令行上的第一个选项
--create-log-table如果--log-dsn表不存在,则创建
--daemonize放在后台以守护进程的形式运行
--database用于连接的数据库
--defaults-file只从给定文件中读取 MySQL/GreatSQL 选项
--filter丢弃此 Perl 代码不返回 true 的事件
--group-by将匹配应用于由此 SHOW PROCESSLIST 列分组的每一类查询
--help显示帮助并退出
--host连接到主机
--interval检查要终止的查询的频率
--log守护进程时将所有输出打印到此文件
--log-dsn将终止的每个查询存储在此 DSN 中
--json将终止的查询打印为 JSON,必须与--print一起使用。
--json-fields使用--json时指定要包含在 JSON 输出中的附加键
--password连接时使用的密码
--pid创建给定的 PID 文件
--port用于连接的端口号
--query-id打印刚刚被终止的查询的 ID
--rds表示相关实例位于 Amazon RDS 上
--run-time退出前要运行多长时间
--sentinel如果该文件存在则退出
--slave-user设置用于连接从机的用户
--slave-password设置用于连接从机的密码
--set-vars在这个以逗号分隔的variable=value对列表中设置 MySQL/GreatSQL 变量
--socket用于连接的套接字文件
--stop使 pt-kill 创建 --sentinel 指定的哨兵文件并退出
--[no]strip-comments从 PROCESSLIST 的 Info 列中的查询中删除 SQL 注释
--user登录的用户
--version显示版本并退出
--[no]version-check版本检查
--victims每个类中的哪些匹配查询将被终止
--wait-after-kill杀死一个查询后等待,然后再寻找更多要杀死的查询
--wait-before-kill在终止查询之前等待

最佳实践

Kill查询指定时间的连接

每十秒钟记录一下用时超过三十秒的查询语句,并且将这些语句输出到/data/pt_slow.log文件中

$ pt-kill --user=root --ask-pass --match-info "select|SELECT" --match-command='Query' --busy-time 30 --victims all --interval 10 --daemonize --print --log=/data/pt_slow.log
  • --match-command:匹配当前连接的命令,对应 SHOW PROCESSLIST 捕获的 Command 对应值(可选值:Query、Sleep、Binlog Dump、Connect、Delayed insert、Execute、Fetch、Init DB、Kill、Prepare、Processlist、Quit、Reset stmt、Table Dump);

  • --match-info:正则匹配正则运行的 SQL,区分大小写;

  • --interval:多久运行一次。默认单位秒。默认值30秒

也可以加上--kill直接Kill掉符合条件的查询语句

$ pt-kill --user=root --ask-pass --match-info "select|SELECT" --match-command='Query' --busy-time 30 --victims all --interval 10 --daemonize --kill --log=/data/pt_slow.log

--victims默认是oldest只Kill最先发起,存在时间最长的查询。all Kill掉所有满足的线程。all-but-oldest只保留最长的不Kill其它都Kill掉

Kill指定IP的会话

打印出指定IP的会话

$ pt-kill --user=root --ask-pass --match-db='test_db' --match-host "192.168.6.55" --busy-time 30 --victims all --interval 10 --daemonize --print --log=/data/pt_ip.log

Kill指定IP的会话

$ pt-kill --user=root --ask-pass --match-db='test_db' --match-host "192.168.6.55" --busy-time 30 --victims all --interval 10 --daemonize --kill --log=/data/pt_ip.log
Kill指定用户的会话

Kill指定用户的会话

$ pt-kill --user=root --ask-pass --match-db='test_db' --match-user "greatsql" --victims all --interval 10 --daemonize --kill --log=/data/pt_user.log

Kill指定用户大于10秒的空闲链接

$ pt-kill --user=root --ask-pass --match-db='db_name' --match-user "greatsql" --victims all --interval 10 --daemonize --kill --match-command='Sleep' --idle-time 10 --log=/data/pt_user.log

pt-kill工具会挂在后台定时Kill符合条件的用户、语句。

若需要停止请使用kill -9 $(ps -ef| grep pt-kill |grep -v grep |awk '{print $2}')

pt-secure-collect

概要

pt-secure-collect用于收集、清理、打包和加密数据

用法

  • pt-secure-collect [ ] [ ...]

默认情况下,pt-secure-collect 将收集以下输出:

  • pt-stalk
  • pt-summary
  • pt-mysql-summary

采集命令

  • pt-secure-collect collect

解密命令

  • pt-secure-collect decrypt

加密命令

  • pt-secure-collect encrypt

清理命令

  • pt-secure-collect sanitize

选项

最佳实践

收集GreatSQL信息

以非加密方式收集GreatSQL信息并且不删除临时文件

$ pt-secure-collect collect --mysql-user=root --mysql-password="" --mysql-port=3306 --mysql-host=localhost --bin-dir=/usr/bin --temp-dir=/data/data_collection --no-encrypt --no-remove-temp-files

INFO[2024-03-11 17:05:02] Creating temporary directory: /data/data_collection 
INFO[2024-03-11 17:05:02] Temp directory is "/data/data_collection"    
INFO[2024-03-11 17:05:02] Creating output file "/data/data_collection/pt-stalk_2024-03-11_17_05_02.out" 
INFO[2024-03-11 17:05:02] Running pt-stalk --no-stalk --iterations=2 --sleep=30 --host=localhost --dest=/data/data_collection --port=3306 --user=root --password=******** 
INFO[2024-03-11 17:06:35] Creating output file "/data/data_collection/pt-summary_2024-03-11_17_06_35.out" 
INFO[2024-03-11 17:06:35] Running pt-summary                           
INFO[2024-03-11 17:06:36] Creating output file "/data/data_collection/pt-mysql-summary_2024-03-11_17_06_36.out" 
INFO[2024-03-11 17:06:36] Running pt-mysql-summary --host=localhost --port=3306 --user=root --password=******** 
INFO[2024-03-11 17:06:49] Sanitizing output collected data             
INFO[2024-03-11 17:06:57] Creating tar file "/data/data_collection/data_collection.tar.gz" 

--mysql-port--mysql-host虽有默认值但是还是需要指定,否则在调用运行其它工具时会报错

可以从输出上看到,pt-secure-collect工具调用了pt-stalkpt-summarypt-mysql-summary这三款工具

进入data_collection文件夹即可看到所有的临时文件,以及一个data_collection.tar.gz压缩文件

$ ls /data/data_collection
2024_03_11_17_05_03-df              2024_03_11_17_05_03-opentables2            2024_03_11_17_05_33-diskstats       2024_03_11_17_05_33-processlist
2024_03_11_17_05_03-disk-space      2024_03_11_17_05_03-output                 2024_03_11_17_05_33-dmesg           data_collection.tar.gz   .......其余省略
加密文件
pt-secure-collect encrypt /data/pt_secure_collect.txt --outfile=/data/pt_secure_collect.aes
Encryption password:  # 这里输入加密密码
Re type password:     # 再次输入加密密码
INFO[2024-03-12 09:36:39] Encrypting file "/data/pt_secure_collect.txt" into "/data/pt_secure_collect.aes"  # 加密成功

加密成功后此时会生成一个后缀为aes的文件,直接查看会乱码

$ ls
pt_secure_collect.aes pt_secure_collect.txt

$ cat pt_secure_collect.aes
5�66~x�y��+�    ?i`��pESϡ>()�g�,�e�u #乱码
解密文件
$ pt-secure-collect decrypt /data/pt_secure_collect.aes
Encryption password: # 输入加密的密码
INFO[2024-03-12 09:41:35] Decrypting file "/data/pt_secure_collect.aes" into "pt_secure_collect" 

$ cat pt_secure_collect
111
aaa
select * from test where id =2;

假设输入错误密码,不会提示密码错误,而是输出乱码结果

$ pt-secure-collect decrypt /data/pt_secure_collect.aes
Encryption password:  # 这里假设输入错误密码
INFO[2024-03-12 09:44:45] Decrypting file "/data/pt_secure_collect.aes" into "pt_secure_collect" 

$ cat pt_secure_collect
;       �}X����#z1�e��s�/��E���OeB�6��,��       �# 
加密文件

这个功能和上面介绍的pt-fingerprint工具有点类似,都是使用?替换关键信息

先造一个文本

$ cat pt_secure_collect.txt
select * from test where id =2;
ip = 192.168.6.66

使用sanitize功能,会隐去关键信息和主机名

$ pt-secure-collect sanitize --input-file=/data/pt_secure_collect.txt --no-sanitize-queries
select * from test where id =?;
ip = hostname

如果不隐去主机可以使用--no-sanitize-hostnames

如果不隐去查询可以使用--no-sanitize-queries

本文完 :) 下章节将介绍Percona Toolkit 神器全攻略(配置类)


Enjoy GreatSQL :)

关于 GreatSQL

GreatSQL是适用于金融级应用的国内自主开源数据库,具备高性能、高可靠、高易用性、高安全等多个核心特性,可以作为MySQL或Percona Server的可选替换,用于线上生产环境,且完全免费并兼容MySQL或Percona Server。

相关链接: GreatSQL社区 Gitee GitHub Bilibili

GreatSQL社区:

image

社区有奖建议反馈: https://greatsql.cn/thread-54-1-1.html

社区博客有奖征稿详情: https://greatsql.cn/thread-100-1-1.html

(对文章有疑问或者有独到见解都可以去社区官网提出或分享哦~)

技术交流群:

微信&QQ群:

QQ群:533341697

微信群:添加GreatSQL社区助手(微信号:wanlidbc )好友,待社区助手拉您进群。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1712346.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[排序算法]4. 图解堆排序及其代码实现

先来看看什么是堆? 堆是一种图的树形结构&#xff0c;被用于实现“优先队列”&#xff08;priority queues&#xff09; 注:优先队列是一种数据结构&#xff0c;可以自由添加数据&#xff0c;但取出数据时要从最小值开始按顺序取出。 在堆的树形结构中&#xff0c…

21张让你代码能力突飞猛进Python速查表(神经网络、线性代数、可视化等)(有中文版)

随着深度学习的蓬勃发展&#xff0c;越来越多的小伙伴们开始使用python作为主打代码&#xff0c;python有着种类繁多的第三方库&#xff0c;这里为大家从网络上收集了一些代码速查表&#xff0c;希望可以帮你在码代码时提速。 基础 神经网络 线性代数 Python资料 可以去VX公…

127.0.0.1 和 localhost 以及 0.0.0.0 区别

之前用 nginx 的时候&#xff0c;发现用这几个 IP&#xff0c;都能正常访问到 nginx 的欢迎网页。一度认为这几个 IP 都是一样的。 但本质上还是有些区别的。 首先 localhost 就不叫 IP&#xff0c;它是一个域名&#xff0c;就跟 "baidu.com",是一个形式的东西&…

【最优化方法】实验三 无约束最优化方法的MATLAB实现

实验的目的和要求&#xff1a;通过本次实验使学生进一步熟悉掌握使用MATLAB软件&#xff0c;并能利用该软件进行无约束最优化方法的计算。 实验内容&#xff1a; &#xff11;、最速下降法的MATLAB实现 &#xff12;、牛顿法的MATLAB实现 &#xff13;、共轭梯度法的MATLAB…

汉思新材料HS716R绝缘固晶胶产品详解

汉思新材料&#xff0c;深耕半导体芯片胶水研发与生产领域17载&#xff0c;现隆重推出HS716R绝缘固晶胶&#xff0c;专为芯片晶片固晶粘接设计&#xff0c;提供卓越性能的绝缘粘接方案。 一、产品概览 HS716R绝缘固晶胶&#xff0c;是一款单组分改性环氧树脂胶粘剂。其独特的中…

gitlab之docker-compose汉化离线安装

目录 概述离线资源docker-compose结束 概述 gitlab可以去 hub 上拉取最新版本&#xff0c;在此我选择汉化 gitlab &#xff0c;版本 11.x 离线资源 想自制离线安装镜像&#xff0c;请稳步参考 docker镜像的导入导出 &#xff0c;无兴趣的直接使用在此提供离线资源 百度网盘(链…

Java特性之设计模式【备忘录模式】

一、备忘录模式 概述 备忘录模式&#xff08;Memento Pattern&#xff09;保存一个对象的某个状态&#xff0c;以便在适当的时候恢复对象&#xff0c;备忘录模式属于行为型模式 备忘录模式允许在不破坏封装性的前提下&#xff0c;捕获和恢复对象的内部状态 主要解决&#xff…

私人健身与教练预约|基于SprinBoot+vue的私人健身与教练预约管理系统(源码+数据库+文档)

私人健身与教练预约管理系统 目录 基于SprinBootvue的私人健身与教练预约管理系统 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2后台功能模块 5.2.1管理员功能 5.2.2用户功能 5.2.3教练功能 四、数据库设计 五、核心代码 六、论文参考 七、最新计算…

腾讯社招测试岗有点奇葩的面试,被问抽奖程序的测试用例设计

今天腾讯网上预约社会招聘&#xff0c;我是前天才看到这条消息&#xff0c;前天投了简历&#xff0c;还叫别人内推了我一把&#xff0c;但是悲剧的我把简历上的号码写成了原来在北京的号码&#xff0c;所以我也不知道是别人觉得我简历不合适还是因为联系不上我所以没有邀请我参…

Python的解析网页

课前案例 通过requests模块爬取指定网站中的图片并保存到本地目录中。 上述案例采用的是同步方式下载图片&#xff0c;效率太低。异步方式如下&#xff08;线程&#xff09;&#xff1a; # target为目标函数&#xff1b;args中传入的是download函数的参数url threading.Threa…

【iOS】——工厂设计模式

文章目录 一、设计模式创建型模式结构型模式行为型模式 二、设计模式七大准则三、简单工厂模式四、工厂方法模式五、抽象工厂模式 一、设计模式 设计模式是指在特定上下文中解决常见问题时所采用的一套可复用的解决方案。这些模式是面向对象编程中的通用概念&#xff0c;广泛应…

Spring学习⑤__Spring AOP的高级应用

Spring AOP的应用配置 Spring中的事务管理 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言&#xff08;如SQL&#xff0c;C或Java&#xff09;书写的用户 程序的执行所引起&#xff0c;并用形如begi…

ABB工业机器人伺服驱动器维修

ABB机器人驱动器是机器人的核心部件&#xff0c;负责驱动机器人的关节进行各种动作。因此&#xff0c;对ABB工业机械手驱动器维修和维护至关重要。 一、ABB机械臂驱动器故障诊断 在ABB工业机器人驱动器维修之前&#xff0c;首先需要准确诊断故障。以下是一些常见的故障诊断方法…

多线程新手村3--多线程代码案例

1.1 单例模式 单例模式是设计模式中非常经典的一种。那么有同学肯定就会好奇了&#xff0c;什么是设计模式呢&#xff1f; 设计模式简单的说就是程序员的“棋谱”&#xff0c;我们下象棋时肯定或多或少都背过棋谱&#xff0c;例如当头炮、马后炮等&#xff0c;设计模式也是这…

【病毒分析】Babuk勒索家族babyk后缀系列分析--Windows篇

1.背景 1.1 Babuk勒索家族 Babuk勒索家族最早曝光于2021年1月初&#xff0c;在几个月内&#xff0c;它就跻身于最臭名昭著的勒索软件组织之列。自回归以来&#xff0c;它通过在地下论坛上积极宣传自己而获得了更多的知名度。在策略方面&#xff0c;其加密功能与其他勒索软件组…

C++|set、map模拟实现<——红黑树

目录 一、红黑树的迭代器 1.1红黑树迭代器框架 1.2operator*() && operator->() 1.3operator() 1.4operator--() 1.5operator() && operator!() 1.6begin() && end() 二、如何用红黑树搭配map和set(仿函数) 三、红黑树封装map和set(简易版…

图片怎么批量重命名从1到50?这3个方法一键改名

图片怎么批量重命名从1到50&#xff1f;图片批量重命名从1到50的过程不仅提高了我们处理大量图片文件的效率&#xff0c;还大大简化了命名过程&#xff0c;让我们能更加有条理地管理和存储图片。通过使用各种专业的工具和方法&#xff0c;我们可以轻松实现图片文件的自动化命名…

【美羊羊拿金币问题】

问题&#xff1a; 有一天美羊羊正在草地上玩耍&#xff0c;突然天上开始落金币&#xff0c;这些金币掉落的范围在一个固定的水平区域内&#xff0c;但这些金币一旦掉落到地上就消失了&#xff0c;因此美羊羊只有不断地移动并从空中接住这些金币才能得到它们。假设金币掉落的位…

宝兰德入选“鑫智奖·2024金融数据智能运维创新优秀解决方案”榜单

近日&#xff0c;由金科创新社主办、全球金融专业人士协会支持的“2024 鑫智奖第六届金融数据智能优秀解决方案”评选结果正式公布。凭借卓越的技术实力和方案能力&#xff0c;宝兰德「智能全链路性能监控解决方案」从90个参选方案中脱颖而出&#xff0c;荣誉入选“鑫智奖2024金…

关于C++的IO流简单总结

基础IO流 C的IO以面向对象的形式实现, 同时兼容了C语言面向过程的IO方式 C 标准库提供了四个基本流对象&#xff1a; cin&#xff1a;用于从标准输入&#xff08;通常是键盘&#xff09;读取数据。 cout&#xff1a;用于向标准输出&#xff08;通常是控制台&#xff09;写入…