pt-killp - 云端在线

这是 pt-killp 命令,可以使用我们的多个免费在线工作站之一在 OnWorks 免费托管服务提供商中运行,例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器

程序:

您的姓名


pt-kill - 杀死符合特定条件的 MySQL 查询。

概要


用法:pt-kill [选项] [DSN]

pt-kill 杀死 MySQL 连接。 pt-kill 连接到 MySQL 并从 SHOW 获取查询
如果没有给出文件,则为 PROCESSLIST。 否则,它从一个或多个 FILE 中读取查询
包含 SHOW PROCESSLIST 的输出。 如果 FILE 是 -,则 pt-kill 从 STDIN 读取。

终止运行时间超过 60 秒的查询:

pt-kill --繁忙时间 60 --kill

打印,不要杀死,运行时间超过 60 秒的查询:

pt-kill --busy-time 60 --print

检查睡眠进程并每 10 秒将它们全部杀死:

pt-kill --match-command 睡眠 --kill --victims all --interval 10

打印所有登录过程:

pt-kill --match-state 登录 --print --victims all

查看当前进程列表中的哪些查询会匹配:

mysql -e "显示进程列表" > proclist.txt
pt-kill --测试匹配 proclist.txt --busy-time 60 --print

风险


Percona Toolkit 是成熟的,在现实世界中得到验证,并经过良好测试,但所有数据库
工具会给系统和数据库服务器带来风险。 在使用这个工具之前,
请:

· 阅读工具的文档

· 查看工具已知的“BUGS”

· 在非生产服务器上测试该工具

· 备份您的生产服务器并验证备份

商品描述


pt-kill 从 SHOW PROCESSLIST 捕获查询,过滤它们,然后杀死或
打印它们。 这在某些圈子中也被称为“慢查询狙击手”。 这个想法是
注意可能消耗过多资源的查询,并杀死它们。

为简洁起见,我们谈论终止查询,但它们可能只是被打印(或其他一些
未来行动)取决于给出的选项。

通常 pt-kill 连接到 MySQL 以从 SHOW PROCESSLIST 获取查询。 或者,
它可以从文件中读取 SHOW PROCESSLIST 输出。 在这种情况下,pt-kill 不会连接到
MySQL 和“--kill”没有效果。 在阅读文件时,您应该使用“--print”代替。
使用“--test-matching”读取文件的能力允许您捕获 SHOW PROCESSLIST
并稍后使用 pt-kill 对其进行测试,以确保您的匹配项终止了正确的查询。
有很多特殊的规则要遵循,比如“不要杀死复制线程”,所以
小心不要杀死重要的东西!

要知道的两个重要选项是“--busy-time”和“--victims”。 首先,虽然大多数
匹配/过滤器选项匹配它们来自 SHOW PROCESSLIST 的相应值(例如
“--match-command”匹配查询的命令值),时间值匹配
“ - 忙碌的时间”。 另见“--间隔”。

其次,“--victims”控制从每个类中删除哪些匹配的查询。 经过
默认情况下,具有最高 Time 值的匹配查询将被终止(最旧的查询)。 看
下一节,“分组,匹配和杀死”,了解更多细节。

通常您需要指定至少一个“--match”选项,否则不会匹配任何查询。
或者,您可以指定“--match-all”来匹配未被忽略的所有查询
“--忽略”选项。

组, MATCH AND KILL


查询通过几个步骤来确定哪个将被杀死(或
打印--指定的任何操作)。 了解这些步骤将帮助您匹配
正是您想要的查询。

第一步是将查询分组到类中。 “--group-by”选项控制
分组。 默认情况下,此选项没有值,因此所有查询都归为一个
默认类。 每个类都应用所有类型的匹配和过滤(下一步)。
因此,您可能需要对查询进行分组以匹配/过滤某些类,但不
其他。

第二步是匹配。 匹配意味着过滤,因为如果查询不匹配
一些标准,它从它的类中删除。 每个班级都会进行匹配。 第一的,
查询通过各种“查询匹配”选项从它们的类中过滤出来,比如
“--匹配用户”。 然后,整个类被各种“类匹配”选项过滤
比如“--query-count”。

第三步是victim selection,即在每个类中匹配哪个查询去杀掉。
这由“--victims”选项控制。 尽管一个类中的许多查询可能匹配,
您可能只想终止最旧的查询,或所有查询等。

第四步也是最后一步是对来自所有类的所有匹配查询采取一些行动。
“操作”选项指定将采取哪些操作。 这一步没有
更多的类,只是一个查询列表来杀死、打印等。

OUTPUT


如果只给出“--kill”,则没有输出。 如果只给出了“--print”,那么一个
如果为每个将被杀死的查询打印,则带有时间戳的 KILL 语句,例如:

# 2009-07-15T15:04:01 KILL 8(查询 42 秒)SELECT * FROM huge_table

该行显示时间戳、查询的 Id (8)、它的时间 (42 秒) 和它的信息 (通常
查询 SQL)。

如果同时给出了“--kill”和“--print”,则匹配的查询将被终止,并且一行
每一个都像上面一样被打印出来。

“--execute-command”执行的任何命令都负责其自己的输出和日志记录。
执行后,pt-kill 无法控制或与命令交互。

配置


至少指定“--kill”、“--kill-query”、“--print”、“--execute-command”或
“ - 停止”。

“--any-busy-time”和“--each-busy-time”是互斥的。

“--kill”和“--kill-query”是互斥的。

“--daemonize”和“--test-matching”是相互排斥的。

此工具接受额外的命令行参数。 参考“概要”和用法
详细信息。

--询问通行证
连接 MySQL 时提示输入密码。

--字符集
简写:-A; 类型:字符串

默认字符集。 如果值为 utf8,则将 STDOUT 上的 Perl 的 binmode 设置为 utf8,
将 mysql_enable_utf8 选项传递给 DBD::mysql,然后运行 ​​SET NAMES UTF8
连接到 MySQL。 任何其他值在没有 utf8 层的 STDOUT 上设置 binmode,
并在连接到 MySQL 后运行 SET NAMES。

--配置
类型:数组

阅读这个逗号分隔的配置文件列表; 如果指定,这必须是第一个
命令行选项。

--创建日志表
如果“--log-dsn”表不存在,则创建它。

此选项会使用默认值创建由“--log-dsn”指定的表
该选项的文档中显示的结构。

--守护进程
叉到后台并从外壳上分离。 仅限 POSIX 操作系统。

- 数据库
简写:-D; 类型:字符串

用于连接的数据库。

--defaults-文件
简写:-F; 类型:字符串

仅从给定文件中读取 mysql 选项。 您必须提供绝对路径名。

- 筛选
类型:字符串

丢弃此 Perl 代码未返回 true 的事件。

这个选项是一串 Perl 代码或一个包含被编译的 Perl 代码的文件
进入一个带有一个参数的子程序:$event。 这是一个哈希引用。 如果给定的值
是一个可读文件,然后 pt-kill 读取整个文件并将其内容用作
代码。 该文件不应包含shebang (#!/usr/bin/perl) 线。

如果代码返回 true,则回调链继续; 否则结束。 这
code 是子程序中除“return $event”之外的最后一条语句。 这
子程序模板是:

sub { $event = shift; filter && return $event; }

命令行上给出的过滤器用括号括起来,如“(过滤器
)”。对于复杂的多行过滤器,您必须将代码放入文件中,以便
不要用括号括起来。 无论哪种方式,过滤器都必须在语法上产生
给定模板的有效代码。 例如,命令上给出的 if-else 分支
行将无效:

--filter 'if () { } else { }' # 错误

由于它是在命令行上给出的,if-else 分支将被包裹在里面
语法上无效的括号。 所以要完成一些更复杂的事情
像这样需要将代码放在一个文件中,例如 filter.txt:

我的 $event_ok; 如果 (...) { $event_ok=1; } else { $event_ok=0; } $event_ok

然后指定“--filter filter.txt”从filter.txt中读取代码。

如果过滤器代码无法编译,pt-kill 将因错误而死亡。 如果过滤器代码
编译,如果代码尝试做某事,运行时仍可能发生错误
错误(如模式匹配未定义的值)。 pt-kill 不提供任何
有保障所以代码仔细!

代码有副作用是允许的(改变 $event)。

- 通过...分组
类型:字符串

将匹配应用于按此 SHOW PROCESSLIST 列分组的每一类查询。 在
除了 SHOW PROCESSLIST 的基本列(用户、主机、命令、状态等),
查询可以通过“指纹”匹配,它抽象了“信息”中的SQL查询
列。

默认情况下,查询未分组,因此匹配项和操作适用于所有查询。
分组允许匹配和操作应用于类似查询的类别(如果有)
类中的查询匹配。

例如,检测缓存踩踏(请参阅“--victims”下的“all-but-oldest”以了解
该术语的解释)要求查询按“arg”属性分组。
这会创建相同查询的类(去除注释)。 所以查询“SELECT
c FROM t WHERE id=1" 和 "SELECT c FROM t WHERE id=1" 被归为同一个类,
但是查询 c<"SELECT c FROM t WHERE id=3"> 与前两个查询不同,所以
它被分组到另一个类中。 然后当指定“--victims”“all-but-oldest”时,
对于每个类别的查询,除了每个类别中最旧的查询之外的所有查询都被终止
匹配匹配条件。

- 帮帮我
显示帮助并退出。

- 主持人
简写:-h; 类型:字符串; 默认:本地主机

连接到主机。

- 间隔
类型:时间

检查要终止的查询的频率。 如果没有给出“--busy-time”,则
默认间隔为 30 秒。 否则默认值是“--busy-time”的一半。
如果同时给出了“--interval”和“--busy-time”,那么显式的“--interval”值
用来。

另请参见“--run-time”。

- 日志
类型:字符串

守护进程时将所有输出打印到此文件。

--log-dsn
类型:DSN

存储在此 DSN 中杀死的每个查询。

该参数指定一个表来存储所有终止的查询。 传入的DSN必须
有数据库 (D) 和表 (t) 选项。 该表必须至少具有以下内容
列。 您可以为自己的特殊目的添加更多列,但它们不会
由 pt-kill 使用。 以下 CREATE TABLE 定义也用于
“--创建日志表”。 MAGIC_create_log_table:

创建表 kill_log (
杀死_id INT(10) 无符号 NOT NULL AUTO_INCREMENT,
服务器编号 比金特(4) 非空默认值“0”,
时间戳日期时间,
原因文本,
kill_error 文本,
Id 比金特(4) 非空默认值“0”,
用户 VARCHAR(16) 非空默认值 '',
主办方 VARCHAR(64) 非空默认值 '',
db VARCHAR(64) 默认空值,
命令 VARCHAR(16) 非空默认值 '',
时间 INT(7) 非空默认值“0”,
州/领地 VARCHAR(64) 默认空值,
信息长文本,
时间_ms 比金特(21) DEFAULT '0', # NOTE, TODO: 当前未使用
主键 (kill_id)
) 默认字符集=utf8

- 密码
简写形式:-p; 类型:字符串

连接时使用的密码。 如果密码包含逗号,则必须对其进行转义
带反斜杠:“exam\,ple”

--pid
类型:字符串

创建给定的 PID 文件。 如果 PID 文件已经存在并且该工具将不会启动
它包含的 PID 与当前 PID 不同。 但是,如果 PID 文件
存在并且它包含的 PID 不再运行,该工具将覆盖 PID
带有当前 PID 的文件。 工具退出时,PID 文件会自动删除。

- 港口
简写形式:-P; 类型:int

用于连接的端口号。

--查询ID
打印刚刚终止的查询的 ID。 这相当于“ID”输出
pt-query-digest。 这允许交叉引用两个工具的输出。

示例:

查询 ID 0xE9800998ECF8427E

请注意,这是查询“指纹”的摘要(或哈希),因此
相同的形式但具有不同的值将具有相同的 ID。 参见 pt-query-digest
更多信息。

--rds
表示有问题的实例在 Amazon RDS 上。 默认情况下 pt-kill 运行 MySQL
命令“kill”用于“--kill”和“kill query”“--kill-query”。 在RDS上这两个
命令不可用,由函数调用代替。 该选项修改
"--kill" 使用 "CALL mysql.rds_kill(thread-id)" 和 "--kill-query" 使用
“调用 mysql.rds_kill_query(thread-id)”

- 运行
类型:时间

退出前运行多长时间。 默认情况下 pt-kill 永远运行,或者直到它的进程
通过创建“--sentinel”文件而终止或停止。 如果这个选项是
指定,pt-kill 运行指定的时间并休眠“--interval”
PROCESSLIST 的每次检查之间的秒数。

- 哨兵
类型:字符串; 默认值:/tmp/pt-kill-sentinel

如果此文件存在,则退出。

“--sentinel”指定的文件的存在将导致所有正在运行的实例
pt-kill 退出。 如有必要,您可能会发现这有助于优雅地停止 cron 作业。
另见“--停止”。

--设置变量
类型:数组

在这个逗号分隔的“变量=值”对列表中设置 MySQL 变量。

默认情况下,工具集:

等待超时=10000

在命令行上指定的变量会覆盖这些默认值。 例如,
指定“--set-vars wait_timeout=500”会覆盖默认值 10000。

如果无法设置变量,该工具会打印警告并继续。

- 插座
简写:-S; 类型:字符串

用于连接的套接字文件。

- 停止
通过创建“--sentinel”文件停止运行实例。

使 pt-kill 创建由“--sentinel”指定的哨兵文件并退出。 这个
应该具有停止所有正在观看相同的正在运行的实例的效果
哨兵文件。

--[no] 条带评论
默认:是

从 PROCESSLIST 的信息列中的查询中删除 SQL 注释。

- 用户
简写:-u; 类型:字符串

如果不是当前用户,则用于登录的用户。

- 版
显示版本并退出。

--[无]版本检查
默认:是

检查 Percona Toolkit、MySQL 和其他程序的最新版本。

这是一个标准的“自动检查更新”功能,还有两个额外的
特征。 首先,该工具在本地系统中检查其他程序的版本
除了它自己的版本。 例如,它检查每个 MySQL 服务器的版本
它连接到 Perl 和 Perl 模块 DBD::mysql。 其次,它检查并警告
关于存在已知问题的版本。 例如,MySQL 5.5.25 有一个严重的错误并且
被重新发布为 5.5.25a。

在工具正常输出之前,任何更新或已知问题都会打印到 STDOUT。
此功能不应干扰工具的正常操作。

欲了解更多信息,请访问.

--受害者
类型:字符串; 默认值:最旧

每个类中的哪些匹配查询将被杀死。 上课后
匹配/过滤,此选项指定每个类中的匹配查询
将被杀死(或打印等)。 以下值是可能的:

最老的
只终止单个最旧的查询。 这是为了防止杀死不是的查询
真的很长,他们只是在等待。 这对匹配的查询进行排序
时间并杀死时间值最高的那个。

all 终止类中的所有查询。

最古老的
杀死除最旧查询之外的所有查询。 这是“最旧”值的倒数。

此值可用于防止“缓存踩踏”,即多个
执行相同的查询并在第一个查询尝试时创建积压
完成。 由于所有查询都是相同的,所以除了第一个查询之外的所有查询都被杀死了
它可以完成并填充缓存。

--等待后杀死
类型:时间

在杀死一个查询之后等待,然后再寻找更多来杀死。 这样做的目的是
给阻塞的查询一个执行的机会,所以我们不会杀死阻塞的查询
一群人,然后立即杀死其他人。

--等待前杀
类型:时间

在终止查询之前等待。 这样做的目的是给“--execute-command”一个
有机会在此之前查看匹配的查询并收集其他 MySQL 或系统信息
它被杀了。

QUERY 火柴
这些选项从它们的类中过滤查询。 如果查询不匹配,则将其删除
从它的类。 “--ignore”选项优先。 命令、db、
host等对应SHOW PROCESSLIST返回的列:Command、db、Host等。
默认情况下,所有模式匹配都区分大小写,但可以将它们设为不区分大小写
通过指定像“(?i-xsm:select)”这样的正则表达式模式。

另请参阅“分组、匹配和杀死”。

- 忙碌的时间
类型:时间; 组:查询匹配

匹配运行时间超过此时间的查询。 查询必须是
在命令=查询状态中。 这与 SHOW 报告的查询的时间值相匹配
处理程序。

- 空闲时间
类型:时间; 组:查询匹配

匹配空闲/休眠时间超过此时间的查询。 查询
必须处于 Command=Sleep 状态。 这与报告的查询的时间值相匹配
显示处理程序。

--忽略命令
类型:字符串; 组:查询匹配

忽略其命令与此 Perl 正则表达式匹配的查询。

请参阅“--match-command”。

--忽略数据库
类型:字符串; 组:查询匹配

忽略数据库(数据库)与此 Perl 正则表达式匹配的查询。

请参阅“--match-db”。

--忽略主机
类型:字符串; 组:查询匹配

忽略主机与此 Perl 正则表达式匹配的查询。

请参阅“--match-host”。

--忽略信息
类型:字符串; 组:查询匹配

忽略其信息(查询)与此 Perl 正则表达式匹配的查询。

参见“--match-info”。

--[不]忽略自我
默认:是; 组:查询匹配

不要杀死 pt-kill 自己的连接。

--忽略状态
类型:字符串; 组:查询匹配; 默认:锁定

忽略状态与此 Perl 正则表达式匹配的查询。 默认是保留线程
如果他们被锁定等待另一个线程,则不会被杀死。

参见“--match-state”。

--忽略用户
类型:字符串; 组:查询匹配

忽略用户与此 Perl 正则表达式匹配的查询。

请参阅“--match-user”。

--匹配所有
组:查询匹配

匹配所有未被忽略的查询。 如果未指定忽略选项,则
每个查询都匹配(复制线程除外,除非“--replication-threads”是
也有规定)。 此选项允许您指定否定匹配,即“匹配
每个查询 ...”,其中异常是通过指定各种
“--忽略”选项。

这个选项是 而不去 与“--victims”“全部”相同。 此选项匹配所有查询
在一个类中,而“--victims”“all”指定所有匹配的查询
类(无论它们匹配)将被杀死。 不过一般情况下,两者都使用
在一起是因为,例如,如果您指定“--victims”“最老”,那么尽管所有
查询可能匹配,只有最旧的将被杀死。

--匹配命令
类型:字符串; 组:查询匹配

仅匹配其 Command 与此 Perl 正则表达式匹配的查询。

常用命令值为:

询问
睡觉
二进制日志转储
连接
延迟插入
执行

初始化数据库

Prepare
进程列表
退出
重置stmt
表转储

看到http://dev.mysql.com/doc/refman/5.1/en/thread-commands.html> 获取完整列表和
命令值的描述。

--匹配数据库
类型:字符串; 组:查询匹配

仅匹配 db(数据库)与此 Perl 正则表达式匹配的查询。

--匹配主机
类型:字符串; 组:查询匹配

仅匹配 Host 与此 Perl 正则表达式匹配的查询。

Host 值通常包括端口,如“host:port”。

--匹配信息
类型:字符串; 组:查询匹配

仅匹配其信息(查询)与此 Perl 正则表达式匹配的查询。

processlist 的 Info 列显示正在执行的查询或 NULL 如果
没有查询正在执行。

--匹配状态
类型:字符串; 组:查询匹配

仅匹配状态与此 Perl 正则表达式匹配的查询。

常见的状态值是:

锁定
登录
复制到 tmp 表
复制到 tmp 表
复制到磁盘上的 tmp 表
创建tmp目录表
执行
网络阅读
发送数据
排序排序
排序结果
表锁
更新

看到http://dev.mysql.com/doc/refman/5.1/en/general-thread-states.html> 一个完整的
状态值的列表和描述。

--匹配用户
类型:字符串; 组:查询匹配

仅匹配用户与此 Perl 正则表达式匹配的查询。

--复制线程
组:查询匹配

允许匹配和杀死复制线程。

默认情况下,匹配不适用于复制线程; 即复制线程是
完全无视。 指定此选项允许匹配匹配(并且可能
杀死)主从上的复制线程。

--测试匹配
类型:数组; 组:查询匹配

带有用于测试匹配选项的进程列表快照的文件。 由于匹配
选项可能很复杂,您可以将 processlist 的快照保存在文件中,然后进行测试
针对这些文件中的查询匹配选项。

此选项禁用“--run-time”、“--interval”和“--[no]ignore-self”。

CLASS 火柴
这些匹配适用于整个查询类。 类是通过指定
“--group-by”选项,否则所有查询都是单个默认类的成员。

另请参阅“分组、匹配和杀死”。

--任何繁忙时间
类型:时间; 组: 班级比赛

如果任何查询运行时间超过此时间,则匹配查询类。 “更长
比”意味着如果你指定 10,例如,如果有
至少一个已运行超过 10 秒的查询。

有关更多详细信息,请参阅“--each-busy-time”。

--每次忙时
类型:时间; 组: 班级比赛

如果每个查询的运行时间超过此时间,则匹配查询类。 “更长
than" 表示,例如,如果您指定 10,则该类将仅在每个和
每个查询已运行超过 10 秒。

另请参阅“--any-busy-time”(如果任何查询的运行时间超过
指定的时间)和“--busy-time”。

--查询计数
类型:int; 组: 班级比赛

如果查询类至少有这么多查询,则匹配查询类。 当查询分组为
通过指定“--group-by”来分类,此选项导致匹配仅适用于
至少有这么多查询的类。 如果未指定“--group-by”,则此
选项导致匹配只在至少有这么多查询时才应用
整个节目编排员。

--详细
简短形式:-v

将有关正在执行的操作的信息打印到 STDOUT。

行动
对来自所有类的每个匹配查询执行这些操作。 采取的行动
按此顺序:“--print”、“--execute-command”、“--kill”/“--kill-query”。 该命令允许
“--execute-command”查看“--print”的输出和之前的查询
“--kill”/“--kill-query”。 这可能会有所帮助,因为 pt-kill 不会通过任何
“--execute-command”的信息。

另请参阅“分组、匹配和杀死”。

--执行命令
类型:字符串; 组: 动作

当查询匹配时执行此命令。

命令执行后,pt-kill无法控制,所以命令为
负责自己的信息收集、日志记录、间隔等。命令是
每次查询匹配时执行,因此请注意该命令在以下情况下表现良好
运行多个实例。 没有来自 pt-kill 的信息传递给命令。

另见“--wait-before-kill”。

- 杀
组: 动作

终止匹配查询的连接。

此选项使 pt-kill 杀死具有
匹配查询。 如果您只想终止单个查询,请使用“--kill-query”
不是他们的联系。

除非还给出了“--print”,否则不会打印任何其他信息表明 pt-
kill 匹配并终止了一个查询。

另见“--wait-before-kill”和“--wait-after-kill”。

--kill-查询
组: 动作

杀死匹配的查询。

此选项使 pt-kill 终止匹配查询。 这需要 MySQL 5.0 或更新版本。
与杀死匹配查询连接的“--kill”不同,此选项仅
杀死查询,而不是它的连接。

- 打印
组: 动作

打印匹配查询的 KILL 语句; 实际上并没有终止查询。

如果您只想查看哪些查询匹配并且实际上没有被杀死
杀死它们,指定“--print”。 要同时终止和打印匹配查询,请指定
“--kill”和“--print”。

DSN 配置


这些 DSN 选项用于创建 DSN。 每个选项都像“option=value”一样给出。
选项区分大小写,因此 P 和 p 不是同一个选项。 不可能有
“=”之前或之后的空格,如果该值包含空格,则必须用引号引起来。
DSN 选项以逗号分隔。 有关完整详细信息,请参阅 percona-toolkit 联机帮助页。

· 一种

dsn:字符集; 副本:是

默认字符集。

·D

dsn:数据库; 副本:是

默认数据库。

F

dsn: mysql_read_default_file; 副本:是

仅从给定文件中读取默认选项

· H

dsn:主机; 副本:是

连接到主机。

·p

dsn:密码; 副本:是

连接时使用的密码。 如果密码包含逗号,则必须对其进行转义
带反斜杠:“exam\,ple”

·P

dsn:端口; 副本:是

用于连接的端口号。

·S

dsn: mysql_socket; 副本:是

用于连接的套接字文件。

·你

dsn:用户; 副本:是

如果不是当前用户,则用于登录的用户。

·吨

如果通过 --log-dsn 传递,则用于记录操作的表。

环境


环境变量“PTDEBUG”启用对 STDERR 的详细调试输出。 启用
调试并将所有输出捕获到文件中,运行该工具,如:

PTDEBUG=1 pt-kill ...> 文件 2>&1

请注意:调试输出量很大,可能会生成几兆字节的输出。

系统 参赛要件


你需要 Perl、DBI、DBD::mysql 和一些应该安装在任何地方的核心包。
相当新版本的 Perl。

使用 onworks.net 服务在线使用 pt-killp



最新的 Linux 和 Windows 在线程序