根据官方文档解释的总结下(version 5.6):
mysql server has gone away和Lost connection to server during query这俩一样吗?(是一样的,不过就是操作系统不同提示的信息不同)
“mysql server has gone away”最常见的原因是服务器超时并关闭了连接;通常还是会获得以下错误码之一,具体是什么取决于操作系统
–默认,一个连接在8小时之内什么都没做,连接就会被server关闭,当然可以修改wait_timeout变量把时间调整的长一些
以下是一些可能出现mysql server has gone away 的情况:
– 手动kill掉了连接
– 连接已经关闭再去做查询操作,这种情况需要检查代码逻辑
– 在其他主机上运行的客户端无权限访问mysql服务器
– You got a timeout from the TCP/IP connection on the client side. This may happen if you have been using the commands: mysql_options(…, MYSQL_OPT_READ_TIMEOUT,…) or mysql_options(…, MYSQL_OPT_WRITE_TIMEOUT,…). In this case increasing the timeout may help solve the problem.(这个点没太懂)
– 服务端出现超时,且客户端自动重连被禁用
– 使用的是windows客户端,且服务器已断开连接(获取是因为 wait_timeout参数过期了)在发出命令之前;Windows上的问题是,在某些情况下,在写入与服务器的TCP / IP连接时,MySQL不会从操作系统得到错误,而在尝试从连接中读取答案时却得到错误;
这种情况可以这样:如果自上一次查询以来已经很长时间了,则在连接上执行 mysql_ping(),或者把wait_timeout参数值设置的大一些
– 如果向服务器发送不正确/太大的查询,也会出现这样的错误;当mysqld收到的数据包太大或顺序混乱,则认为客户端出问题了并关闭连接;如果需要做大的查询,可以将查询限制变量 max_allowed_packet 调的大一些,5.6版本默认是4M,之前默认是1M;
插入很多行的insert或replace语句也可能导致此类错误这些语句中的任何一个都将单个请求发送到服务器,而与要插入的行数无关。因此可以通过减少每个insert或replace发送的行数来避免
– 主机名查找失败也会出现该错误;mysql依赖于主机系统进行名称解析,所以网络所依赖的dns服务器出现故障也会有影响
如果在启用了skip_networking系统变量的情况下启动mysql 就可能会看到 has gone away的错误
如果系统防火墙把3306端口给禁用了,也会出现问题
– You can also encounter this error with applications that fork child processes, all of which try to use the same connection to the MySQL server. This can be avoided by using a separate connection for each child process(还可能在子进程的应用程序中遇到此错误:所有应用程序都尝试使用与mysql服务器相同的连接。可以通过为每个子进程都使用单独的连接来避免这种情况)这种场景没想到对应的场景。。。
– 也有可能是个bug 执行查询时服务器挂了