目录
使用navicat premium 12导入mysql的sql文件时,导入失败,出现如下错误:2006 - mysql server has gone away。mysql出现error : (2006, 'mysql server has gone away') 的问题意思就是指client和mysql server之间的链接断开了。
问题
导入的sql文件大概有15m,导入过程中报错:2006 - mysql server has gone away
原因
造成这样的原因 最常见的就是采集或者新旧数据转化——也就是 一般说sql操作的时间过长,或者是传送的数据太大(例如使用insert ... values的语句过长, 这种情况可以通过修改max_allowed_packed的配置参数来避免,也可以在程序中将数据分批插入(使用mysql limit进行分页,循环分批处理数据)); 应用程序(比如php)长时间的执行批量的mysql语句。执行一个sql,但sql语句过大或者语句中含有blob或者longblob字段。比如,图片数据的处理。都容易引起mysql server has gone away。
一 种可能是发送的sql语句太长,以致超过了max_allowed_packet的大小,如果是这种原因,你只要修改my.cnf,加大max_allowed_packet的值即可。
还有一种可能是因为某些原因导致超时,比如说程序中获取数据库连接时采用了singleton的做法,虽然多次连接数据库,但其实使用的都是同一个连接,而且程序中某两次操作数据库的间隔时间超过了wait_timeout(show status能看到此设置),那么就可能出现问题。最简单的处理方式就是把wait_timeout改大,当然你也可以在程序里时不时顺手mysql_ping()一下,这样mysql就知道它不是一个人在战斗。
解决办法
1、找到mysql安装目录下的my.ini文件,修改max_allowed_packet的大小,根据自己的sql文件的大小设置,一定要大于sql文件。
也可以对wait_timeout和interactive_timeout 进行设置:
wait_timeout=288000
interactive_timeout = 288000
2、修改完之后需要重启mysql服务
3、重启 之后,重新导入sql文件,导入成功。
interactive_timeout针对交互式连接,wait_timeout针对非交互式连接。所谓的交互式连接,即在mysql_real_connect()函数中使用了client_interactive选项。
说得直白一点,通过mysql客户端连接数据库是交互式连接,通过jdbc连接数据库是非交互式连接。
interactive_timeout:交互式连接超时时间(mysql工具、mysqldump等)
wait_timeout:非交互式连接超时时间,默认的连接mysql api程序,jdbc连接数据库等
如何设置和查看
mysql> show global variables like 'wait_timeout';
mysql> show global variables like 'interactive_timeout';
mysql> set global interactive_timeout=1800;
mysql> set global wait_timeout=1800;
show variables like 'max_allowed_packet';