python使用MySQLdb时报'MySQL server has gone away'

2017/7/30 posted in  python

1、现象

在bottle项目中,自己使用mysqldb连接数据库来执行SQL,在程序启动的时候会初始化数据连接,然后全局共享这个连接。

但是在程序运行一段时间后就会出现执行SQL失败的情况,重启后即可恢复。

对应的错误日志如下:

2017-04-09 13:45:25,624|ERROR|MySQL.py|Line:67|Run Select Failed, SQL=
 select userid, companyid, role, status from dw_admin_user where username = 'guash' and password = '6F0E9B51C72BA95911638B3971F'  
, ResKeys=['userid', 'companyid', 'role', 'status'], Error=(2006, 'MySQL server has gone away')

2、原因

这个项目在晚间没有人访问,长时间没有执行SQL,导致MySQL服务端将连接中断,再次执行SQL时就会出现此错误。

3、解决方案

在执行SQL的动作前加一个ping操作,判断连接是否存在,如果不存在则自动重新连接。


    def run_select(self, sql, reskeys):
        if not self.connected:
            res = self.connect()
            if not res:
                return None

        try:
            # ping操作,判断连接是否存在,不存在则自动重新连接
            self._mysql.ping(True)
            
            cursor = self._mysql.cursor()
            self.logger.info("run select: SQL=\n%s \n, ResKeys=%s, db=%s" % (sql, str(reskeys), self.dbname))
            cursor.execute(sql)
            rows = cursor.fetchall()
            return rows
        except Exception as e:
            self.logger.error("Run Select Failed, SQL=\n%s \n, ResKeys=%s, Error=%s" % (sql, str(reskeys), e.__str__()))
            return None

4、效果

运行两天未出现之前问题,继续观察。
抽空可以研究一下django的源码,因为在django项目中从未出现此类问题。