SQLAlchemy/MySQL 在查询过程中与 MySQL 服务器的连接丢失

kaw*_*vin 7 python mysql macos sqlalchemy

SQLAlchemy (0.9.8) 和 mysql-5.6.21-osx10.8-x86_64 和 MAC OS X 10.3.3 (Yosemite)

我一直断断续续:

InterfaceError: (InterfaceError) 2013: Lost connection to MySQL server during query u'SELECT..... '
Run Code Online (Sandbox Code Playgroud)

我已经阅读了一些线程,大多数情况通过将其添加到 my.cnf 来解决

   max_allowed_packet = 1024M
Run Code Online (Sandbox Code Playgroud)

这对于我尝试做的事情来说应该足够大了。这样做后,我间歇性地踩它。并将这一行放在 /etc/my.cnf 中:

   log-error = "/Users/<myname>/tmp/mysql.err.log"
   log-warnings = 3
Run Code Online (Sandbox Code Playgroud)

我希望获得更多详细信息,但我所看到的只是这样的:

   [Warning] Aborted connection 444 to db: 'dbname' user: 'root' host: 'localhost' (Got an error reading communication packets)
Run Code Online (Sandbox Code Playgroud)

我已经到了我认为更多细节更好的日志记录可能会有所帮助的地步,或者如果在此之前我可以尝试其他一些事情。

谢谢。

MOC*_*KBA 6

看起来您的 MySQL 连接在长时间不活动后超时,我打赌如果您不断使用现有设置查询数据库,这种情况就不会发生。MySQL 和 sql 端都有一些设置可以解决这个问题:

  1. 检查您的 SQLa 引擎的pool_recycle值,尝试不同/较小的值,例如 1800(秒)。如果您正在从文件中读取数据库设置,请将其设置为

    池回收:1800

否则在引擎初始化期间指定它,例如

from sqlalchemy import create_engine
e = create_engine("mysql://user:pass@localhost/db", pool_recycle=1800)
Run Code Online (Sandbox Code Playgroud)
  1. 检查/修改您的wait_timeoutMySQL 变量,请参阅https://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_wait_timeout这是服务器等待非交互式连接上的活动的秒数在关闭它之前。例如

    显示全局变量,如“wait_timeout”;

找到适合您环境的组合。

  • 我不认为我的案子是因为超时。我在向数据库发出连续请求期间遇到此错误,因此我的代码不断查询数据库。我怀疑这是由于“缓冲区”相关问题造成的,因为我的“累积”结果集字节大小可能非常大,尽管单个请求结果集可能不一定很大。 (3认同)