关于MySQL server has gone away
温馨提示:
本文最后更新于 2020年09月23日,已超过 1,585 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我。
当 php 与mysql之间的连接并非php正常回收,断开时,将会报错 "MySQL server has gone away"
该报错表示 mysql连接已经失效,需要重新发起连接.
具体断开原因有以下几点:
mysql 服务重启
当 mysql服务重启之后,将会断开原有的连接,原来的连接断开之后,php继续调用则会报错,
重启包括异常重启,手动重启
可以通过
show global status like 'uptime';
查看mysql的运行时间,推断出他上次的启动时间.
mysql连接超时
当mysql连接成功之后,如果长时间没有操作,mysql服务器将主动关闭此连接
可以通过
show global variables like 'wait_timeout';
查看mysql服务器的连接等待时间,超过该时间没有进行任何操作,mysql将主动关闭此连接
mysql 连接被kill
mysql连接成功之后,可通过
show PROCESSLIST
查看当前mysql的连接数以及连接状态
可通过 命令,
kill id
进行主动关闭某一个连接
执行语句过长
当 sql 大小超出
show global variables like '%max_allowed_packet%';
时,mysql服务器将拒绝解析数据,直接断开响应,从而导致断开连接
解决方案
现在我们知道了 MySQL server has gone away 具体产生原因,那么如何解决此问题呢?
首先我们需要了解,直接原因是连接断开,连接断开无法避免,没有任何方法可以确保一个tcp连接永远有效,我们只能尽量避免出现此状况.
定时ping连接
在mysql 连接成功之后,为了避免太久没有操作被mysql主动断开,我们可以主动,定时的去操作一次mysql,例如
select 1;
来保证 mysql连接的活跃性
断线重连
就算是定时ping,也可能会因为mysql重启,网络连接动荡导致连接断开,那么我们应该在定时ping 出错的时候,及时回收连接,重新发起连接,确保正常业务不会收到影响
注意sql语句的大小
当执行语句过长时,也会出现断线问题,我们需要在php层就做好对sql语句的判断,不能过长,或者调大mysql的
max_allowed_packet
配置项
正文到此结束
- 本文标签: 数据库
- 本文链接: https://www.php20.cn/article/248
- 版权声明: 本文由仙士可原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权