MySQL Server has gone away报错常见原因及处理方法

在日常使用中,尤其是在后台服务会操作MySQL数据库的情况下是会有一定几率发生错误提示mysql server has gone away的,正如其字面意思一样,故障原因是服务在操作MySQL时(增删改查)发生了错误,丢失了与MySQL的连接,下面就各种情况进行简单的分析

MySQL服务本身的确实死掉了

这种情况下是MySQL服务它本身死掉了那所有之前保持的连接肯定也就销毁了,因此服务中一定会报这种错误,这种错误检查方法也很简单,可以登陆MySQL服务执行status进行mysql一部分运行信息的查看,其中的uptime字段表示MySQL启动之后经历的时间,当然其启动日志也是可以的,之前还遇到过由于改变机器时区导致MySQL服务启动不起来的。。。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
--------------
mysql Ver 15.1 Distrib 5.5.52-MariaDB, for Linux (x86_64) using readline 5.1

Connection id: 2
Current database:
Current user: root@
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server: MariaDB
Server version: 5.5.52-MariaDB MariaDB Server
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: latin1
Db characterset: latin1
Client characterset: utf8
Conn. characterset: utf8
UNIX socket: /var/lib/mysql/mysql.sock
Uptime: 6 sec

Threads: 1 Questions: 5 Slow queries: 0 Opens: 0 Flush tables: 2 Open tables: 18 Queries per second avg: 0.833

被server端kill掉了

例如有人在连接MySQL服务器之后看到你这一条连接不顺眼,或者是执行时间太久,亦或者是因为你这是一条长时间的空连接被杀掉了kill id,那肯定是会报这种错误的

连接确实是超时了

这种情况有点类似上面那种情况,那就是你的连接达到的服务配置的超时时间只不过区别是上面的是人为操作,而这种情况是触发了MySQL本身的超时机制,例如最大空闲时间,最大写时间,最大读时间,最大等待锁时间,总之很多种这种情况可以看一下本机的variable里面关于%timeout%相关变量的定义

发送的数据太大

查询结果如果超出了max_allowed_packet设置的大小那么也是会报这种错误的,这种情况下就需要修改该变量的地址了

解决方法

大体来说,以上就是日常使用中经常发生的超时异常的原因,那么相应的,也是有解决方法的,例如在python和golang中的conntion这个对象,都会带有一个ping方法,python中conn.ping()会进行检测本链接是否可用如果在conn.ping(True)这样就会检测并在必要的时候重连,golang里面就比较直接了conn.Ping()是直接进行重连的,这种错误在服务代码中还是需要处理的:)

转载请注明来源链接 http://just4fun.im/2017/09/22/MySQL-Server-has-gone-away报错常见原因及处理方法/ 尊重知识,谢谢:)