Django 1.3 随机错误“在查询中与 MySQL 服务器断开连接”

1 投票
4 回答
7175 浏览
提问于 2025-04-16 14:21

这个讨论串并没有太大帮助:在查询过程中与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')

这个问题有点随机发生,谁能帮我解释一下吗?

4 个回答

3

我在一个多线程的Python脚本中遇到了完全一样的错误。问题出在把连接ID当作参数传给线程。

当我开始在每个线程内部创建MySQL连接时,这个问题就解决了。

5

这里有一些可能的原因(部分信息来自于 这个链接):

  • 由于服务器的负载情况,查询的执行时间比正常情况下要长(也就是随机的),可能超过了服务器的wait_timeout(不太可能)或net_wait_timeout(比较可能)。
  • 你在使用一个 SQL 代理,而这个代理在连接还没完成时就把它们杀掉了。
  • 你和 MySQL 服务器之间的网络连接不太稳定。可以尝试 ping 一下服务器,看看是否有数据包丢失。

还有一种可能是,查询本身因为缺少索引、数据集太大或者你使用的表引擎(可能是 InnoDB 或 MyISAM)有一些限制,导致它非常耗费资源。要判断这一点,可以找到导致问题的 QuerySet,从中获取原始 SQL 语句(可以参考 如何从 Django QuerySet 获取 SQL),然后在你选择的 MySQL 命令行中运行这个查询,前面加上 EXPLAIN。

-4

解决办法是在相邻的数据库调用之间加一个暂停。

撰写回答