MySQL之MySQL server has gone away复现测试
测试MySQL server has gone away复现条件
- 环境
- 情形一
- 报错信息
- 复现测试
- 情形二
- 报错信息
- 复现测试
环境
Python: 3.8/3.9
MySQL: 5.x
情形一
报错信息
File "/usr/local/lib/python3.6/dist-packages/MySQLdb/cursors.py", line 319, in _querydb.query(q)File "/usr/local/lib/python3.6/dist-packages/MySQLdb/connections.py", line 259, in query_mysql.connection.query(self, query)
sqlalchemy.exc.OperationalError: (MySQLdb._exceptions.OperationalError) (2006, 'MySQL server has gone away')
复现测试
- 将MySQL中的wait_timeout调整为10s
- 将flask sqlalchemy中数据库连接配置的SQLALCHEMY_POOL_RECYCLE改为大于wait_timeout值
- 启动服务,在一个session中运行多个查询(总时间大于10s即可)
复现原因分析: 在程序中创建的一个连接,某次查询请求使用的此数据库连接时间超出了wait_timeout配置,但是未超过SQLALCHEMY_POOL_RECYCLE,导致此连接仍可被应用程序使用,但是已被MySQL主动断开。
情形二
报错信息
MariaDB [(none)]> show processlist;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 15
Current database: *** NONE ***
复现测试
- mysql中修改interactive_timeout为很小的值,比如10s
- 退出mysql交互模式,重新进入
- 等待10s执行任意命令
复现原因分析: 交互模式中使用的连接,已被数据库断开(并未通知此连接),但查询请求仍尝试使用此连接。