pt-kill - 删除匹配特定条件的MySQL查询。
pt-kill杀死MySQL连接。pt-kill连接到MySQL,如果没有给定文件,则从SHOW PROCESSLIST获取查询。
杀死运行时间超过60秒的查询:
打印出运行时间超过60秒的查询:
检查睡眠进程,每隔10秒杀死一次::
打印所有登录的进程:
查看processlist中现在匹配哪些查询:
描述
pt-kill从SHOW PROCESSLIST捕获查询,过滤它们,然后杀死或打印它们。
这样做的目的是监视可能会消耗太多资源的查询,并消除它们。
通常,pt-kill连接到MySQL,从SHOW PROCESSLIST获取查询。或者,它可以读取文件的SHOW PROCESSLIST输出。在这种情况下,pt-kill不连接到MySQL,并且 --kill没有效果。
再读取文件时应该使用 --print参数,阅读文件时使用 --test-matching允许你获取show processlist的结果,并使用pt-kill进行测试,来确保您匹配杀死了正确的查询。有很多特殊的规则需要遵守,比如,不要杀死复制线程,所以要小心不要杀死重要的东西
有两个重要的参数 --busy-time and --victims.
首先,大多数筛选参数匹配show processlist的结果的对应值,时间值由–busy-time匹配
第二, --victims 控制从每个类中删除哪些匹配的查询。默认情况下,具有最高时间值的匹配查询将被终止(最老的查询)。
通常需要指定至少一个 --match选项,否则没有查询匹配。或者,您可以指定 --match-all来匹配 --ignore选项不会忽略的所有查询。
查询通过几个步骤来确定哪些操作将被杀死(或打印—无论指定什么操作)。
理解这些步骤将帮助您精确匹配所需的查询。
第一步是将查询分组到类中。group-by选项控制分组。默认情况下,该选项没有值,因此所有查询都被分组到一个默认类中。每个类都应用所有类型的匹配和筛选(下一步)。因此,您可能需要对查询进行分组,以便匹配/过滤某些类
第二步是匹配。匹配意味着过滤,因为如果查询不匹配某些条件,就从类中删除它。每个类都进行匹配。首先,查询通过各种查询匹配选项(如 --match-user)从类中筛选。然后,整个类被各种类匹配选项筛选,比如 --query-count。
第三步是受害者选择,即匹配要杀死的每个类中的查询。这是由“ --victims”选项控制的。尽管类中的许多查询可能匹配,但您可能只想删除最老的查询,或所有查询,等等。
第四步也是最后一步是对来自所有类的所有匹配查询采取一些操作。Actions选项指定将采取哪些操作。在这个步骤中,没有更多的类,只有一个要删除、打印等查询的列表。
如果 --kill被给出,那么就没有输出。如果只 --print被给出,那么对于每个可能被杀死的查询,如果打印一个时间戳KILL语句,比如:
这一行显示了时间戳、查询Id(8)、时间(42秒)和信息(通常是查询SQL)。
如果同时给出了 --kill和 --print,那么匹配的查询将被杀死,并打印出与上面类似的一行。
由 --execute-command执行的任何命令都负责自己的输出和日志记录。执行后,pt-kill不能控制或与命令交互。
1 至少有一个需要被指定:–kill, --kill-query, --print, --execute-command ,–stop.
2 --any-busy-time and --each-busy-time互斥
3 --kill and --kill-query 互斥
4 --daemonize and --test-matching 互斥
- -ask-pass
连接数据库询问密码
- -charset
字符集
- -config
把配置写入到一个文件
- -create-log-table
创建–log-dsn 制定的表如果不存在
- -daemonize
后台运行
- -database
连接的数据库
- -defaults-file
mysql配置文件
- -filter
丢弃此Perl代码不返回true的事件。
此选项是一串Perl代码或包含Perl代码的文件,这些代码被编译成一个子例程,参数为$event。这是一个hashref。如果给定的值是一个可读文件,那么pt-kill将读取整个文件并使用其内容作为代码。该文件不应该包含shebang (#!/usr/bin/perl)行。
如果代码返回true,则回调链将继续;否则结束。该代码是子例程中除返回$event外的最后一条语句。子程序模板为:
命令行中给出的过滤器被封装在括号中,如like (filter)。对于复杂的多行过滤器,必须将代码放在文件中,这样它就不会被封装在括号中。无论哪种方式,过滤器都必须生成给定模板的语法有效代码。例如,命令行中给出的if-else分支将无效:
由于它是在命令行中给出的,if-else分支将被封装在括号中,这在语法上是无效的。因此,要完成像这样更复杂的任务,需要将代码放入文件中,例如filter.txt:
然后指定——filter filter.txt从filter.txt中读取代码。
如果过滤器代码不能编译,pt-kill将死于一个错误。如果过滤器代码可以编译,但是代码试图做错什么(比如模式匹配一个未定义的值),那么在运行时仍然可能发生错误。pt-kill不提供任何安全措施,所以编码要小心!
- -group-by
把每一类匹配的查询按照show processist的列进行分组。
除了SHOW PROCESSLIST的基本列(用户、主机、命令、状态等)之外,查询还可以通过在Info列中抽象SQL查询的fingerprint进行匹配。
- -help
帮助并退出
- -host
连接mysql主机名、ip
- -interval
检查频率,默认30s
如果指定了 --busy-time那么 interval的值是–busy-time时间的一半,如果同时给出了 --interval 和 --busy-time 那么将使用interval指定的值
- -log
当后台运行时,将所有输出打印到此文件。
- -log-dsn
存储每一个被kill的query到DSN(数据库表)
- -password
连接数据库使用的密码
- -pid
创建pid文件
- -port
数据库连接端口
- -query-id
打印刚刚被杀死的查询的ID。
- -rds
表示正在讨论的实例位于Amazon RDS上。
- -run-time
运行时间,默认永久
- -sentinel
默认值:/tmp/pt-kill-sentinel
如果文件存在则退出程序
- -slave-user
设置用于连接从服务器的用户。
- -slave-password
设置用于连接从服务器的用户密码。
- -set-vars
设置mysql参数
- -socket
连接socket文件
- -stop
创建停止程序的文件
- -[no]strip-comments
默认yes 从PROCESSLIST的Info列的查询中删除SQL注释。
- -user
连接mysql用户
- -version
显示版本并退出
- -[no]version-check
检查工具版本、数据库版本
- -victims
默认:oldest
每个类中的哪个匹配查询将被终止。在匹配/筛选类之后,此选项指定每个类中的哪个匹配查询将被终止(或打印,等等)。以下值是可能的:
oldest:按时间对匹配的查询进行排序,并杀死时间值最高的查询
all:杀死类中所有的查询
all-but-oldest:除最老的查询外,删除所有查询。这是oldest的反义。
例如:
1.pt-kill --host=10.10.80.16 --port=4000 --user=root --password=123456 --match-db index --match-command Sleep --print --interval 10 --victims all
2.pt-kill --host=10.10.80.16 --port=4000 --user=root --password=123456 --match-db index --match-command Sleep --print --interval 10
3.pt-kill --host=10.10.80.16 --port=4000 --user=root --password=123456 --match-db index --match-command Sleep --print --interval 10 --victims all-but-oldest
- -wait-after-kill
类型:时间
在杀死一个查询后,等待一会,再去杀死其他的查询,这样做的目的是给被阻塞的查询一个执行的机会,因此我们不会在删除了一个阻塞了其他查询的查询后立即删除那些被阻塞的查询
- -wait-before-kill
类型:时间
在杀死查询之前等待。这样做的目的是让 --execute-command有机会看到匹配的查询,并在它被杀死之前收集其他MySQL或系统信息。
这些选项从类中过滤查询。如果查询不匹配,则将其从类中删除。 --ignore选项优先。
默认情况下所有模式匹配都是大小写敏感的,但是可以通过指定regex模式(?i-xsm:select)使它们不区分大小写。
- -busy-time
匹配运行时间超过此时间的查询。查询必须处于Command=Query状态。
- -idle-time
匹配空闲/睡眠时间超过此时间的查询。查询必须处于Command=Sleep状态。
- -ignore-command
忽略commend列与此Perl正则表达式匹配的查询。
- -ignore-db
忽略db列匹配正则表达式匹配的查询。
- -ignore-host
忽略host列匹配正则表达式匹配的查询。
- -ignore-info
忽略info列匹配正则表达式匹配的查询。
- -[no]ignore-self
默认yes 忽略pt-kill自己的连接
- -ignore-state
忽略state与此Perl正则表达式匹配的查询
- -ignore-user
忽略user与此Perl正则表达式匹配的查询
- -match-all
匹配所有未被忽略的查询。这个选项允许您指定反向匹配,即匹配除了某条件外得查询
这种选择并不等同于–victims all,此选项匹配类中的所有查询,而 --victims all指定类中的所有匹配查询(无论匹配与否)都将被杀死
- -match-command
只匹配command与此Perl正则表达式匹配的查询。
- -match-db
仅匹配db与此Perl正则表达式匹配的查询。
- -match-host
仅匹配host与此Perl正则表达式匹配的查询。
- -match-info
仅匹配info与此Perl正则表达式匹配的查询。
- -match-state
仅匹配state与此Perl正则表达式匹配的查询。
- -match-user
仅匹配user与此Perl正则表达式匹配的查询。
- -replication-threads
允许匹配和终止复制线程。默认不允许
- -test-matching
指定一个带有processlist快照的文件,以测试与之匹配的选项。由于匹配选项可能很复杂,您可以将processlist的快照保存在文件中,然后对这些文件中的查询测试匹配选项
这些匹配适用于整个查询类。类是通过指定 --group-by选项创建的,否则所有查询都是一个默认类的成员。
- -any-busy-time
如果任何查询的运行时间超过此时间,则匹配query类。“长于”意味着,例如,如果您指定了10,那么只有在至少有一个查询运行了超过10秒时,该类才会匹配。
- -each-busy-time
如果每个查询的运行时间超过此时间,则匹配query类。“长于”意味着如果您指定了10,例如,只有当每个查询的运行时间都超过10秒时,该类才会匹配。
- -query-count
匹配查询类,如果它至少有这么多查询。当通过指定 --group-by将查询分组到类中时,此选项将使匹配仅应用于具有至少这么多查询的类。如果 --group-by没有指定,那么只有在整个SHOW PROCESSLIST中至少有这么多查询时,才会应用该选项。
- -verbose
打印有关正在进行的操作的信息到STDOUT。
默认的执行顺序是: --print, --execute-command, --kill / --kill-query
- -execute-command
当查询匹配时执行此命令,命令执行后,pt-kill对它没有控制,因此命令负责自己的信息收集、日志记录、间隔等。每次查询匹配时都会执行该命令,因此要注意在运行多个实例时该命令的行为是否良好。
- -kill
当query匹配后,执行kill 删除connection
- -kill-busy-commands
默认值:Query
killquery时指定命令类型
- -kill-query
这个选项只杀死查询,而不杀死查询的连接。
- -print
打印一个KILL语句来匹配查询;实际上并不会终止查询。