使用Django 1.3发生随机错误“在查询过程中丢失与MySQL服务器的连接”

问题描述:

此线程不太有帮助:Lost connection to MySQL server during query使用Django 1.3发生随机错误“在查询过程中丢失与MySQL服务器的连接”

我增加了max_allowed_pa​​cket的是16M和max_connections为9999。不过,我仍然得到这个错误:

File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/query.py", line 107, in _result_iter 
    self._fill_cache() 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/query.py", line 772, in _fill_cache 
    self._result_cache.append(self._iter.next()) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/query.py", line 273, in iterator 
    for row in compiler.results_iter(): 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 680, in results_iter 
    for rows in self.execute_sql(MULTI): 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 735, in execute_sql 
    cursor.execute(sql, params) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/backends/mysql/base.py", line 86, in execute 
    return self.cursor.execute(query, args) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/MySQL_python-1.2.3-py2.7-macosx-10.6-intel.egg/MySQLdb/cursors.py", line 174, in execute 
    self.errorhandler(self, exc, value) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/MySQL_python-1.2.3-py2.7-macosx-10.6-intel.egg/MySQLdb/connections.py", line 36, in defaulterrorhandler 
    raise errorclass, errorvalue 
OperationalError: (2013, 'Lost connection to MySQL server during query') 

这件事发生有点随机,任何人都可以摆脱一些关于它的光?

+1

我真的不喜欢mysql这些天,如果你现在有选择,考虑使用postgresql。 – 2011-03-27 04:26:38

+0

你是否在所有表上运行mysqlcheck?您是否连接到远程或本地MySQL服务器?你能重现错误吗? – 2011-03-29 17:51:54

解决方法是在相邻的数据库调用之间进行睡眠。

一些可能性(收集在从https://serverfault.com/questions/29597/what-does-mysql-error-2013-mean/30036#30036部分):

  • 由于加载查询正在采取比正常(因此是随机的)更长,并且超过服务器的WAIT_TIMEOUT(不太可能)或net_wait_timeout条件(可能)。
  • 您正在使用SQL代理,并且该代理在连接完成之前正在终止连接。
  • 你的网络连接到mysql服务器是片状的。尝试ping一段时间,看看是否有任何数据包丢失。

另一种可能是查询本身是非常昂贵的,由于缺少索引,表中的引擎巨大的数据集或限制使用的是(或者可能是InnoDB的或MyISAM数据)。确定此问题的一个好方法是找到导致问题的QuerySet,从QuerySet中获取原始SQL(请参阅Getting the SQL from a Django QuerySet),然后使用EXPLAIN运行查询,并将EXPLAIN添加到您选择的mysql shell中。

+0

我检查了MySQL Workbench中超时设置的复选框。看来,MySQL没有使用默认值,直到我检查复选框。这些值在文本框中显示为推荐值而非默认值吗? – zsong 2011-03-31 13:35:29

+0

某些云提供商(如Azure)在某些固定时间会有空闲连接的代理。尝试使用带有回收属性的连接池库(如SQLAlchemy),并且回收时间低于代理超时查杀时间。在天蓝色的情况下,240s。 – danigosa 2014-10-02 10:32:03

我看到2个可能的原因(如果MySQL服务器是同一个服务器,没有网络问题上):

  • 自去年MySQL查询太多时间已经过去了,所以服务器断开连接
  • 你丢失连接的MySQL资源ID(覆盖ID变量)

如果您不长时间查询服务器,那么使用mysql_ping()可以不时地ping服务器。

MySQL的C API有这个选项MYSQL_OPT_RECONNECT和它的使用此功能设置:

int mysql_options(MYSQL *mysql, enum mysql_option option, const char *arg) 

我不知道这是否是可用的蟒蛇。

如果频繁ping不能解决问题,则可能是您覆盖了mysql链接ID。

另外,如果mysql服务器不在同一台服务器上,应该执行“my_mysql_query()”函数,检查mysql_errno()是否为CR_SERVER_GONE_ERROR或CR_SERVER_LOST,然后重新连接并重试查询。

我在多线程的python脚本中发生了完全相同的错误。问题在于传递连接标识作为线程的参数。

当我开始在线程本身内创建mysql连接时,这消失了。