flask-sqlalchemy出现(2006, "MySQL server has gone away

一 问题说明:更新了一下数据库发现过一段时间访问页面会返回500,然后刷新一两次就又可以访问了,查看后台日志文件,发现报错。

...
    self._sock.sendall(data)
ConnectionResetError: [Errno 104] Connection reset by peer

During handling of the above exception, another exception occurred:
...
    "MySQL server has gone away (%r)" % (e,))
sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) 
(2006, "MySQL server has gone away (ConnectionResetError(104, 
'Connection reset by peer'))")
...

二 问题原因:
这个问题一般是mysql断开连接了。
1,mysql有wait_timeout全局变量,这个定义了如果不操作数据库wait_timeout=n秒后mysql就会断开数据库。
2,无论wait_timeout设置的有多大,总会有超时的一天,这时候需要flask-sqlalchemy自带的全局变量SQLALCHEMY_POOL_RECYCLE,这个变量是说超过SQLALCHEMY_POOL_RECYCLE=n秒后,flask会回收连接,重新创建连接,只要设置n

wait_timeout和interactive_timeout区别:二者都是设置超过一定的时间就断开数据库的参数,
不同的是,interactive_timeout为交互式,比方说Navicate premium这样有图形用户界面就是交互式,wait_timeout为非交互式比如jdbc,pymysql或orm这种。

三 解决过程:1,登陆数据库,查询全局变量:
show variables like "%timeout%";

image.png

这里是说8小时wait_timeout为8小时。
2,在flask的config.py文件中加入SQLALCHEMY_POOL_RECYCLE=400。

你可能感兴趣的:(flask-sqlalchemy出现(2006, "MySQL server has gone away)