小智 10
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工具,否则您将需要在命令行上提供凭据.
我只是将以下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
Run Code Online (Sandbox Code Playgroud)
从MySQL 5.1开始,您可以创建一个存储过程来查询information_schmea.PROCESSLIST表,查找符合"长时间运行"条件的所有查询,然后迭代游标以终止它们.然后设置该过程以在事件调度程序中重复执行.
请参阅:http://forge.mysql.com/tools/tool.php?id = 106
我以为它已经存在了一段时间,但根据这个,
MySQL 5.7.4引入了为顶级只读SELECT语句设置服务器端执行时间限制的能力,以毫秒为单位.
SELECT
MAX_STATEMENT_TIME = 1000 --in milliseconds
*
FROM table;
Run Code Online (Sandbox Code Playgroud)
请注意,这仅适用于只读SELECT语句.
我认为这个老问题需要更新答案。
GLOBAL您可以为所有只读查询设置超时SELECT,如下所示:
SET GLOBAL MAX_EXECUTION_TIME=1000;
指定的时间以毫秒为单位。
如果您只想为特定查询设置超时,可以像这样内联设置:
SELECT /*+ MAX_EXECUTION_TIME(1000) */ my_column FROM my_table WHERE ...
MySQL 返回一个错误而不是永远等待。
请注意,此方法仅适用于只读SELECT。如果SELECT确定某个语句不是只读的,则为其设置的任何计时器都将被取消,并向用户报告以下注释消息:
Note 1908 Select is not a read only statement, disabling timer
对于带有子查询的语句,它仅限制顶部SELECT。它不适用于SELECT存储程序中的语句。在存储程序中的语句MAX_EXECUTION_TIME中使用提示将被忽略。SELECT
| 归档时间: |
|
| 查看次数: |
63105 次 |
| 最近记录: |