如何检查“我的SQL服务器已断开连接”?

4 投票
3 回答
8667 浏览
提问于 2025-04-18 14:32
    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服务器的连接是否还在。如果连接已经断开,我想在继续下一次循环之前重新建立连接和游标。

我该如何测试服务器是否还在线呢?这样做合适吗?

谢谢!

3 个回答

0

我不能把这个作为评论加到Andrew Johnson的下面,所以我就在这里回答了。

Torndb并不是总能自动重新连接。你经常会看到那个让人头疼的“数据库连接断开了”错误。

处理这个问题的最好办法是为所有的查询写一个函数,然后使用这个函数,确实像其他人建议的那样。另一种方法是给用户发放定时的cookie,如果某个用户在很长时间后请求你的网站,就通过一个包含以下内容的类来处理:

def initialize(self):
    db.reconnect()

这样你就可以重新连接数据库,但对于有很多数据库的大型网站来说,这种方法并不太适用。

0

你可以像shshank建议的那样捕捉错误,或者使用一个叫做 torndb 的库,它会自动帮你重新连接。

8

你可以捕捉到操作错误(OperationalError)这个异常,然后重新连接。

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服务器已断开连接 这个错误,可以这样做。

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)

这只是一个例子,可能不适合你的情况。我想表达的意思是,针对不同的事情最好有不同的函数,这样你就能更轻松地处理这些情况。

撰写回答