mysql超时退出_超时-如果时间太长,如何停止MySQL查询?

严修谨
2023-12-01

超时-如果时间太长,如何停止MySQL查询?

在MySQL中可以使查询超时吗?

也就是说,如果任何查询超过我指定的时间,它将被MySQL终止,并且将返回错误而不是等待永恒。

acheruns asked 2020-07-26T21:09:21Z

9个解决方案

10 votes

CPAN上有一个不错的Perl脚本可以做到这一点:[http://search.cpan.org/~rsoliv/mysql-genocide-0.03/mysql-genocide]

只需调度它以适当的参数运行。 创建一个CRONtab文件/etc/cron.d/mysql_query_timeout安排它每分钟运行一次:

* * * * * root /path/to/mysql-genocide -t 7200 -s -K

其中7200是允许的最大执行时间(以秒为单位)。 -s开关过滤掉除SELECT查询以外的所有查询。 -K开关指示脚本杀死匹配的进程。

root用户应该能够在不进行身份验证的情况下运行本地mysql工具,否则您将需要在命令行上提供凭据。

Erik answered 2020-07-26T21:09:49Z

9 votes

我只是将以下bash脚本设置为cron作业,以使用MySQL 5.0完成此任务(杀死了已执行30秒钟以上的任何查询)。 在这里共享它,以防万一它对任何人都有用(如果我的bash脚本风格低效或糟糕,很抱歉,这不是我的主要开发语言):

#!/bin/bash

linecount=0

processes=$(echo "show processlist" | mysql -uroot -ppassword)

oldIfs=$IFS

IFS='

'

echo "Checking for slow MySQL queries..."

for line in $processes

do

if [ "$linecount" -gt 0 ]

then

pid=$(echo "$line" | cut -f1)

length=$(echo "$line" | cut -f6)

query=$(echo "$line" | cut -f8)

#Id User Host db Command Time State Info

if [ "$length" -gt 30 ]

then

#echo "$pid = $length"

echo "WARNING: Killing query with pid=$pid with total execution time of $length seconds! (query=$query)"

killoutput=$(echo "kill query $pid" | mysql -uroot -ppassword)

echo "Result of killing $pid: $killoutput"

fi

fi

linecount=`expr $linecount + 1`

done

IFS=$oldIfs

aroth answered 2020-07-26T21:10:09Z

8 votes

从MySQL 5.1开始,您可以创建一个存储过程,以查询information_schmea.PROCESSLIST表中与您的“长期运行”条件相匹配的所有查询,然后遍历游标以杀死它们。 然后设置该过程以在事件计划程序中定期执行。

参见:[http://forge.mysql.com/tools/tool.php?id=106]

Matthew Montgomery answered 2020-07-26T21:10:34Z

8 votes

我以为已经有一段时间了,但是据此,

MySQL 5.7.4引入了为顶级只读SELECT语句设置服务器端执行时间限制(以毫秒为单位)的功能。

SELECT

MAX_STATEMENT_TIME = 1000 --in milliseconds

*

FROM table;

请注意,这仅适用于只读SELECT语句。

Westy92 answered 2020-07-26T21:11:03Z

7 votes

MySQL论坛对此有一些线索。

这篇文章详细介绍了如何使用innodb_lock_wait_timeout在服务器上设置超时。

假设您使用的是JDBC,这是一种以编程方式进行操作的方法。

David answered 2020-07-26T21:11:32Z

3 votes

我认为上面的egrep不会找到“ 2000”。

为什么不尝试仅选择id并避免所有这些豪华的shell东西:

mysql -e 'select id from information_schema.processlist where info is not null and time > 30;'

fred answered 2020-07-26T21:11:56Z

3 votes

我认为这个旧问题需要更新的答案。

您可以为所有只读SELECT查询设置SELECT超时,如下所示:

SELECT

指定的时间以毫秒为单位。

如果您只想为特定查询设置超时,则可以像这样内联设置它:

SELECT

MySQL返回错误而不是等待永恒。

请注意,此方法仅适用于只读SELECTs。 如果确定SELECT语句不是只读的语句,则取消为其设置的任何计时器,并向用户报告以下NOTE消息:

SELECT

对于带有子查询的语句,它仅限制顶部2983999517172958958208。 它不适用于存储程序中的SELECT语句。 在存储的程序中使用SELECT中的MAX_EXECUTION_TIME提示将被忽略。

Ali Hashemi answered 2020-07-26T21:12:43Z

2 votes

这是我的脚本:

mysql -e 'show processlist\G' |\

egrep -b5 'Time: [6-9]{3,10}' |\

grep 'Id:' |\

cut -d':' -f2 |\

grep -v '155' |\ ## Binary Log PID

sed 's/^ //' |\

while read id

do

mysql -e "kill $id;"

done

Srinivas Mutyala answered 2020-07-26T21:13:02Z

2 votes

从MySQL 5.7.8开始,有max_execution_time选项定义SELECT语句的执行超时。

Alexander Ushakov answered 2020-07-26T21:13:22Z

 类似资料: