本文共 7561 字,大约阅读时间需要 25 分钟。
pt-kill字面意思就是: kill掉MySQL满足某些特征的query语句
pt-kill [OPTIONS] [DSN]
pt-kill kill MySQL的链接。如果pt-kill没有指定特定文件的话,它连接到MySQL Server,然后通过show processlist 来得到查询语句
如果参数指定了文件,则可以从包含show processlist的文件中读取query语句并分析处理默认从STDIN获取pt-kill --busy-time 60 --kill
pt-kill --busy-time 60 --print
pt-kill --match-command Sleep --kill --victims all --interval 10
pt-kill --match-state login --print --victims all
mysql -e "SHOW PROCESSLIST" > proclist.txtpt-kill --test-matching proclist.txt --busy-time 60 --print
任何软件都有风险,在使用这个工具前,如下建议请关注:
pt-kill 获取从show processlist中获取query,并进行过滤,然后要么kill,要么print
在某种场景,这也是公认的另一种slow query终结者
主要目的就是观察那些有可能使用非常多资源的query,然后进行kill来保护数据库
通常pt-kill是通过连接MySQL,然后show processlist来获取query,但也还有另一种方法,就是通过指定file
在指定文件这种场景下,pt-kill中的参数--kill就不起作用了,你应该使用--print
当你指定--test-matching的时候,才表示你从文件获取query,然后test是否满足相关匹配条件
接下来,你还有很多规则需要遵守,比如:‘不要将replication thread’ 给kill了,千万别kill掉一些比较重要的thread
两个重要的options : --busy-time 和 --victims
--busy-time 指的是query的执行时间(需要测试 --match-command 和 --busy-time 都指定的话,是或的关系,还是且的关系 )
--victims 指的是满足条件的query是否都需要kill,是删除oldest query,还是所有的都删除通常,你至少需要制定一个--match option,否则没有query将会被匹配
你也可以制定--match-all 去匹配所有query(不包括--ignore忽略的)query语句是如何经过层层筛选,最终得到精确的语句的呢?接下来我们具体来看看详细的流程
1. --group-by 选项就是控制grouping的。2. 默认--group-by没有值,表示所有queries都被分在默认的class中。3. 第二步中的matching规则将会应用在每个class中,如果你不想全部应用的话,就需要单独分组group
Matching implies filtering since if a query doesn’t match some criteria, it is removed from its class.Matching happens for each class. First, queries are filtered from their class by the various Query Matches options like --match-user.Then, entire classes are filtered by the various Class Matches options like --query-count.
最后一步其实就是victim selection你是想kill oldest query 还是 all queries, 由 --victims 决定
The forth and final step is to take some action on all matching queries from all classes.action: 有这些 , 按照 --print, --execute-command, --kill"/"--kill-query 的顺序执行
如果仅仅指定了 --kill , 那么不会有output
如果仅仅指定了 --print, 那么你会看到这样的output# 2009-07-15T15:04:01 KILL 8 (Query 42 sec) SELECT * FROM huge_table
这一行显示了时间戳,query的id是8,时间是42秒,info 是query SQL本身
如果同时指定了 --kill --print ,那么匹配后的query会被kill,且会打印出来
至少要指定这些参数里面的一个: --kill, --kill-query, --print, --execute-command or --stop
--any-busy-time and --each-busy-time 这两个参数是互斥的,二者只能取其一
--kill and --kill-query 这两个参数是互斥的,二者只能取其一--daemonize and --test-matching 这两个参数是互斥的,二者只能取其一它还可以接受命令行参数: --ask-pass : 连接MySQL的时候输入的密码
--charset: 默认字符集
--config:Read this comma-separated list of config files; if specified, this must be the first option on the command line.--create-log-table:创建一个--log-dsn指定的表--daemonize:后台运行--database:数据库名--defaults-file:给定决定路径,仅从这个文件去获取MySQL的options--filter:这个不常用,不做多解释,用的时候再来看--group-by:可以根据不同show processlist字段分组,比如:info,可以根据SQL语句分组,这样的用法也不常见,有需求的时候再细看--help:查看帮助--host:ip--interval : 检查频率,如果--busy-time没有指定,那么默认的interval就是30秒。 否则,interval就是--busy-time的一半。 如果同时指定,频率就以显示指定的--interval为准--log: 当后台运行时,output打印到指定日志--log-dsn: 存储每一个被kill的query到DSN(数据库表)--password: 数据库密码--pid: 指定pid,如果pid存在,则此工具不会运行--port: 端口--run-time: pt-kill工具可以运行多长时间,默认是永久。--sentinel: 当某个文件存在时,pt-kill自动停止运行--slave-user & --slave-password : slave相关的选项,以更小的权限访问slave而已--set-vars : 在MySQL中设置某些变量,比如: wait_timeout=10000--socket:socket file to use for connection--stop: Stop running instances by creating the --sentinel file--[no]strip-comments : 删除掉query后面的comment--version: 显示pt-kill的版本--user: 用户名--[no]version-check : 版本检查--victims : 默认是oldest ,其他选项为(all,all-but-oldest)默认是区分大小写的,可以通过regex不区分大小写,比如:(?i-xsm:select)
type: time; group: Query Matches状态:Command=Query , 执行时间超过--busy-time=N 秒
type: time; group: Query Matches状态:Command=Sleep ,空闲时间超过--idle-time=N 秒
type: string; group: Query Matches忽略的command,支持正则
type: string; group: Query Matches忽略的DB,支持正则匹配
type: string; group: Query MatchesIgnore queries whose Host matches this Perl regex.
type: string; group: Query MatchesIgnore queries whose Info (query) matches this Perl regex.
default: yes; group: Query MatchesDon’t kill pt-kill‘s own connection. 默认不会删除pt-kill自己的连接
type: string; group: Query Matches; default: LockedIgnore queries whose State matches this Perl regex. The default is to keep threads from being killed if they are locked waiting for another thread.默认如果被锁住,那么是不会被kill掉的
type: string; group: Query MatchesIgnore queries whose user matches this Perl regex.
如果没有指定--ignore,那么匹配所有query(不包括replication thread,除非指定 --replication-threads)
type: string; group: Query MatchesMatch only queries whose Command matches this Perl regex.常用的Command如下:QuerySleepBinlog DumpConnectDelayed insertExecuteFetchInit DBKillPrepareProcesslistQuitReset stmtTable DumpSee http://dev.mysql.com/doc/refman/5.1/en/thread-commands.html for a full list and description of Command values.
type: string; group: Query MatchesMatch only queries whose db (database) matches this Perl regex.
type: string; group: Query MatchesMatch only queries whose Host matches this Perl regex.The Host value often time includes the port like “host:port”.
type: string; group: Query MatchesMatch only queries whose Info (query) matches this Perl regex.The Info column of the processlist shows the query that is being executed or NULL if no query is being executed.
ype: string; group: Query MatchesMatch only queries whose State matches this Perl regex.常用state如下:Lockedlogincopy to tmp tableCopying to tmp tableCopying to tmp table on diskCreating tmp tableexecutingReading from netSending dataSorting for orderSorting resultTable lockUpdatingSee http://dev.mysql.com/doc/refman/5.1/en/general-thread-states.html for a full list and description of State values.
type: string; group: Query MatchesMatch only queries whose User matches this Perl regex.
group: Query MatchesAllow matching and killing replication threads.By default, matches do not apply to replication threads; i.e. replication threads are completely ignored. Specifying this option allows matches to match (and potentially kill) replication threads on masters and slaves.默认,是不允许kill 复制线程的,除非显示指定了这个选项
type: array; group: Query MatchesFiles with processlist snapshots to test matching options against. Since the matching options can be complex, you can save snapshots of processlist in files, then test matching options against queries in those files.This option disables --run-time, --interval, and --[no]ignore-self.指定一个文件,根据文件中的show processlist来匹配,而不是连接数据库
忽略
默认的执行顺序是: --print, --execute-command, --kill"/"--kill-query
当query匹配后,执行这个command
当query匹配后,执行kill 删除connection
默认是kill command为query的连接,但是如果你想kill其他command,怎么办呢?--kill-busy-commands=Query,Execute 参考下
只kill query,不kill connection
打印被kill的语句
忽略
忽略
You need Perl, DBI, DBD::mysql, and some core packages that ought to be installed in any reasonably new version of Perl.
http://www.percona.com/bugs/pt-kill.
pt-kill 3.0.12
Baron Schwartz and Daniel Nichter
转载地址:http://hhuyo.baihongyu.com/