使用Django 1.3发生随机错误“在查询过程中丢失与MySQL服务器的连接”
此线程不太有帮助:Lost connection to MySQL server during query。使用Django 1.3发生随机错误“在查询过程中丢失与MySQL服务器的连接”
我增加了max_allowed_packet的是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')
这件事发生有点随机,任何人都可以摆脱一些关于它的光?
解决方法是在相邻的数据库调用之间进行睡眠。
一些可能性(收集在从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中。
我看到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连接时,这消失了。
我真的不喜欢mysql这些天,如果你现在有选择,考虑使用postgresql。 – 2011-03-27 04:26:38
你是否在所有表上运行mysqlcheck?您是否连接到远程或本地MySQL服务器?你能重现错误吗? – 2011-03-29 17:51:54