限制连接超时异常

  • pymysql.err.OperationalError

情况一:MySQL server has gone away

我设置wait_timeout和interactive_timeout,但仍没能重现这个错误

情况二:Lost connection to MySQL server during query

通过设置较短的wait_timeout和interactive_timeout值可以重现这个错误

Traceback (most recent call last):
...
File "/root/.local/share/virtualenvs/orange_new-H9_NlwNb/lib/python3.4/site-packages/pymysql/connections.py", line 1037, in _read_bytes
    CR.CR_SERVER_LOST, "Lost connection to MySQL server during query")
pymysql.err.OperationalError: (2013, 'Lost connection to MySQL server during query')

这种情况有两种解决思路

  • 一:利用db.ping(reconnect=True)自动重连
  • 二:设置db.ping(reconnect=True)手动重连尝试
class OpsDB(object):
    def __init__(self):
        logging.info('初始化数据库连接.')
        self.db = pymysql.connect(**mysql_settings)
        logging.info('初始化完成')

    def check_db_conn(self):
        try:
            logging.info('检查数据库连接.')
            self.db.ping(reconnect=False)
            logging.info('连接正常.')
            return True
        except OperationalError as e:
            logging.info('执行数据库连接异常,异常信息: {}'.format(str(e)))
            while True:
                try:
                    logging.info('正在尝试重连')
                    self.db = pymysql.connect(**mysql_settings)
                    logging.info('重连成功.')
                    return True
                except Exception as re_conn_err:
                    logging.info('尝试重连失败,异常信息: {}'.format(str(re_conn_err)))

    def execute(self, sql, get_one=None, get_all=None):
        self.check_db_conn()
        with self.db.cursor() as cursor:
            logging.info('正在执行SQL: {}'.format(sql))
            cursor.execute(sql)
            self.db.commit()
            logging.info('执行完成,正在返回数据')
            if get_one and not get_all:
                return cursor.fetchone()
            elif get_all and not get_one:
                return cursor.fetchall()
            else:
                logging.warning('参数错误: get_one, get_all只能存在一个')

设置mysql超时时间

mysql> set global interactive_timeout  = 30;
mysql> set global wait_timeout = 30;

等待30秒后请求tornado输出

INFO:root:检查数据库连接.
[I 180327 10:55:26 ops_db:15] 检查数据库连接.
INFO:root:执行数据库连接异常,异常信息: (2013, 'Lost connection to MySQL server during query')
[I 180327 10:55:26 ops_db:20] 执行数据库连接异常,异常信息: (2013, 'Lost connection to MySQL server during query')
INFO:root:正在尝试重连
[I 180327 10:55:26 ops_db:23] 正在尝试重连
INFO:root:重连成功.
[I 180327 10:55:26 ops_db:25] 重连成功.
INFO:root:正在执行SQL: SELECT * FROM server_remote_manage WHERE id=1 and server_id=9
[I 180327 10:55:26 ops_db:33] 正在执行SQL: SELECT * FROM server_remote_manage WHERE id=1 and server_id=9
INFO:root:执行完成,正在返回数据
[I 180327 10:55:26 ops_db:36] 执行完成,正在返回数据
INFO:root:(1, 9, '192.168.1.150', '22', 'root', 'd2VjYW4yMDE2\n', 'pwd')
[I 180327 10:55:26 handlers:28] (1, 9, '192.168.1.150', '22', 'root', 'd2VjYW4yMDE2\n', 'pwd')
INFO:tornado.access:200 GET /webshell?server_id=9&remote_manage_id=1 (127.0.0.1) 5.18ms
[I 180327 10:55:26 web:2064] 200 GET /webshell?server_id=9&remote_manage_id=1 (127.0.0.1) 5.18ms

results matching ""

    No results matching ""