一般来说,错误:
错误: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]
section 下,而不是[mysql]
.
不要害怕使用大量数字进行测试(例如1G
)。
不要忘记重新启动 MySQL/MariaDB 服务器。
仔细检查该值是否通过以下方式正确设置:
mysql -sve "SELECT @@max_allowed_packet" # or:
mysql -sve "SHOW VARIABLES LIKE 'max_allowed_packet'"
您从客户端的 TCP/IP 连接超时。
解决方案:增加wait_timeout
变量。
您尝试在关闭与服务器的连接后运行查询。
解决方案:应更正应用程序中的逻辑错误。
主机名查找失败(例如 DNS 服务器问题),或服务器已使用--skip-networking
选项启动。
另一种可能性是您的防火墙阻止了 MySQL 端口(例如,默认情况下为 3306)。
正在运行的线程已被杀死,因此请重试。
您遇到了服务器在执行查询时死机的错误。
在不同主机上运行的客户端没有必要的连接权限。
还有更多,请在以下位置了解更多信息:B.5.2.9 MySQL 服务器已消失。
调试
以下是一些专家级的调试想法:
检查日志,例如
sudo tail -f $(mysql -Nse "SELECT @@GLOBAL.log_error")
mysql
通过或telnet
ping 函数(例如mysql_ping
在 PHP 中)测试您的连接。
用于tcpdump
嗅探 MySQL 通信(不适用于套接字连接),例如:
sudo tcpdump -i lo0 -s 1500 -nl -w- port mysql | strings
在 Linux 上,使用strace
. 在 BSD/Mac 上使用dtrace
/ dtruss
,例如
sudo dtruss -a -fn mysqld 2>&1
请参阅: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;
}