SQLAlchemy / MySQL在查询期间丢失了与MySQL服务器的连接

时间:2015-04-20 18:07:15

标签: 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..... '

我已阅读了一些帖子,大部分案例都是通过将此添加到my.cnf

来解决的
   max_allowed_packet = 1024M

对于我试图做的事情应该足够大。这样做之后,我一步一步地打它。把这一行放在/etc/my.cnf:

   log-error = "/Users/<myname>/tmp/mysql.err.log"
   log-warnings = 3

我希望得到更多细节,但我看到的只是这样:

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

我已经达到了这样的程度,我认为更好的日志记录可能会有所帮助,或者在此之前我还可以尝试其他的东西。

感谢。

2 个答案:

答案 0 :(得分:2)

看起来你的MySQL连接在长时间不活动后超时,我敢打赌,如果你不断用现有设置查询你的数据库,它将不会发生。 MySQL和SQL端都有几个设置可以解决这个问题:

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

    pool_recycle:1800

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

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

      显示全局变量,例如&#39; wait_timeout&#39;;

    2. 找到适合您环境的组合。

答案 1 :(得分:0)

根据thisthis和互联网上许多其他文章的建议,使用以下装饰器包装我的所有功能,帮助我解决了mariadb作为后端数据库的“丢失连接”问题。请注意,下面的dbflask_sqlalchemy.SQLAlchemy的实例,但是对于sqlalchemy会话,该概念也将保持相同。

def manage_session(f):
    def inner(*args, **kwargs):

        # MANUAL PRE PING
        try:
            db.session.execute("SELECT 1;")
            db.session.commit()
        except:
            db.session.rollback()
        finally:
            db.session.close()

        # SESSION COMMIT, ROLLBACK, CLOSE
        try:
            res = f(*args, **kwargs)
            db.session.commit()
            return res
        except Exception as e:
            db.session.rollback()
            raise e
            # OR return traceback.format_exc()
        finally:
            db.session.close()
    return inner

我还在Flask SQLAlchemy配置中添加了50秒的pool_recycle,但这显然没有对解决方案有所帮助。