我正在办公室运行一台服务器来处理一些文件,并将结果报告给远程MySQL服务器。
文件处理需要一段时间,进程中途死亡,并出现以下错误:
2006, MySQL server has gone away
我听说过MySQL的设置,wait_timeout,但是我需要在我办公室的服务器或远程MySQL服务器上更改它吗?
我正在办公室运行一台服务器来处理一些文件,并将结果报告给远程MySQL服务器。
文件处理需要一段时间,进程中途死亡,并出现以下错误:
2006, MySQL server has gone away
我听说过MySQL的设置,wait_timeout,但是我需要在我办公室的服务器或远程MySQL服务器上更改它吗?
当前回答
对我来说,它有助于修复一个innodb表的损坏的索引树。我用这个命令本地化了这样一个表
mysqlcheck -uroot --databases databaseName
结果
mysqlcheck: Got error: 2013: Lost connection to MySQL server during query when executing 'CHECK TABLE ...
如下所示,我只能从mysqld日志/var/log/mysqld.log中看到哪个表造成了问题。
FIL_PAGE_PREV links 2021-08-25T14:05:22.182328Z 2 [ERROR] InnoDB: Corruption of an index tree: table `database`.`tableName` index `PRIMARY`, father ptr page no 1592, child page no 1234'
mysqlcheck命令并没有修复它,但帮助揭示了它。 最终,我通过mysql命令行中一个常规的mysql命令来修复它
OPTIMIZE table theCorruptedTableNameMentionedAboveInTheMysqld.log
其他回答
如果你使用xampp服务器:
打开xampp -> mysql -> bin -> my.ini
参数如下:
max_allowed_packet = 500M
innodb_log_file_size = 128M
这对我帮助很大:)
MAMP 5.3,你不会找到my.cnf,添加它们不工作,因为max_allowed_packet存储在变量中。
一种解决方案是:
访问http://localhost/phpmyadmin 转到SQL选项卡 运行SHOW VARIABLES并检查值,如果值小,则运行大值 运行下面的查询,它将max_allowed_packet设置为7gb: 设置全局max_allowed_packet=268435456;
对于某些情况,您可能还需要增加以下值:
set global wait_timeout = 600;
set innodb_log_file_size =268435456;
造成这个错误的原因有几个。
MySQL / MariaDB相关:
wait_timeout—服务器在关闭连接之前等待连接激活的时间(以秒为单位)。 interactive_timeout—服务器等待交互连接的时间(以秒为单位)。 max_allowed_packet -数据包或生成/中间字符串的最大字节数。设置为最大的BLOB大小,为1024的倍数。
my.cnf的示例:
[mysqld]
# 8 hours
wait_timeout = 28800
# 8 hours
interactive_timeout = 28800
max_allowed_packet = 256M
服务器相关:
你的服务器有完整的内存-用free -h检查内存信息
框架相关:
检查框架的设置。以Django为例,使用CONN_MAX_AGE(参见docs)
如何调试它:
检查MySQL/MariaDB变量的值。 使用sql:显示变量'%time%'; 命令行:mysqladmin变量 为错误打开verbose: MariaDB: log_warnings = 4 MySQL: log_error_verbosity = 3 有关错误的更多信息,请查看文档
错误:2006 (CR_SERVER_GONE_ERROR)
消息:MySQL服务器已经消失了
通常,您可以重试连接,然后再次执行查询来解决这个问题-在完全放弃之前尝试3-4次。
我假设您正在使用PDO。如果是这样,那么您将捕获PDO异常,增加一个计数器,然后在计数器低于阈值时再次尝试。
如果你有一个导致超时的查询,你可以执行以下命令来设置这个变量:
SET @@GLOBAL.wait_timeout=300;
SET @@LOCAL.wait_timeout=300; -- OR current session only
其中300是您认为查询可能花费的最大时间的秒数。
关于如何处理Mysql连接问题的进一步信息。
编辑:您可能还想使用的另外两个设置是net_write_timeout和net_read_timeout。
检查连接是否存在并在需要时重新建立连接可能更容易。
有关这方面的信息,请参阅PHP:mysqli_ping。