错误2006:使用Python,Bottle Microframework和Apache“MySQL服务器已经消失”

时间:2012-09-16 03:37:01

标签: python mysql apache mod-wsgi bottle

使用以下方式访问我的网络应用程序后:
  - Python 2.7
  - 瓶子微框架v.0.10.6
 --Apache 2.2.22
  - mod_wsgi
  - 在Ubuntu Server 12.04 64bit上;几个小时后我收到了这个错误:

OperationalError: (2006, 'MySQL server has gone away')

我正在使用MySQL - Python中包含的原生MySQL。它通常发生在我不访问服务器时。我已经尝试关闭所有连接,我这样做:

cursor.close()
db.close()

其中db是标准的MySQLdb.Connection()调用。

my.cnf文件如下所示:

key_buffer      = 16M
max_allowed_packet  = 128M
thread_stack        = 192K
thread_cache_size       = 8
# This replaces the startup script and checks MyISAM tables if needed
# the first time they are touched
myisam-recover         = BACKUP
#max_connections        = 100
#table_cache            = 64
#thread_concurrency     = 10

这是默认配置文件,除了max_allowed_pa​​cket是128M而不是16M。

对数据库的查询非常简单,最多可以检索大约100条记录。

任何人都可以帮我解决这个问题吗?我做过的一个想法是使用try / except,但我不确定这是否真的有效。

提前致谢,

杰米

更新:尝试/除了通话无效。

4 个答案:

答案 0 :(得分:23)

这是MySQL错误,而不是Python的错误。

可能的原因和可能的解决方案列表如下:MySQL 5.5 Reference Manual: C.5.2.9. MySQL server has gone away

可能的原因包括:

  
      
  • 您尝试在关闭与服务器的连接后运行查询。这表示应该更正应用程序中的逻辑错误。
  •   
  • 在不同主机上运行的客户端应用程序没有从该主机连接到MySQL服务器的必要权限。
  •   
  • 您在服务器端遇到超时,并且客户端中的自动重新连接被禁用(MYSQL结构中的重新连接标志等于0)。
  •   
  • 如果向服务器发送不正确或太大的查询,也会出现这些错误。如果mysqld收到的数据包太大或无序,则会假定客户端出现问题并关闭连接。如果您需要大查询(例如,如果您正在使用大型BLOB列),则可以通过设置服务器的max_allowed_packet变量来增加查询限制,该变量的默认值为1MB。您可能还需要增加客户端的最大数据包大小。有关设置数据包大小的更多信息,请参见Section C.5.2.10, “Packet too large”
  •   
  • 如果您的客户端早于4.0.8并且您的服务器是4.0.8及更高版本,或者相反,如果您要发送16MB或更大的数据包,也会丢失连接。
  •   
  • 等......
  •   

换句话说,有很多可能的原因。浏览该列表并检查每个可能的原因。

答案 1 :(得分:0)

确保您没有尝试提交已关闭的MySqldb对象

答案 2 :(得分:0)

这里发布了(非常密切相关的)问题的答案:https://stackoverflow.com/a/982873/209532

它直接与MySQLdb驱动程序(MySQL-python(unmaintained)和mysqlclient(维护的fork))相关,但该方法对于不支持自动重新连接的其他驱动程序是相同的。

答案 3 :(得分:-3)

对我而言,这是使用

修复的
MySQLdb.connect("127.0.0.1","root","","db" )

而不是

MySQLdb.connect("localhost","root","","db" )

然后

df.to_sql('df',sql_cnxn,flavor='mysql',if_exists='replace', chunksize=100)