前言
环境:
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引起的
具体排查与解决方案见上