Django 1.3 的随机错误“在查询期间丢失与 MySQL 服务器的连接”[关闭]
Posted
技术标签:
【中文标题】Django 1.3 的随机错误“在查询期间丢失与 MySQL 服务器的连接”[关闭]【英文标题】:Random Error "Lost connection to MySQL server during query" with Django 1.3 [closed] 【发布时间】:2011-07-22 08:44:28 【问题描述】:这个帖子不太有帮助:Lost connection to mysql server during query。
我将 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')
这是偶然发生的,谁能解释一下?
【问题讨论】:
这些天我真的不喜欢mysql,如果你现在有选择,考虑使用postgresql。 你对所有的表都运行了 mysqlcheck 吗?您是连接到远程还是本地 MySQL 服务器?你能重现错误吗? 【参考方案1】:我在多线程 python 脚本上遇到了完全相同的错误。将连接 ID 作为线程参数传递的问题。
当我开始在线程本身中创建 mysql 连接时,这种情况就消失了。
【讨论】:
【参考方案2】:解决方案是在相邻的数据库调用之间休眠。
【讨论】:
【参考方案3】:我看到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)
我不知道它是否适用于python。
如果频繁 ping 没有帮助,则可能是您覆盖了 mysql 链接 ID。
另外,如果 mysql 服务器不在同一台服务器上,您应该实现“my_mysql_query()”函数来检查 mysql_errno() 是 CR_SERVER_GONE_ERROR 还是 CR_SERVER_LOST,然后重新连接并重试查询。
【讨论】:
【参考方案4】:一些可能性(部分来自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),然后在您选择的 mysql shell 中运行带有 EXPLAIN 前缀的查询。
【讨论】:
我检查了 MySQL Workbench 中超时设置的复选框。在我选中复选框之前,MySQL 似乎没有使用默认值。那些在文本框中灰显的值是推荐值而不是默认值吗? 一些像 Azure 这样的云提供商有代理,可以在特定的固定时间杀死空闲连接。尝试使用具有回收属性的连接池库(如 SQLAlchemy),其回收时间低于代理超时终止。如果是 azure,则为 240 秒。以上是关于Django 1.3 的随机错误“在查询期间丢失与 MySQL 服务器的连接”[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
错误代码:2013。查询期间丢失与 MySQL 服务器的连接
2013, '在查询期间丢失与 MySQL 服务器的连接 - Pymysql Microsoft sql server management Studio
(DatabaseError: no such table: django_session) Django 1.3 selenium 测试期间的错误