2006 - MySQL server has gone away问题解决

621 阅读3分钟

前言

环境:

Mysql:5.7

操作系统:Windows10

数据库管理工具:Navicat

今天在迁移Mysql数据时,发现使用Navicat导入数据,总是提示2006 - MySQL server has gone away,因此需要解决此问题保证数据导入成功

原因排查

解决一个问题之前,首先要了解问题是什么,如何发生的?

2006 - MySQL server has gone away 提示信息一般表示client和MySQL server之间的链接断开了。常见问题有以下几种:

原因1:SQL操作时间过长或者传送数据过大,会导致此错误,此类问题最常见,大部分问题均为此原因

我的导入数据中有一段复杂JSON,因此我初步判断问题应该为传送数据过大,

使用show VARIABLES like '%max_allowed_packet%'; 查看当前配置

发现当前配置为 4194304 即 4*1024*1024 4M

修改配置为 20*1024*1024= 20971520  即20M 

set global max_allowed_packet = 2*1024*1024*10

再次导入,导入成功,本问题解决

原因2:Mysql服务宕机

排查方案1:windows+R/开始-运行-命令提示符 --》services.msc 查看Mysql是否在运行

排查方案2:show global status like 'uptime';  Uptime 105733    105733单位为秒 若运行很久说明服务未宕机

经排查非此问题

原因3:mysql连接超时

即某个mysql长连接很久没有新的请求发起,达到了server端的timeout,被server强行关闭。 此后再通过这个connection发起查询的时候,就会报错server has gone away,这种一般出现在PHP脚本中

排查方案1:show global variables like '%timeout';查看连接超时时间

connect_timeout 10 

delayed_insert_timeout 300 

have_statement_timeout YES 

innodb_flush_log_at_timeout 1 

innodb_lock_wait_timeout 50 

innodb_rollback_on_timeout OFF 

interactive_timeout 28800

 lock_wait_timeout 31536000 

net_read_timeout 30 

net_write_timeout 60 

rpl_stop_slave_timeout 31536000 

slave_net_timeout 60 

wait_timeout 28800

我们一般只关注wait_timeout   连接超时时间为28800单位为秒 即mysql链接在无操作28800秒后被自动关闭

排查方案2:show processlist(查看100条连接/线程)/show full processlist(查看所有连接/线程)

若有正在使用的连接则State为starting 说明有可用连接

经排查非此问题

 原因4:mysql请求链接进程被主动kill

此类错误是mysql主动kill正在运行的线程,绝大部分不会发生,我这边mysql为本地mysql,我并没有主动kill任何连接,因此非此错误

总结

2006 - MySQL server has gone away提示信息一般表示client和MySQL server之间的链接断开了

常见原因有:

1.SQL操作时间过长或者传送数据过大,会导致此错误,此类问题最常见,大部分问题均为此原因

2:Mysql服务宕机

3:mysql连接超时

4:mysql请求链接进程被主动kill

建议排查顺序按照1-4的顺序进行排查解决,大部分问题均为1/2引起的

具体排查与解决方案见上