如何使用Python杀死Sleep MySQL连接?

时间:2017-02-16 07:25:29

标签: python mysql shell database-connection percona

以下是我尝试过的摘要:

您可以在shell脚本中执行此操作,但如果您的服务器在启用--secure-file-priv选项的情况下运行,则无法执行此操作。我不想禁用它。

虽然完全公平,但--secure-file-priv允许您导出到某个目录。你可以做一个

show global variables like '%secure%';

并且您将获得允许将MySQL结果集直接写入文件的路径。

1。 Shell脚本需要--secure-file-priv禁用

mysql -e "select concat('KILL ',id,';') from information_schema.processlist where Command =    'Sleep' AND user = 'root' into outfile '/tmp/sleep_processes.txt'"
mysql -e "source /tmp/sleep_processes.txt;"
rm -rf /tmp/sleep_processes.txt

2。 Percona的pt-kill

使用Percona的pt-kill

杀死睡眠连接
pt-kill --match-command Sleep --kill --victims all --interval 10

第3。带有pandas的Python脚本

一个Python脚本,列出了在Pandas框架中要杀死的所有查询。但是我如何在Pandas框架中执行每个命令。

import MySQLdb as mdb
import pandas as pd
con = mdb.connect('localhost', 'root', 'password', 'mydatabase');
with con:
 cur = con.cursor()
 cur.execute("select concat('kill ',id,';') sleeping_connections FROM information_schema.processlist isp WHERE Command = 'Sleep' and time > 60")
 rows = cur.fetchall()
 df = pd.DataFrame( [[ij for ij in i] for i in rows] )
 df.rename(columns={0: 'Sleeping Connections'}, inplace=True);
 print(df.head(10))

1 个答案:

答案 0 :(得分:0)

您可以通过自己的文本处理跳过临时文件(以及secure-file-priv问题)。这使得shell脚本可行,而无需禁用secure-file-priv。

IDS=$(mysql -Be 'show processlist' | awk '$5 ~ /Sleep/ {print $1}')
for i in $IDS; do
    mysql -Be "kill $i"
done

或者你可以用单行代码来完成:

mysql -Be 'show processlist' | awk '$5 ~ /Sleep/ {print $1}'| xargs -n 1 -i%% mysql -Be "kill %%"

“-B”调用“批处理模式”,这消除了运行mysql命令时通常会获得的漂亮拳击。有了它,您可以使用简单的文本处理来杀死所有内容。

请注意,这两个连接都会与服务器建立多个连接(一个用于获取进程,另一个用于每个KILL)。如果在您的环境中这很重要,您可以重写它以在一个连接中发出所有KILL。