文章内容

2020/4/14 17:01:45,作 者: 黄兵

MySQL 206相关问题

最近写的一个服务平凡出现错误,主要几个错误内容如下:

MySQLdb._exceptions.OperationalError: (2006, '')

(2006, 'MySQL server has gone away')

出现问题的原因:

长时间连接数据库没有关闭,导致出现问题。

下面是具体代码分析:

    # 实例化一个调度器
    scheduler = BlockingScheduler()
    analysis_access_log_main = WriteFile()
    # 添加任务并设置触发方式为2.5小时执行一次
    scheduler.add_job(analysis_access_log_main.start_main, 'interval', seconds=9000)
    # 开始运行调度器
    scheduler.start()

主要看看WriteFile()函数,具体内容:

class WriteFile:
    def __init__(self):
        conn_init = connect_config.Conn_Config()
        self._mysql_conn = conn_init.Conn_MySQL()

第4行连接了数据库,等待后面操作数据库。

看看连接数据库的具体代码:

@retry(stop_max_attempt_number=10, wait_fixed=2)
    def Conn_MySQL(self):
        """连接MySQL数据库
        链接失败,重试10次,每次间隔2s"""
        # 打开数据库连接
        db = MySQLdb.connect(host=self.mysql_host, port=self.mysql_port, user=self.mysql_user,
                             passwd=self.mysql_password,
                             db=self.mysql_database, charset=self.charset)
        return db

这里已经打开了数据库连接,但是我们看到需要等待2.5小时候才具体执行数据库查询,也就是start_main函数。

def write_access_log_file(self):
        access_log_file_path = self.access_log_file()
        time_str = time.strftime("%Y_%m_%d")
        with closing(self._mysql_conn) as mysql_conn:
            with closing(mysql_conn.cursor()) as cur:
                sql = "SELECT * FROM access_log WHERE time>{start_time} AND time

这里with语句块里调用2.5小时已经连接数据库的代码。

这个时候数据库连接已经等待了2.5小时,继续执行查询的时候,数据库已经关闭。

所以才会出现这个问题。


解决方案:

知道问题出现的原因,也就好解决问题了。

直接将具体连接数据库的代码放到查询函数里,这样就不用等待2.5小时。

修改后的代码:

def write_access_log_file(self):
        access_log_file_path = self.access_log_file()
        time_str = time.strftime("%Y_%m_%d")
        with closing(self.conn_init.Conn_MySQL()) as mysql_conn:
            with closing(mysql_conn.cursor()) as cur:
                sql = "SELECT * FROM access_log WHERE time>{start_time} AND time

这里在查询的时候,开始连接数据库。就不会出现问题了。


黄兵个人博客原创。

转载请著名出处:黄兵个人博客 - MySQL 206相关问题

分享到:

发表评论

评论列表