django出现OperationalError: (2006, ‘MySQL server has gone away‘)分析及解决方案

import os
import django
os.environ.setdefault('DJANGO_SETTING_MODULE', 'aoe.settings')
django.setup()

如上述使用时,可能会出现OperationalError: (2006, 'MySQL server has gone away')的错误,排查出错原因及解决方法:

1.检查MySQL 服务是否宕机了

进入数据库进入mysql控制台,查看mysql的运行时长

mysql> show global status like 'uptime';

如果uptime的值比较大,说明服务正常

2.mysql连接超时

程序一直开着,但是长时间不从数据库获取数据,数据库会断开连接,再次操作数据时会也会出现上述的错误。

可以从增大wait_timeout的值,修改程序和自定义脚本请求:

1.增大wait_timeout:

mysql> show global variables like '%timeout';

mysql> set global wait_timeout=60*60*30;(自定义)

此种做法立即生效,但是重启mysql会恢复原来的值,建议修改mysql配置文件my.cnf:wait_timeout=168000(自定义),需要重启mysql。

2.修改程序,每次使用数据库连接时,记得要手动关闭connection

下面以Django为例

如果项目没有配置主从数据库,可以直接使用

from django.db import connection
connection.close()

如果配置主从数据库,需要仿照 django.db.__init__.py中的close_old_connections函数,自己定义函数,每次操作model得时候执行函数:

from django.db import connections
def close_old_connections():
    for conn in  connections.all():
        conn.close_if_unusable_or_obsolete()

def handle_db_connections(func):
    """数据库连接关闭装饰器"""
    def func_wrapper(*args):
        close_old_connections()
        result = func(*args)
        close_old_connections()
        return result
    return func_wrapper

3.自定义一个脚本每隔一段时间请求接口,操作下数据库,保持数据库连接。

3.检查是否执行的sql语句过长

查询的结果集超过 设置的max_allowed_packet,一般用select * into outfile 的方式导出到文件

查看max_allowed_packet

mysql> show global variables like 'max_allowed_packet';

如果结果集超过 max_allowed_packet的大小可以修改max_allowed_packet:

mysql> set global max_allowed_packet=1024*1024*16;(自定义)

也可以在msql的配置文件my.cnf文件中添加或者修改以下变量:

max_allowed_packet = 20M(自定义)

4.CONN_MAX_AGE参数说明

默认值:0

如果想连接一直有效可设置值为None,但意义不大,因为这个最大连接时间也跟跟数据库有关,如果数据库设置最长连接时间是8h,到8h后连接一样会被断开,建议设置成几个小时就够了。

 

 

你可能感兴趣的:(django使用遇到的坑,django,python)