有时在使用mysql的时候会接收到“MySQL server has gone away”错误,这个错误会有以下
原因:
1)、mysql数据库挂了或者关闭了
之前遇到PVD那边有脚本不停的重启MySQL导致查询时会收到这样的错误。
2)、网络不稳定
3)、等待超时
Interactive_timeout:交互式客户端在断开连接之前等待活动多长时间,即服务器等待多久来读取一条命令。
手册上说在交互模式下使用的是interactive_timeout,check_connection函数在建立连接初期,如果为交互模式则将interactive_timeout值赋给wait_timeout,骗您误以为交互模式下等待超时为interactive_timeout。
Wait_timeout:在断开连接前等待任何客户端中活动的时间,默认值为28800(8小时)。。
Net_read_timeout:从客户端写入MYSQL服务器等待应答的时间。
Net_write_timeout:客户端从服务器中读取时等待的时间。
connect_out是个例外,如果你遇到了这个限制,你会得到“Lost connection to mysql at 'reading authorization packet'”错误。
绝大多数这些限制的现象就是“mysql server has gone away”错误或者“Lost connect tomysql server during query”错误。
解决方案:
首先确定引起问题的原因,查看错误日志如果发现数据库挂掉或重启引起,则找到挂掉或重启的原因并解决。
临时增加*timeout变量,重新运行应用程序。如果超时频率这时变小,你可以肯定是超时时间的问题,但是需要找到真正错误原因。这可能是运行很久的应用程序,对大表访问慢或者不稳定的网络。
补充:
今天在优化业务SQL时,在执行我很多union all组成的一个语句时,报出“Lost connect tomysql server during query”。
这个查询是在我们自己的一个mysql数据库中间件上执行的(这个中间件就是实现了分布式的功能,下面挂了多个mysql,类似阿里的cobar和开源的mycat),
后来定位出问题是因为我们中间件的一个bug,导致这个查询执行时中间件就挂掉了,然后客户端收到了“Lost connect tomysql server during query”,把那个sql改小一点尽然可以了。