挂架错误-'MySQL服务器已消失'
[我希望这不是太模糊,我会问新闻组是否没人知道]
我正在使用Pylons(一个python框架)为一个简单的Web应用程序提供服务,但它似乎不时消失,并在错误日志中显示以下信息:((2006年," MySQL服务器已消失"))
我做了一些检查,发现这是因为没有更新与MySQL的连接。不过,这应该不成问题,因为配置文件中的sqlalchemy.pool_recycle应该会自动使其保持活动状态。默认值为3600,但是由于这个问题,我将其回拨到1800。它有所帮助,但是根据文档,3600
应该没问题。错误仍然会半定期发生。我不想降低太多,但是不要使用DOS我自己的数据库:)。
也许我的MySQL配置中有些东西有些愚蠢?不确定确切的位置。
其他相关细节:
Python 2.5 Pylons: 0.9.6.2 (w/ sql_alchemy) MySQL: 5.0.51
解决方案
回答
我们可能要检查MySQL的超时变量:
show variables like '%timeout%';
我们可能对wait_timeout
感兴趣(不太可能但可能:interactive_timeout
)。在Debian和Ubuntu上,默认值为28800(MySQL会在8小时后终止连接),但也许我们平台的默认值是不同的,或者管理服务器的人配置的内容都不同。
在AFAICT中,pool_recycle
实际上并不能保持连接的存活,它会在MySQL杀死它们之前自行使它们失效。我不熟悉挂架,但是如果使连接间歇性地执行" SELECT 1;"是一种选择,那么它将以基本上没有服务器负载和最小网络流量为代价使它们保持活动状态。最后一个想法:我们是否以某种方式设法使用了pylons认为已过期的连接?
回答
我想我已经解决了。原来我有一个简单的配置错误。我的ini文件显示为:
sqlalchemy.default.url = [connection string here] sqlalchemy.pool_recycle = 1800
问题是我的" environment.py"文件声明引擎将只映射带有前缀" sqlalchemy.default"的键,因此忽略了" pool_recycle"。
解决方案是将ini中的第二行更改为:
sqlalchemy.default.pool_recycle = 1800