MySQL文档阅读笔记之MySQL server has gone away

1,314 views

今天下午使用navicat向新的测试环境导入数据时,发现导入操作结束后提示“MySQL server has gone away”;在网上随便搜了搜,发现很多人都遇到过类似的问题,但参照资料里给出的方法,重试几次之后,发现问题并没有得到解决。看来还是要到官网上一挖究竟,下面是阅读笔记。
遇到“MySQL server has gone away”,通常的原因是数据库链接超时,MySQL数据库自动关闭了相应的链接对象。这时可能会遇到如下的错误码及提示信息:

  • CR_SERVER_GONE_ERROR,2006,对应的提示信息是MySQL server has gone away。
  • CR_SERVER_LOST,2013,对应的提示信息是Lost connection to MySQL server during query。

官方文档讲,客户端应用具体接收到哪个错误码,和操作系统相关。这里我很好奇是和MySQL数据库所在的操作系统相关呢,还是和客户端应用所在的操作系统相关,文档中没有细说。
默认情况下,如果一个数据库链接上超过8小时没有做任何数据库操作,MySQL数据库将会关闭这个链接,释放掉相关的资源。如果用户希望修改前述默认行为,可以修改MySQL数据库服务端的配置项wait_timeout,然后重启mysqld就可以使新的参数生效。

其它常见的原因

其它可能导致数据库操作时出现“MySQL server has gone away”错误的场景有:

  • 执行相关数据库操作的线程被意外杀掉了,比如通过mysqladmin kill命令或者执行kill语句。
  • 使用被关闭的数据库链接来执行数据库操作。
  • 运行在另外一台主机上的客户端应用没有必需的访问数据库的权限。
  • 客户应用在网络层API得到一个超时的响应,导致报错。
  • MySQL数据库所在主机网络层API返回了超时,导致数据库链接被关闭,而客户端应用没有重连机制。
  • 使用Windows平台上的MySQL客户端访问MySQL数据库,MySQL数据库先于语句执行前主动关闭了数据库链接。原因是在Windows平台,假如底层的TCP链接异常后,MySQL客户端无法在向MySQL数据库写数据时得到通知,只能在读取数据时得到TCP链接失效的通知。
  • MySQL客户端执行的语句非法,或者数据量过大。比如MySQL数据库收到了过大的报文或者失序的报文,MySQL数据库判定客户端应用出现了问题,将自动关闭链接。这时可以通过修改MySQL客户端和服务器端的参数max_allowed_packet来规避。如果是在使用insert、replace的多值形式插入大量的数据记录,那么除了调整max_allowed_packet外,将数据记录的数量调小,相应的也可以规避本问题。
  • 使用低版本(低于4.0.8)的MySQL客户端和高版本(高于4.0.8)的MySQL服务器通信时,也可能会报错。
  • 主机名查询服务失效,将会导致报错。当启动MySQL数据库时带有选项–skip-networking时,将导致报错。而客户端无法与MySQL数据库通信,比如二者之间的防火墙屏蔽了客户端对MySQL数据库监听端口的访问时,客户端应用也会报错。
  • 一些编程错误,比如fork方式创建的子进程期望共享父进程创建好的数据库链接。
  • MySQL数据库自身的bug。

分析方法

相应的,遇到“MySQL server has gone away”时的分析方法,如下:

  • MySQL数据是否发生了重启。可以通过执行命令mysqladmin version来确认MySQL的启动时间;另外,查看MySQL数据库的error日志也不失为一个好方法。
  • 检查线程是否被强制kill。可以通过执行命令show global status like ‘com_kill’;来确认。
  • 确认max_allowed_packet参数是否过小。可以通过执行命令show global variables like ‘max_allowed_packet’;来检查,注意需要同时修改客户端和服务端的参数配置。
  • 确认wait_timeout和interactive_timeout参数的配置是否合理。
  • 确认连接是否超时。可以通过执行命令show global variables like ‘%timeout’;来检查。


若非注明,均为原创,欢迎转载,转载请注明来源:MySQL文档阅读笔记之MySQL server has gone away

关于 JackieAtHome

基层程序员,八年之后重新启航

此条目发表在 MySQL, 笔记 分类目录,贴了 标签。将固定链接加入收藏夹。