如何检查“MySQL server has gone away”

2024-04-28 13:26:45 发布

您现在位置:Python中文网/ 问答频道 /正文

    cursor.execute(sql)
  File "/usr/lib64/python2.6/site-packages/MySQLdb/cursors.py", line 173, in execute
    self.errorhandler(self, exc, value)
  File "/usr/lib64/python2.6/site-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
    raise errorclass, errorvalue
_mysql_exceptions.OperationalError: (2006, 'MySQL server has gone away')

我正在运行一个无限循环,但是每30-60分钟,我就会得到上面的错误。我想我想在每次循环迭代开始时添加一个条件来检查MySQL服务器连接是否仍然连接正常。如果它有gone away,那么我想在继续下一次迭代之前建立一个新的连接和游标。

如何测试服务器是否在这里?这是正确的解决方案吗?

谢谢你!


Tags: inpyself服务器executepackagesusrline
3条回答

您可以捕获操作错误异常并重新连接。

from MySQLdb import OperationalError

try:
    my_sql_operation()
except OperationalError as e:
    #do what you want to do on the error
    reconnect()
    print e

如果在运行查询之前明确希望检查连接是否已断开,则可以运行测试查询来检查是否发生异常。

我不确定在什么情况下会引发操作错误。但是如果您只想捕获MySQL server has gone away错误,那么可以这样做。

from MySQLdb import OperationalError

try:
    my_sql_operation()
except OperationalError as e:
    if 'MySQL server has gone away' in str(e):
        #do what you want to do on the error
        reconnect()
        print e
    else:
        raise e()

它将只捕获“消失”错误,并允许由于其他原因引发操作错误异常。

更新

正如我在评论中所说,我的查询功能如下:

def fetch_data(query):
    try:
        cursor = conn.Cursor()
        cursor.execute(query)
        return cursor.fetchall()
    except OperationalError as e:
        reconnect()
        print 'reconnecting and trying again...'
        fetch_data(query)

这只是一个例子,可能不适合你的情况。我想说的是,对于不同的事情有不同的功能会更好,这样你就可以轻松地处理这些情况。

无法将此添加为对安德鲁·约翰逊的评论,因此我将在此处回答。

Torndb并不总是重新连接。你经常会看到臭名昭著的“MySQL已经消失了……”错误。

处理这个问题的最好方法是为所有查询创建一个函数,并像其他人建议的那样使用它。另一种方法是将定时cookie分发给用户,如果有人用足够长的时间从您的网站请求某些内容,请通过一个具有以下内容的类:

def initialize(self):
    db.reconnect()

这样您就可以重新连接数据库,但是对于有许多数据库的大型网站来说,这是不可扩展的。

您可以像shshank建议的那样捕捉错误,或者使用像torndb这样的库来自动重新连接。

相关问题 更多 >