在服务器中运行的项目,第二天早晨发现程序终止了,查看日志发现’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