前面的文章中,已经讲过如何用processlist,获取慢连接和分析连接。
MySQL性能分析 - (二) processlist使用及重要指标说明
这里分享下用Kill清理发现的慢连接。
登录mysql,执行kill id
,id通过processlist获取。
kill
指令有两个可选参数,CONNECTION
、QUERY
,默认是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'"}');doecho "kill "$idmysql -h${host} -u${user} -p${password} -e "kill $id"
done## ... 省略代码[处理通知等] ...
思路很简单,查询出数据库中超过某个阀值的链接,然后轮询链接id、执行kill
。
编写脚本时有几个要点:
- 可以简单用文件日志记录
- 如果要通知,可以采用发送邮件的方式。可参考《Linux上Python给多人发送邮件(Python2/Python3写法不同,使用SMTP协议)》
如果发现被Kill
连接处于Killed
状态,说明该连接已成功设置了中止标识位。但因为SQL执行了比较耗时的操作,Kill
后需要回滚事务和资源,所以需要一段时间。
此时如果有DDL操作,会看到Waiting for table metadata lock
类似状态。
MySQL
连接状态,可参考《MySQL processlist的state属性详解》
以上。感谢您的阅读。
本文发布于:2024-02-01 06:32:11,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170674033134572.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |