Python Django:如何阻止长查询杀死数据库?
我将Django 1.1与Mysql 5.*和MyISAM表一起使用 对于数据集中的异常值,我的一些查询可能需要花费大量时间。这些将锁定表并关闭站点。其他时候,似乎有些用户在请求完成之前就取消了请求,而有些查询将停留在“准备”阶段,锁定所有其他查询 我将尝试追踪所有角落的案例,但有一个安全网,这样网站就不会崩溃,这很好Python Django:如何阻止长查询杀死数据库?,python,mysql,django,timeout,Python,Mysql,Django,Timeout,我将Django 1.1与Mysql 5.*和MyISAM表一起使用 对于数据集中的异常值,我的一些查询可能需要花费大量时间。这些将锁定表并关闭站点。其他时候,似乎有些用户在请求完成之前就取消了请求,而有些查询将停留在“准备”阶段,锁定所有其他查询 我将尝试追踪所有角落的案例,但有一个安全网,这样网站就不会崩溃,这很好 我如何避免这种情况?我可以设置最大查询时间吗 似乎中止查询的唯一可靠方法是。一个不太激烈的措施是关闭连接(并重新打开一个新的连接);这将在查询尝试发送到客户端时立即终止查询。您知
我如何避免这种情况?我可以设置最大查询时间吗 似乎中止查询的唯一可靠方法是。一个不太激烈的措施是关闭连接(并重新打开一个新的连接);这将在查询尝试发送到客户端时立即终止查询。您知道查询是什么吗?也许您可以优化SQL或在表中添加一些索引?不幸的是,MySQL不允许您轻松地避免这种情况。一种常见的方法基本上是编写一个脚本,每X秒检查一次所有正在运行的进程(根据您认为的“长”),然后杀死它看到的运行时间过长的进程。不过,通过在MySQL中设置
log\u slow\u querys
,您至少可以获得一些基本诊断,这将把所有耗时超过10秒的查询写入日志。如果这对于您认为的“慢”来说太长,您可以将long\u query\u time
设置为10以外的值来更改阈值 我正在使用Django DB复制应用程序,遇到了同样的困境,如果网络延迟增加,跨WAN的查询有时似乎会挂起
从
配方576780:任何(几乎)可调用的超时
创建任何可调用文件的时间限制版本
例如,要将函数f
限制为t秒,
首先创建有时间限制的f
from timelimited import *
f_t = TimeLimited(f, t)
然后,不要调用f(…)
,而是像这样使用f\u t
try:
r = f_t(...)
except TimeLimitExpired:
r = ... # timed out
例如,使用以下方法:
def _run_timed_query(cursor, log_msg, timeout, query_string, *query_args):
"""Run a timed query, do error handling and logging"""
import sys
import traceback
from timelimited import *
try:
return TimeLimited(cursor.execute, timeout)(query_string, *query_args)
except TimeLimitExpired:
logger_ec.error('%s; Timeout error.' % log_msg)
raise TimeLimitExpired
except:
(exc_type, exc_info, tb) = sys.exc_info()
logger_ec.error('%s; %s.' % (log_msg, traceback.format_exception(exc_type, exc_info, None)[0]))
raise exc_type
使用InnoDB表,而不是。您不应该编写这样的查询,至少不要在实时数据库上运行。Mysql有一个“慢速查询”参数,您可以使用它来识别导致您死亡的查询。大多数情况下,这些缓慢的查询要么有缺陷,要么可以通过定义一两个新索引来加快速度。我如何在django中检测到这一点?我不希望有一个cronjob每秒钟检查一次,看看它能杀死什么…当然,我正在处理查询。我找到了4个杀死DB的。但是我想要一个安全网,这样就不会有任何查询可以锁定我的数据库并杀死网站。数据集中的异常值是什么?一个成就远远超过正常数量的人,或者在网络上有大量别名的人。唉,我很害怕这一点。您有没有为这项工作推荐任何脚本?您找到任何脚本来执行此操作吗?我找到了,但我大部分时间都在阅读,InnoDB对我的查询负载来说是一个数量级的减速:(