首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mysql长进程列表和自动重启

问Mysql长进程列表和自动重启
EN

Stack Overflow用户
提问于 2020-04-29 10:55:23
回答 2查看 177关注 0票数 0

我有一个使用大型数据库的旧网站,我现在不想升级它。问题是mysql数据库有一些查询需要很长的时间,当大约4000在线用户的高流量导致mysql达到600%-800%,我必须手动从WHM重新启动mysql服务器。

我想使用cron job简单的shell脚本每10秒读取一次mysql进程列表,如果有任何进程时间超过10秒,它就会杀死这个进程。

这是我找到的用于执行此类任务的查询:

代码语言:javascript
复制
mysql -e 'SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST where time>10 and command<>"Sleep"'

我认为要获得要杀死的进程ID,我应该使用:

代码语言:javascript
复制
 mysql -e 'SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST where time>10 and command<>"Sleep"'

输出如下:

代码语言:javascript
复制
+------+
| ID   |
+------+
| 1095 |
| 1094 |
| 1081 |
| 1079 |
| 1078 |
| 1074 |
| 1040 |
| 1038 |
+------+

现在我有了这个输出表,我只需要将这个任务包装在shell脚本中,以解析这些进程ID并杀死它们。

EN

回答 2

Stack Overflow用户

发布于 2020-04-29 11:08:46

您可以将输出保存在数组中,并使用grep只过滤数字。

代码语言:javascript
复制
mapfile -t array < <(mysql .... | grep -Ewo '[[:digit:]]+')

另一种选择是使用while read loop

代码语言:javascript
复制
while read -r digits; do
  if [[ $digits =~ .*([[:digit:]]{4}).* ]]; then
    array+=("${BASH_REMATCH[1]}")
  fi
done < <(mysql ....)

现在"${array[@]}"有了所有这些数字唯一的值。

终止它,检查它是否正在运行,一个接一个地循环,等等。

票数 1
EN

Stack Overflow用户

发布于 2020-04-30 12:00:16

以下是我为特定数据库用户"db_user“想出的方法,以避免备份等系统较长的过程:

代码语言:javascript
复制
#!/bin/bash
for i in $(mysql -Ne 'select id from information_schema.processlist where USER="db_user" and time>20 and command<>"Sleep";'); do
  mysql -e "kill ${i}"
done

将其保存为mysql_kill_high_processes.sh,并将其添加到根用户cron,以便每分钟运行一次。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61493445

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档