当我尝试获取大型SQL文件(一个大INSERT
查询)时,我收到此错误.
mysql> source file.sql
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 2
Current database: *** NONE ***
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 3
Current database: *** NONE ***
Run Code Online (Sandbox Code Playgroud)
表中没有任何内容更新.我已经尝试删除和取消删除表/数据库,以及重新启动MySQL.这些都不能解决问题.
这是我的最大包大小:
+--------------------+---------+
| Variable_name | Value |
+--------------------+---------+
| max_allowed_packet | 1048576 |
+--------------------+---------+
Run Code Online (Sandbox Code Playgroud)
这是文件大小:
$ ls -s file.sql
79512 file.sql
Run Code Online (Sandbox Code Playgroud)
当我尝试其他方法时......
$ ./mysql -u root -p my_db < file.sql
Enter password:
ERROR 2006 (HY000) at line 1: MySQL server has gone away
Run Code Online (Sandbox Code Playgroud)
Kur*_*ong 529
max_allowed_packet=64M
Run Code Online (Sandbox Code Playgroud)
将此行添加到my.cnf
文件中可以解决我的问题.
当列具有较大的值(这会导致问题)时,这很有用,您可以在此处找到解释.
在Windows上,此文件位于:"C:\ ProgramData\MySQL\MySQL Server 5.6"
在Linux(Ubuntu)上:/ etc/mysql
Nan*_*mar 140
您可以增加最大允许数据包
SET GLOBAL max_allowed_packet=1073741824;
Run Code Online (Sandbox Code Playgroud)
http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_max_allowed_packet
Mar*_*hev 61
由于某种原因,全局更新和my.cnf设置对我不起作用.将max_allowed_packet
值直接传递给客户端在这里工作:
mysql -h <hostname> -u username -p --max_allowed_packet=1073741824 <databasename> < db.sql
Run Code Online (Sandbox Code Playgroud)
ken*_*orb 33
一般来说错误:
错误:2006(
CR_SERVER_GONE_ERROR
) - MySQL服务器已经消失
表示客户端无法向服务器发送问题.
mysql
进口在您通过导入数据库文件的特定情况下mysql
,这很可能意味着SQL文件中的某些查询太大而无法导入,并且无法在服务器上执行,因此客户端在第一次发生的错误时失败.
所以你有以下几种可能性:
添加强制选项(-f
)mysql
以继续并执行其余查询.
如果数据库有一些与缓存无关的大型查询,则这很有用.
增加max_allowed_packet
并wait_timeout
在您的服务器配置(例如~/.my.cnf
).
使用--skip-extended-insert
选项转储数据库以分解大型查询.然后再次导入它.
尝试应用--max-allowed-packet
选项mysql
.
一般来说,这个错误可能意味着几件事,例如:
对服务器的查询不正确或太大,
解决方案:增加max_allowed_packet
变量.
确保变量在[mysqld]
截面下,而不是[mysql]
.
不要害怕使用大数字进行测试(比如1G
).
不要忘记重启MySQL/MariaDB服务器.
仔细检查值是否正确设置:
mysql -sve "SELECT @@max_allowed_packet" # or:
mysql -sve "SHOW VARIABLES LIKE 'max_allowed_packet'"
Run Code Online (Sandbox Code Playgroud)您从客户端的TCP/IP连接获得超时.
解决方案:增加wait_timeout
变量.
您尝试在关闭服务器连接后运行查询.
解决方案:应纠正应用程序中的逻辑错误.
主机名查找失败(例如DNS服务器问题),或者服务器已启动--skip-networking
选项.
另一种可能性是您的防火墙阻止MySQL端口(例如默认情况下为3306).
正在运行的线程已被杀死,因此请重试.
您遇到了执行查询时服务器死机的错误.
在不同主机上运行的客户端没有必要的连接权限.
还有更多,所以在以下方面了解更多:B.5.2.9 MySQL服务器已经消失.
以下是一些专家级调试思路:
检查日志,例如
sudo tail -f $(mysql -Nse "SELECT @@GLOBAL.log_error")
Run Code Online (Sandbox Code Playgroud)经测试您的连接mysql
,telnet
或ping功能(例如mysql_ping
在PHP).
使用tcpdump
嗅出了MySQL通信(不适用于套接字连接的),例如:
sudo tcpdump -i lo0 -s 1500 -nl -w- port mysql | strings
Run Code Online (Sandbox Code Playgroud)在Linux上,使用strace
.在BSD/Mac上使用dtrace
/ dtruss
,例如
sudo dtruss -a -fn mysqld 2>&1
Run Code Online (Sandbox Code Playgroud)
请参阅:DTracing MySQL入门
了解更多如何在以下位置调试MySQL服务器或客户端:26.5调试和移植MySQL.
作为参考,检查sql-common/client.c
负责抛出CR_SERVER_GONE_ERROR
客户端命令错误的文件中的源代码.
MYSQL_TRACE(SEND_COMMAND, mysql, (command, header_length, arg_length, header, arg));
if (net_write_command(net,(uchar) command, header, header_length,
arg, arg_length))
{
set_mysql_error(mysql, CR_SERVER_GONE_ERROR, unknown_sqlstate);
goto end;
}
Run Code Online (Sandbox Code Playgroud)
Zlo*_*niy 18
以防万一,检查你可以使用的变量
$> mysqladmin variables -u user -p
Run Code Online (Sandbox Code Playgroud)
这将显示当前变量,在本例中为max_allowed_packet,并且正如有人在另一个答案中所说,您可以暂时设置它
mysql> SET GLOBAL max_allowed_packet=1072731894
Run Code Online (Sandbox Code Playgroud)
在我的情况下,没有考虑cnf文件,我不知道为什么,所以SET GLOBAL代码确实有帮助.
Luk*_*oen 18
我通过ERROR 2006 (HY000) at line 97: MySQL server has gone away
按顺序执行以下两个步骤解决了错误并成功迁移了> 5GB的sql文件:
像其他人推荐的那样创建/etc/my.cnf,其内容如下:
[mysql]
connect_timeout = 43200
max_allowed_packet = 2048M
net_buffer_length = 512M
debug-info = TRUE
Run Code Online (Sandbox Code Playgroud)将标志附加--force --wait --reconnect
到命令(即mysql -u root -p -h localhost my_db < file.sql --verbose --force --wait --reconnect
).
重要说明:必须执行这两个步骤,因为如果我不打算对/etc/my.cnf文件进行更改以及附加这些标志,则导入后会丢失一些表.
使用的系统:OSX El Capitan 10.11.5; mysql Ver 14.14 for osx10.8(i386)发布5.5.51
Sat*_*h D 11
我有同样的问题,但在[mysqld]下的my.ini/my.cnf文件中更改max_allowed_packet就成了伎俩.
添加一行
max_allowed_packet=500M
Run Code Online (Sandbox Code Playgroud)
完成后立即重启MySQL服务.
raz*_*zed 11
您也可以以root用户身份(或SUPER权限)登录数据库并执行此操作
set global max_allowed_packet=64*1024*1024;
Run Code Online (Sandbox Code Playgroud)
也不需要MySQL重启.请注意,您应my.cnf
按照其他解决方案中的说明修复文件:
[mysqld]
max_allowed_packet=64M
Run Code Online (Sandbox Code Playgroud)
并在重新启动MySQL后确认更改:
show variables like 'max_allowed_packet';
Run Code Online (Sandbox Code Playgroud)
您也可以使用命令行,但这可能需要更新启动/停止脚本,这些脚本可能无法在系统更新和修补程序中使用.
根据要求,我在这里添加自己的答案.很高兴看到它的作品!
小智 9
解决方案是在标签下增加选项文件中的值wait_timeout
和connect_timeout
参数[mysqld]
.
我不得不恢复400MB的mysql备份,这对我有用(我在下面使用的值有点夸张,但你明白了):
[mysqld]
port=3306
explicit_defaults_for_timestamp = TRUE
connect_timeout = 1000000
net_write_timeout = 1000000
wait_timeout = 1000000
max_allowed_packet = 1024M
interactive_timeout = 1000000
net_buffer_length = 200M
net_read_timeout = 1000000
set GLOBAL delayed_insert_timeout=100000
Run Code Online (Sandbox Code Playgroud)
这里可能会发生一些事情;
INSERT
的运行时间很长,客户端正在断开连接.当它重新连接时,它没有选择数据库,因此错误.这里的一个选项是从命令行运行批处理文件,并在参数中选择数据库,如下所示;$ mysql db_name <source.sql
php
或其他语言运行您的命令.在每个长时间运行的语句之后,您可以关闭并重新打开连接,确保在每个查询开始时连接.如果您在Mac上并且通过像我这样的brew安装mysql,则可以使用以下方法。
cp $(brew --prefix mysql)/support-files/my-default.cnf /usr/local/etc/my.cnf
添加max_allowed_packet=1073741824
到/usr/local/etc/my.cnf
mysql.server restart