MySQL server has gone away django 设置mysql连接自动断开

项目运行时遇到'MySQL server has gone away'错误,可能原因是数据库连接超时或数据量过大。解决方案包括调整MySQL的wait_timeout和interactive_timeout参数,或者在Django中配置数据库连接管理。Django允许设置自动处理连接断开,通过增大max_allowed_packet参数可处理大数据操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在服务器中运行的项目,第二天早晨发现程序终止了,查看日志发现’MySQL server has gone away错误。
于是百度,
原因:
一、是由于长时间没有操作数据库导致连接被数据库断开。

在数据库的配置文件内可以配置这个超时问题。
进入mysql后运行show variables like ‘%timeout%’;

mysql> show variables like  '%timeout%';
+-----------------------------------+----------+
| Variable_name                     | Value    |
+-----------------------------------+----------+
| connect_timeout                   | 10       |
| delayed_insert_timeout            | 300      |
| have_statement_timeout            | YES      |
| innodb_flush_log_at_timeout       | 1        |
| innodb_lock_wait_timeout          | 50       |
| innodb_rollback_on_timeout        | OFF      |
| interactive_timeout               | 28800    |
| lock_wait_timeout                 | 31536000 |
| mysqlx_connect_timeout            | 30       |
| mysqlx_idle_worker_thread_timeout | 60       |
| mysqlx_interactive_timeout        | 28800    |
| mysqlx_port_open_timeout          | 0        |
| mysqlx_read_timeout               | 30       |
| mysqlx_wait_timeout               | 28800    |
| mysqlx_write_timeout              | 60       |
| net_read_timeout                  | 30       |
| net_write_timeout                 | 60       |
| rpl_stop_slave_timeout            | 31536000 |
| slave_net_timeout                 | 60       |
| wait_timeout                      | 28800    |
+-----------------------------------+----------+
https://www.jb51.net/article/81462.htm

wait_timeout 设置的就是这个超时时间,单位是秒,默认是8小时。这个变量控制的是非交互模式下的连接超时时间。
interactive_timeout 这个变量控制的是交互模式下的连接超时时间。

这两个变量可以通过设置配置文件来设置,也可以在窗口中临时设置

配置文件:
[mysqld]
wait_timeout = 2880000
interactive_timeout = 2880000

窗口:
mysql> set wait_timeout=28800;
Query OK, 0 rows affected (0.00 sec)
mysql> set interactive_timeout =28800;
Query OK, 0 rows affected (0.00 sec)

但是不推荐这么做,最好由程序控制。主要就是在mysql断开连接前,自己重新生成一个新的连接。
django有配置这项

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'xxxxxxxx',
        'PASSWORD': '12345678',
        'USER':'root',
        'HOST':'localhost',
        'PORT': 3306,
        'CONN_MAX_AGE': 21600,    # 数据库每个连接断开的时间设置为6小时,数据库默认断开为8小时
        'ATOMIC_REQUESTS': True   # 设置事务处理
    }
}

二、由于对数据库进行操作时数据量过大
可以通过设置max_allowed_packet 来解决

set max_allowed_packet = 64M

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值