mysql server has gone away

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:
mysql server has gone away,他的意思就是说,mysql已经走了。 
为什么会出现这种情况呢?原因主要还是跟两个参数有关: 

interactive_timeout 这个是客户端和服务器端握手的超时时间,如果你执行一个大操作的话,握手的时间就要长一点。太久也不好, 
有时会出现死循环的操作,握手就会一直握下去,直到系统资源耗完。参数默认值:28800秒(8小时) 

wait_timeout 这个是握手完等待的时候,如时超过设置的值,就自动关闭连接进程,所占用的资源释放。参数默认值:28800秒(8小时) 

SHOW VARIABLES LIKE '%timeout%'; 

你可以执行上面的命令,看一下你这两个值的当前的设置 
也可以在my.cnf或者my.ini修改一下。 
interactive_timeout = 120 
wait_timeout = 5 

mysql> show variables like '%timeout%'; 
+-----------------------------+----------+ 
| Variable_name               | Value    | 
+-----------------------------+----------+ 
| connect_timeout             | 10       | 
| delayed_insert_timeout      | 300      | 
| innodb_flush_log_at_timeout | 1        | 
| innodb_lock_wait_timeout    | 50       | 
| innodb_rollback_on_timeout  | OFF      | 
| interactive_timeout         | 28800    | 
| lock_wait_timeout           | 31536000 | 
| net_read_timeout            | 30       | 
| net_write_timeout           | 60       | 
| rpl_stop_slave_timeout      | 31536000 | 
| slave_net_timeout           | 3600     | 
| wait_timeout                | 28800    | 
+-----------------------------+----------+ 
12 rows in set (0.00 sec) 


ySQL server has gone away的原因及解决方案 

常见的原因: 
1. 服务器超时,比如说在一个脚本里连接上服务器后进行了一些数据库操作后,就开始冷落了数据库,执行起其他一些非数据库操作的耗时操作, 
数据库等啊等等啊等,结果超时了,只好关闭连接。如果是这个原因,请加大wait_timeout。 
2. 因为SQL语句太长所致,比如插入一个BLOB列,或者用一条INSERT语句同时插入很多行,因为SQL太长,数据库可能就无法接收到完整的 SQL, 
结果数据库就会觉得客户端出错了,从而关闭连接。如果是这个原因,请加大max_allowed_packet。 


把PHP连接MySQL的连接方式从长连接改成了短连接,就再没出现了。 

1.MySQL服务器的wait_timeout参数为默认的28800秒,即8小时。该参数的意思是MySQL等待睡眠的连接的持续时间,如果超过8小时不活动,MySQL就会关闭这个连接。 
这个参数可以动态修改,但这个参数是session级别的,需要应用重新建立连接获取这个变量值才会生效。 

2.PHP的默认php.ini里面,default_socket_timeout参数是默认60s.default_socket_timeout参数的意思是socket超时为60s。 官方解释 

3.在MySQL的官方文档里面,有专门的章节介绍MySQL Server has gone away。但并没有提及到客户端本身也会有超时机制,以前曾经试过把wait_timeout设置为1年 
,但App还是继续出现MySQL server has gone away的错误。 

4.在PHP程序里面,如果php.ini修改起来不方便,可以以下代码来尝试解决。 

ini_set('mysql.connect_timeout', 300); 

ini_set('default_socket_timeout', 300); 

在ini_set后,可以用ini_get来验证参数设置适合符合预期。 







=================================================================== 
原因1. MySQL 服务宕了 

判断是否属于这个原因的方法很简单,执行以下命令,查看mysql的运行时长 

$ mysql -uroot -p -e "show global status like 'uptime';" 
+---------------+-------+ 
| Variable_name | Value | 
+---------------+-------+ 
| Uptime        | 68928 | 
+---------------+-------+ 
1 row in set (0.04 sec) 

或者查看MySQL的报错日志,看看有没有重启的信息 

$ tail /var/log/mysql/error.log 
130101 22:22:30 InnoDB: Initializing buffer pool, size = 256.0M 
130101 22:22:30 InnoDB: Completed initialization of buffer pool 
130101 22:22:30 InnoDB: highest supported file format is Barracuda. 
130101 22:22:30 InnoDB: 1.1.8 started; log sequence number 63444325509 
130101 22:22:30 [Note] Server hostname (bind-address): '127.0.0.1'; port: 3306 
130101 22:22:30 [Note]   - '127.0.0.1' resolves to '127.0.0.1'; 
130101 22:22:30 [Note] Server socket created on IP: '127.0.0.1'. 
130101 22:22:30 [Note] Event Scheduler: Loaded 0 events 
130101 22:22:30 [Note] /usr/sbin/mysqld: ready for connections. 
Version: '5.5.28-cll'  socket: '/var/lib/mysql/mysql.sock'  port: 3306  MySQL Community Server (GPL) 
如果uptime数值很大,表明mysql服务运行了很久了。说明最近服务没有重启过。 

如果日志没有相关信息,也表名mysql服务最近没有重启过,可以继续检查下面几项内容。 

2. 连接超时 

如果程序使用的是长连接,则这种情况的可能性会比较大。 

即,某个长连接很久没有新的请求发起,达到了server端的timeout,被server强行关闭。 

此后再通过这个connection发起查询的时候,就会报错server has gone away 


$ mysql -uroot -p -e "show global variables like '%timeout';" 
+----------------------------+----------+ 
| Variable_name              | Value    | 
+----------------------------+----------+ 
| connect_timeout            | 30       | 
| delayed_insert_timeout     | 300      | 
| innodb_lock_wait_timeout   | 50       | 
| innodb_rollback_on_timeout | OFF      | 
| interactive_timeout        | 28800    | 
| lock_wait_timeout          | 31536000 | 
| net_read_timeout           | 30       | 
| net_write_timeout          | 60       | 
| slave_net_timeout          | 3600     | 
| wait_timeout               | 28800    | 
+----------------------------+----------+ 
mysql> SET SESSION wait_timeout=5; 

## Wait 10 seconds 

mysql> SELECT NOW(); 
ERROR 2006 (HY000): MySQL server has gone away 
No connection. Trying to reconnect... 
Connection id:    132361 
Current database: *** NONE *** 

+---------------------+ 
| NOW()               | 
+---------------------+ 
| 2013-01-02 11:31:15 | 
+---------------------+ 
1 row in set (0.00 sec) 


3. 进程在server端被主动kill 
这种情况和情况2相似,只是发起者是DBA或者其他job。发现有长时间的慢查询执行kill xxx导致。 

$ mysql -uroot -p -e "show global status like 'com_kill'" 
+---------------+-------+ 
| Variable_name | Value | 
+---------------+-------+ 
| Com_kill      | 0     | 
+---------------+-------+ 

4. Your SQL statement was too large. 
当查询的结果集超过 max_allowed_packet 也会出现这样的报错。定位方法是打出相关报错的语句。 
用select * into outfile 的方式导出到文件,查看文件大小是否超过 max_allowed_packet ,如果超过则需要调整参数,或者优化语句。 

mysql> show global variables like 'max_allowed_packet'; 
+--------------------+---------+ 
| Variable_name      | Value   | 
+--------------------+---------+ 
| max_allowed_packet | 1048576 | 
+--------------------+---------+ 
1 row in set (0.00 sec) 
修改参数: 

mysql> set global max_allowed_packet=1024*1024*16; 
mysql> show global variables like 'max_allowed_packet'; 
+--------------------+----------+ 
| Variable_name      | Value    | 
+--------------------+----------+ 
| max_allowed_packet | 16777216 | 
+--------------------+----------+ 
1 row in set (0.00 sec)
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3月前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
3月前
|
关系型数据库 MySQL 数据库
docker启动mysql多实例连接报错Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’
docker启动mysql多实例连接报错Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’
208 0
|
4月前
|
数据采集 关系型数据库 MySQL
大数据-业务数据采集-FlinkCDC The MySQL server is not configured to use a ROW binlog_format
大数据-业务数据采集-FlinkCDC The MySQL server is not configured to use a ROW binlog_format
44 1
|
5月前
|
SQL Oracle 关系型数据库
MySQL、SQL Server和Oracle数据库安装部署教程
数据库的安装部署教程因不同的数据库管理系统(DBMS)而异,以下将以MySQL、SQL Server和Oracle为例,分别概述其安装部署的基本步骤。请注意,由于软件版本和操作系统的不同,具体步骤可能会有所变化。
336 3
|
5月前
|
安全 关系型数据库 MySQL
【Python】已解决:pymysql.err.OperationalError:(2003 “Can’t connect to MySQL server on ‘localhost’ ([WinEr
【Python】已解决:pymysql.err.OperationalError:(2003 “Can’t connect to MySQL server on ‘localhost’ ([WinEr
594 1
|
5月前
|
关系型数据库 MySQL 数据库
2003-Can`t connect to Mysql server on ‘154.8.165.152‘(10038)
2003-Can`t connect to Mysql server on ‘154.8.165.152‘(10038)
|
5月前
|
关系型数据库 MySQL Java
软件开发2003 -Can·t to MySQL server on ‘xxxxxx‘(10038),宝塔初始化安装mysql,远程链接MySql注意事项,开始时服务器是没有放开端口的,宝塔也都开
软件开发2003 -Can·t to MySQL server on ‘xxxxxx‘(10038),宝塔初始化安装mysql,远程链接MySql注意事项,开始时服务器是没有放开端口的,宝塔也都开
|
5月前
|
关系型数据库 MySQL 数据库连接
Cant‘t connect to MySQL server on ‘localhost‘ (10038)
Cant‘t connect to MySQL server on ‘localhost‘ (10038)
|
5月前
|
SQL 关系型数据库 MySQL
You have an error in your SQL syntax;check the manual that corresponds to you Mysql server version
You have an error in your SQL syntax;check the manual that corresponds to you Mysql server version
|
5月前
|
关系型数据库 MySQL Go
mysql,数据库Server returns invalid timezone. Go to ‘Advanced‘ tab 数据库的行和列没有出现怎么办p
mysql,数据库Server returns invalid timezone. Go to ‘Advanced‘ tab 数据库的行和列没有出现怎么办p