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_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')

这是偶然发生的,谁能解释一下?

【问题讨论】:

这些天我真的不喜欢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

Django 1.3 日志记录:未记录 500 个错误

(DatabaseError: no such table: django_session) Django 1.3 selenium 测试期间的错误

django 1.3中的内置密码重置视图问题

从 MySQL 5.6.35 迁移到 MariaDB 10.6.3 - 查询不起作用