mysql server has gone away的原因

之前遇到开发询问“mysql server has gone away”的问题,想当然的就认为是由于太长时间没有操作,导致超过MySQL服务端上的wait_timeout的设置,最终连接被MySQL服务端回收了。

最近一次突然自己同事写的脚本在运行过程中被中断了,查看报错信息依然是“mysql server has gone away”,同事的脚本在多个MySQL实例上根据时间范围取值,虽然执行时间长了点,但是绝对不会有超过wati_timeout的空闲等待时间,于是去学习了一下到底有哪几种情况会出现这个报错。

情况1

就是最常见的,一个链接超过wait_timeout的设置时间没有做任何事情,被MySQL服务端关闭链接并回收资源。 
针对这种情况要不调大wait_timeout或者不断的向MySQL服务端发送心跳信号,保持链接。

情况2

你的链接被kill掉了,有可能是DBA人工操作,也可能是各种自动化系统操作,可以通过监控status中com_kill状态值来判断刚才是否发生了kill操作。

情况3

MySQL的客户端如果默认配置中有mysql_opt_read_timeout或者mysql_opt_write_timeout参数,并且操作时间超过了其中一个参数的设置,客户端自身会关闭链接。所以需要了解自己使用的mysql客户端。

情况4

还有一种可能是发送的请求或者返回的结果集太大了,超过MySQL的max_allowed_packet_size的设置,导致发生这种报错。多说一句,这个参数需要客户端和服务端同时配置并保持一致才会生效。 
最常见的Linux上的mysql客户端可以使用如下命令查看:

mysql --help | grep ^max-allowmax-allowed-packet 1677721

我们可以看到我们服务器上默认的设置为16M。

情况5

这种比较罕见的情况是MySQL服务端的DNS反解失败导致,理论上我们可以配置–skip-networking参数来规避这种问题。(但是官方文档居然说即使配置了也可能出现这种报错,T_T)

情况6

还有就是如果程序使用了多进程,而所有进程都尝试使用同一个链接和MySQL服务端建立链接的时候就会出现gone away的报错了。(初步怀疑,这也就是我同事遇到的问题了。)

情况7

最后这种比较弱,但是真实发生过,那就是mysql实例宕机了。实例都没有了,自然什么都没有了。当然这种情况判断起来比较方便,一般都会有mysql的存活监控。但是要小心一种情况,就是实例crash后迅速recover,如果监控程序的间隔大于recover的时间,那么就很难发现了。建议使用如下方法复查一下,另外针对uptime最好做为状态的一个必要监控点。

show global status like ‘uptime‘;+---------------+---------+| Variable_name | Value   |+---------------+---------+| Uptime        | 1230699 |+---------------+---------+

最后如果想对“mysql server has gone away”进行详细的追查,建议在mysqld实例启动的时候添加–log-warnings=2 参数,这样就可以在error日志中看到详细的信息了。

时间: 2024-10-13 10:35:33

mysql server has gone away的原因的相关文章

MySQL server has gone away

General error: 2006 MySQL server has gone away 发布: 来源: 添加日期:2014-10-02 23:00:56 浏览:146 评论:0 如果我们单看mysql提示MySQL server has gone away就是由于种种原因导致mysql当机了,导致MySQL server has gone away的原因有很多种,下面我来总结一下. 我自己人的经历:先简单介绍一下这个新手卡录入后台,这个后台是提供给产品人员使用,可以向某个游戏的某个特定分区

SQLSTATE[HY000] [2003] Can't connect to MySQL server on 'XXX' (13)

SQLSTATE[HY000] [2003] Can't connect to MySQL server on 'XXX' (13) 我可以真见识了 SELinux 的利害了, 这个问题让我找了好长时间的原因:结果是 SELinux 不让 httpd 访问外网,昨天安装 Chrome 浏览器,结果不让 在根帐号下运行 .....SQLSTATE[HY000] [2003] Can't connect to MySQL server on 'XXX' (13)解决方法:Selinux 的设置 Ca

Procedure execution failed 2013 - Lost connection to MySQL server during query

1 错误描述 Procedure execution failed 2013 - Lost connection to MySQL server during query 2 错误原因 由错误描述可知,是在查询的过程中,数据库失去连接 3 解决办法 重新连接数据库

[转载][MySQL]slave have equal MySQL Server UUIDs原因及解决

最近在部署MySQL主从复制架构的时候,碰到了"Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs;  these UUIDs must be different for replication to work." 这个错误提示.即主从架构中使用了相同的UUID.检查server_id系统变量,已经是不同的设置,那原因是

关于MySQL错误 2005 - Unknown MySQL server host 'localhost' (0) 原因及解决方法

今天在外面开navicat for mysql的时候,怎么也连不上自己本机上的数据库,一直显示2005 - Unknown MySQL server host 'localhost' (0): 错误代码的意思即无法连接上主机localhost.可能是由于没有联网造成的:于是将连接属性里的 '主机名或IP地址' 改成127.0.0.1即回送地址后,就可以连接上了.上百度搜了下,navicat里的一些功能应该是要联网的,而localhost是需要DNS解析后才会是127.0.0.1的,所以才会导致这

MySQL server has gone away报错原因分析/

在平时和开发的交流 以及 在论坛回答问题的或称中会发现这个问题被问及的频率非常高. 程序中报错: MySQL server has gone away 是什么意思? 如何避免? 因此,感觉有必要总结一下发生这个问题的原因.今天正好看到一篇外文blog总结的比较好,就翻译过来了 原文:http://ronaldbradford.com/blog/sqlstatehy000-general-error-2006-mysql-server-has-gone-away-2013-01-02/ 原因1.

slave have equal MySQL Server UUIDs原因及解决

最近在部署MySQL主从复制架构的时候,碰到了"Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs;  these UUIDs must be different for replication to work." 这个错误提示.即主从架构中使用了相同的UUID.检查server_id系统变量,已经是不同的设置,那原因是

MySQL server has gone away报错原因分析及解决办法

原因1. MySQL 服务宕了 判断是否属于这个原因的方法很简单,执行以下命令,查看mysql的运行时长 $ mysql -uroot -p -e "show global status like 'uptime';" +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Uptime | 68928 | +---------------+-------+ 1 row in set

黄聪:Wordpress、PHP使用POST数据过大导致MySQL server has gone away报错原因分析

错误原因: 当POST的数据超过 max_allowed_packet 就会报 MySQL server has gone away 的错误. 1.查看当前Mysql的 max_allowed_packet show global variables like 'max_allowed_packet'; 默认的 max_allowed_packet 是 1M ,也就是说提交的数据大于1M就会报错,我们要修改为16M比较好. 2.修改方法: set global max_allowed_packe