MySQL使用Kill命令杀死/清理慢连接

前面的文章中,已经讲过如何用processlist,获取慢连接和分析连接。MySQL性能分析 - (二) processlist使用及重要指标说明

这里分享下用Kill清理慢连接。

命令简介

登录mysql,执行kill id,id通过processlist获取。
MySQL使用Kill命令杀死/清理慢连接_第1张图片
kill指令有两个可选参数,CONNECTIONQUERY,默认是CONNECTION

官方文档说明:

  • KILL CONNECTION is the same as KILL with no modifier: It terminates the connection associated with the given processlist_id, after terminating any statement the connection is executing.
  • KILL QUERY terminates the statement the connection is currently executing, but leaves the connection itself intact.

简单来说,CONNECTION选项会删除连接,而QUERY选项连接会保留、但停止SQL执行进入休眠。

如果服务使用的是数据库连接池、长连接,如果在CONNECTION模式下,kill了大量的链接,因为连接池链接并不会马上释放,很可能导致连接池突然超限、拿不到链接。 因此kill后通过重启或其他手段,重建连接池中的链接。

批量的效率

一旦发生拥堵,往往要kill的SQL可能几十上百,手工效率比较低,有条件的可以自己搭建一个数据库控制台(阿里云rds控制台就支持批量kill,以前也是用开源phpadmin管理的),或者有批量处理的脚本。
之前写过简单的shell脚本来处理批量kill,下面贴上关键的部分:

threshold=$1
## ... 省略代码[判断阀值为空] ...

slow_log=$baseDir/snapshot/slow.log
sql_conf="SELECT id,db,command,state,time,info FROM information_schema.processlist where command <> 'sleep' and time > "$threshold" order by time desc;"
## ... 省略代码[解析db配置] ...

for id in $(mysql -h${host} -u${user} -p${password} -se  "$sql_conf" | awk '{print $1;print $0>>"'$slow_log'"}');do
    echo "kill "$id
    mysql -h${host} -u${user} -p${password} -e "kill $id"
done

## ... 省略代码[处理通知等] ...

思路很简单,查询出数据库中超过某个阀值的链接,然后轮询链接id、执行kill。编写脚本有几个点需要留意:

  • 传入阀值,需要设置保护性的默认值,避免误操作将延时太低的sql误杀掉
  • 脚本需要增加并发控制,避免多人操作;
  • kill动作一定要留下记录、链接快照,这样后面才能分析慢SQL并根本解决问题。
    • 除了日志,还可以考虑发送邮件的方式,可参考《Linux上Python给多人发送邮件(Python2/Python3写法不同,使用SMTP协议)》

以上。感谢您的阅读。

你可能感兴趣的:(#,└,性能分析与优化,运维,━,汇总,MySQL,━,基本原理和函数)