我在办公室运行服务器来处理一些文件并将结果报告给远程 MySQL 服务器。
文件处理需要一些时间,并且该过程中途终止并出现以下错误:
2006, MySQL server has gone away
我听说过 MySQL 设置wait_timeout,但我需要在我办公室的服务器或远程 MySQL 服务器上更改它吗?
我在办公室运行服务器来处理一些文件并将结果报告给远程 MySQL 服务器。
文件处理需要一些时间,并且该过程中途终止并出现以下错误:
2006, MySQL server has gone away
我听说过 MySQL 设置wait_timeout,但我需要在我办公室的服务器或远程 MySQL 服务器上更改它吗?
我已经多次遇到这种情况,我通常发现答案是max_allowed_packet
.
将它/etc/my.cnf
(下[mysqld]
)提高到 8 或 16M 通常可以修复它。(MySql 5.7 中的默认4194304
值为 4MB。)
[mysqld]
max_allowed_packet=16M
注意:如果该行不存在,只需创建该行
注意:这可以在您的服务器上设置,因为它正在运行。
注意:在 Windows 上,您可能需要使用 ANSI 而不是 UTF-8 编码保存 my.ini 或 my.cnf 文件。
使用set global max_allowed_packet=104857600
. 这将其设置为 100MB。
我遇到了同样的问题,但是max_allowed_packet
在下面的my.ini/my.cnf
文件中[mysqld]
进行了更改就成功了。
添加一行
max_allowed_packet=500M
现在restart the MySQL service
,一旦你完成了。
我在 MySQL 命令行中使用以下命令来恢复大小超过 7GB 的 MySQL 数据库,并且它可以工作。
set global max_allowed_packet=268435456;
检查连接是否并在需要时重新建立连接可能会更容易。
有关这方面的信息,请参见PHP:mysqli_ping。
Error: 2006 (CR_SERVER_GONE_ERROR)
Message: MySQL server has gone away
Generally you can retry connecting and then doing the query again to solve this problem - try like 3-4 times before completely giving up.
I'll assuming you are using PDO. If so then you would catch the PDO Exception, increment a counter and then try again if the counter is under a threshold.
If you have a query that is causing a timeout you can set this variable by executing:
SET @@GLOBAL.wait_timeout=300;
SET @@LOCAL.wait_timeout=300; -- OR current session only
Where 300 is the number of seconds you think the maximum time the query could take.
Further information on how to deal with Mysql connection issues.
EDIT: Two other settings you may want to also use is net_write_timeout
and net_read_timeout
.
此错误有多种原因。
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
CONN_MAX_AGE
(请参阅文档)SHOW VARIABLES LIKE '%time%';
mysqladmin variables
log_warnings = 4
log_error_verbosity = 3
此错误是由于 wait_timeout 过期而发生的。
只需去 mysql 服务器检查它的 wait_timeout :
mysql> 显示像'wait_timeout'这样的变量
mysql> set global wait_timeout = 600 # 10分钟或你需要的最大等待时间
http://sggoyal.blogspot.in/2015/01/2006-mysql-server-has-gone-away.html
如果您使用的是 xampp 服务器:
转到 xampp -> mysql -> bin -> my.ini
更改以下参数:
max_allowed_packet = 500M
innodb_log_file_size = 128M
这对我帮助很大:)
在 Windows 上,那些使用 xampp 的人应该使用这个路径 xampp/mysql/bin/my.ini 并将 max_allowed_packet(under section[mysqld]) 更改为您选择的大小。例如
max_allowed_packet=8M
再次在 php.ini(xampp/php/php.ini) 上更改 upload_max_filesize 选择大小。例如
upload_max_filesize=8M
让我头疼了一段时间,直到我发现了这一点。希望能帮助到你。
我在 DigitalOcean Ubuntu 服务器上遇到了同样的错误。
我尝试更改 max_allowed_packet 和 wait_timeout 设置,但它们都没有修复它。
原来我的服务器内存不足。我添加了一个 1GB 的交换文件,这解决了我的问题。
检查你的记忆,free -h
看看这是否是导致它的原因。
这对我来说是 RAM 问题。
即使在具有 12 个 CPU 内核和 32 GB RAM 的服务器上,我也遇到了同样的问题。我进行了更多研究并试图释放 RAM。这是我在 Ubuntu 14.04 上用来释放 RAM 的命令:
sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
而且,它修复了一切。我已将其设置为 cron 每小时运行一次。
crontab -e
0 * * * * bash /root/ram.sh;
并且,您可以使用此命令来检查有多少可用 RAM:
free -h
而且,你会得到这样的东西:
total used free shared buffers cached
Mem: 31G 12G 18G 59M 1.9G 973M
-/+ buffers/cache: 9.9G 21G
Swap: 8.0G 368M 7.6G
在我的情况下,它是变量的低值open_files_limit
,它阻止了 mysqld 对数据文件的访问。
我检查了它:
mysql> SHOW VARIABLES LIKE 'open%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| open_files_limit | 1185 |
+------------------+-------+
1 row in set (0.00 sec)
在我将变量更改为大值后,我们的服务器再次活跃:
[mysqld]
open_files_limit = 100000
如果您使用的是 64 位 WAMPSERVER,请搜索多次出现的max_allowed_pa cket,因为 WAMP 使用 [wampmysqld64] 下设置的值,而不是 [mysqldump] 下设置的值,这对我来说是个问题,我更新了错误的值。将此设置为 max_allowed_packet = 64M。
希望这可以帮助其他 Wampserver 用户。
这通常表示MySQL 服务器连接问题或超时。通常可以通过更改my.cnf或类似文件中的wait_timeout和max_allowed_pa cket 来解决。
我会建议这些值:
等待超时 = 28800
max_allowed_packet = 8M
检查 Mysql 服务器的日志总是一个好主意,因为它消失了。
它会告诉你。
MAMP 5.3,您将找不到 my.cnf 并且添加它们不起作用,因为 max_allowed_packet 存储在变量中。
一种解决方案可以是:
运行以下查询,它将 max_allowed_packet 设置为 7gb:
设置全局 max_allowed_packet=268435456;
对于某些人,您可能还需要增加以下值:
set global wait_timeout = 600;
set innodb_log_file_size =268435456;
对于 Vagrant Box,确保为盒子分配了足够的内存
config.vm.provider "virtualbox" do |vb|
vb.memory = "4096"
end
The unlikely scenario is you have a firewall between the client and the server that forces TCP reset into the connection.
I had that issue, and I found our corporate F5 firewall was configured to terminate inactive sessions that are idle for more than 5 mins.
Once again, this is the unlikely scenario.
这可能是您的 .sql 文件大小的问题。
如果您使用的是 xampp。进入xampp控制面板->点击MySql config->打开my.ini。
增加数据包大小。
max_allowed_packet = 2M -> 10M
我找到了“#2006 - MySQL server has gone away”这个错误的解决方案。解决方案是你只需要检查两个文件
这些文件在 windows 中的路径是
C:\wamp64\apps\phpmyadmin4.6.4
在这两个文件中这个值:
$cfg['Servers'][$i]['host']must be 'localhost' .
就我而言,它是:
$cfg['Servers'][$i]['host'] = '127.0.0.1';
将其更改为:
"$cfg['Servers'][$i]['host']" = 'localhost';
确保两者:
最后一组:
$cfg['Servers'][$i]['AllowNoPassword'] = true;
然后重新启动 Wampserver。
更改 phpmyadmin 用户名和密码
可以通过config.inc.php文件直接修改phpmyadmin的用户名和密码
这两行
$cfg['Servers'][$i]['user'] = 'root';
$cfg['Servers'][$i]['password'] = '';
在这里您可以提供新的用户名和密码。更改后保存文件并重新启动 WAMP 服务器。
取消注释下面的 ligne my.ini/my.cnf
,这会将您的大文件分成较小的部分
# binary logging format - mixed recommended
# binlog_format=mixed
至
# binary logging format - mixed recommended
binlog_format=mixed
我在 docker 添加以下设置时遇到了同样的问题docker-compose.yml
:
db:
image: mysql:8.0
command: --wait_timeout=800 --max_allowed_packet=256M --character-set-server=utf8 --collation-server=utf8_general_ci --default-authentication-plugin=mysql_native_password
volumes:
- ./docker/mysql/data:/var/lib/mysql
- ./docker/mysql/dump:/docker-entrypoint-initdb.d
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
我在 Ubuntu 桌面上的不同 MySQL 客户端软件中收到错误 2006 消息。原来我的JDBC驱动版本太旧了。
发生此错误基本上有两个原因。
您可以在下面尝试此代码。
# Simplification to execute an SQL string of getting a data from the database
def get(self, sql_string, sql_vars=(), debug_sql=0):
try:
self.cursor.execute(sql_string, sql_vars)
return self.cursor.fetchall()
except (AttributeError, MySQLdb.OperationalError):
self.__init__()
self.cursor.execute(sql_string, sql_vars)
return self.cursor.fetchall()
无论其背后的原因是什么,它都会减轻错误,尤其是第二个原因。
如果是内存不足导致的,要么从代码、数据库配置上提高数据库连接效率,要么干脆提高内存。
我也遇到了这个错误。但即使 中max_allowed_packet
的值增加或增加my.cnf
,错误仍然存在。
我所做的是对我的数据库进行故障排除:
SELECT primary_id FROM table
)我想到的解决方案是重新导入数据库。好消息是我有这个数据库的备份。但是我只删除了有问题的表,然后导入了我对该表的备份。这解决了我的问题。
我对这个问题的看法:
latin1_swedish_ci
为utf8_general_ci
对我来说,它有助于修复一个 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 cli 的常规 mysql 命令
OPTIMIZE table theCorruptedTableNameMentionedAboveInTheMysqld.log
对于使用 XAMPP 的用户,C:\xampp\mysql\bin\my.ini 中有 2 个max_allowed_packet参数。
以防万一这对任何人都有帮助:
当我在一个函数中打开和关闭连接时出现此错误,该函数将从应用程序的多个部分调用。我们有太多的连接,所以我们认为重用现有的连接或将其丢弃并创建一个新的连接可能是一个好主意,如下所示:
public static function getConnection($database, $host, $user, $password)
{
if (!self::$instance) {
return self::newConnection($database, $host, $user, $password);
} elseif ($database . $host . $user != self::$connectionDetails) {
self::$instance->query('KILL CONNECTION_ID()');
self::$instance = null;
return self::newConnection($database, $host, $user, $password);
}
return self::$instance;
}
事实证明,我们在杀戮方面有点过于彻底,因此在旧连接上执行重要操作的进程永远无法完成他们的业务。所以我们删除了这些行
self::$instance->query('KILL CONNECTION_ID()');
self::$instance = null;
并且由于机器的硬件和设置允许,我们通过添加来增加服务器上允许的连接数
max_connections = 500
到我们的配置文件。这暂时解决了我们的问题,我们学到了一些关于终止 mysql 连接的知识。
如果您知道自己要离线一段时间,您可以关闭连接、进行处理、重新连接并编写报告。