我在办公室运行服务器处理一些文件并将结果报告给远程MySQL服务器。
文件处理需要一些时间,并且过程中途中断,并出现以下错误:
2006, MySQL server has gone away
我听说过MySQL设置, wait_timeout ,但我是否需要在办公室或远程MySQL服务器的服务器上进行更改?
答案 0 :(得分:323)
我已经多次遇到这种情况,我通常认为答案是max_allowed_packet
的默认设置非常低。
将/etc/my.cnf
([mysqld]
下)提升到8或16M通常可以修复它。 (MySql 5.7中的默认值为4194304
,即4MB。)
[mysqld]
max_allowed_packet=16M
注意:只需创建不存在的行
注意:这可以在服务器运行时设置。
使用set global max_allowed_packet=104857600
。这将它设置为100MB。
答案 1 :(得分:38)
我遇到了同样的问题,但在max_allowed_packet
下的my.ini/my.cnf
文件中更改[mysqld]
就成了伎俩。
添加一行
完成后,max_allowed_packet的= 500M
现在restart the MySQL service
。
答案 2 :(得分:30)
检查连接是否更容易,并在需要时重新建立连接。
有关相关信息,请参阅PHP:mysqli_ping。
答案 3 :(得分:30)
我在MySQL命令行中使用了以下命令来恢复大小超过7GB的MySQL数据库,并且它可以工作。
set global max_allowed_packet=268435456;
答案 4 :(得分:15)
错误: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是您认为查询可以花费的最长时间的秒数。
Further information on how to deal with Mysql connection issues.
编辑:您可能还想使用的其他两项设置是net_write_timeout
和net_read_timeout
。
答案 5 :(得分:15)
答案 6 :(得分:10)
由于wait_timeout过期而发生此错误。
只需转到mysql服务器检查其wait_timeout:
的MySQL>显示变量类似于等待时间'
的MySQL>设置全局wait_timeout = 600#10分钟或最长等待时间 出你需要
http://sggoyal.blogspot.in/2015/01/2006-mysql-server-has-gone-away.html
答案 7 :(得分:9)
我在DigitalOcean Ubuntu服务器上遇到同样的错误。
我尝试更改max_allowed_packet和wait_timeout设置,但都没有修复它。
事实证明我的服务器没有内存。我添加了1GB swap file,这解决了我的问题。
使用free -h
检查您的记忆,看看它是否是导致记忆的原因。
答案 8 :(得分:8)
在Windows上,使用xampp的人应使用此路径xampp / mysql / bin / my.ini并将max_allowed_packet(在[mysqld]部分下)更改为您的选择大小。 e.g
max_allowed_packet=8M
再次在php.ini(xampp / php / php.ini)上更改upload_max_filesize的选择大小。 e.g
upload_max_filesize=8M
让我头疼一段时间,直到我发现这一点。希望它有所帮助。
答案 9 :(得分:6)
这对我来说是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
答案 10 :(得分:4)
对于Vagrant Box,请确保为盒子分配足够的内存
config.vm.provider "virtualbox" do |vb|
vb.memory = "4096"
end
答案 11 :(得分:4)
在我的情况下,它是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
答案 12 :(得分:4)
这通常表示 MySQL服务器连接问题或超时。 通常可以通过更改 my.cnf 或类似文件中的 wait_timeout 和 max_allowed_packet 来解决。
我建议这些值:
wait_timeout = 28800
max_allowed_packet = 8M
答案 13 :(得分:4)
不太可能的情况是客户端和服务器之间有防火墙强制TCP重置为连接。
我遇到了这个问题,我发现我们的公司F5防火墙配置为终止闲置超过5分钟的非活动会话。
再次,这是不太可能的情况。
答案 14 :(得分:4)
如果您使用的是64位WAMPSERVER,请搜索多次出现 max_allowed_packet ,因为WAMP使用[wampmysqld64]下设置的值而不是[mysqldump]下设置的值,这对我来说是问题,我正在更新错误的。将其设置为max_allowed_packet = 64M。
希望这有助于其他Wampserver用户。
答案 15 :(得分:3)
我找到了解决方案“#2006 - MySQL服务器已经消失”这个错误。 解决方案就是你必须检查两个文件
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服务器。
答案 16 :(得分:3)
检查Mysql服务器的日志总是一个好主意,因为它消失了。
它会告诉你。
答案 17 :(得分:3)
取消注释my.ini/my.cnf
下方的ligne,这会将您的大文件拆分为较小的部分
# binary logging format - mixed recommended
# binlog_format=mixed
TO
# binary logging format - mixed recommended
binlog_format=mixed
答案 18 :(得分:2)
这可能是.sql文件大小的问题。
如果您使用的是xampp。转到xampp控制面板 - >单击MySql config - >打开my.ini。
增加数据包大小。
max_allowed_packet = 2M -> 10M
答案 19 :(得分:2)
我在Ubuntu桌面上的不同MySQL客户端软件中收到了错误2006消息。事实证明我的JDBC驱动程序版本太旧了。
答案 20 :(得分:2)
如果您使用的是xampp服务器:
转到xampp-> mysql-> bin-> my.ini
更改以下参数:
max_allowed_packet = 500M
innodb_log_file_size = 128M
这对我很有帮助:)
答案 21 :(得分:1)
我也遇到了这个错误。但即使增加了 max_allowed_packet
或增加了 my.cnf
中的任何值,错误仍然存在。
我所做的是对数据库进行故障排除:
SELECT primary_id FROM table
)我想到的解决办法是重新导入数据库。好消息是我有这个数据库的备份。但是我只删除了有问题的表,然后导入了我对这个表的备份。这解决了我的问题。
我对这个问题的总结:
latin1_swedish_ci
更改为 utf8_general_ci
答案 22 :(得分:0)
对于使用XAMPP的用户,C:\ xampp \ mysql \ bin \ my.ini中有2个 max_allowed_packet 参数。
答案 23 :(得分:0)
此错误的发生基本上有两个原因。
您可以在下面尝试此代码。
# 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()
无论其背后的原因是什么,它都会减轻错误,尤其是第二个原因。
如果这是由于RAM不足引起的,则必须通过代码,数据库配置来提高数据库连接效率,或者只是提高RAM。
答案 24 :(得分:0)
此错误有多种原因。
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
(请参阅docs)SHOW VARIABLES LIKE '%time%';
mysqladmin variables
log_warnings = 4
log_error_verbosity = 3
答案 25 :(得分:0)
如果使用XAMPP,则有一种更简单的方法。
打开XAMPP控制面板,然后单击mysql部分中的config按钮。
现在单击my.ini,它将在编辑器中打开。将max_allowed_packet更新为您所需的大小。
然后重新启动mysql服务。单击停止在Mysql服务上,再次单击开始。等待几分钟。
然后尝试再次运行您的Mysql查询。希望它能工作。
答案 26 :(得分:0)
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;
答案 27 :(得分:0)
以防万一这可以帮助任何人:
当我在应用程序的多个部分中调用的函数中打开和关闭连接时遇到此错误。 我们有太多的连接,因此我们认为最好重用现有的连接或将其丢弃并创建一个新的连接,如下所示:
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; 返回self :: newConnection($ database,$ host,$ user,$ password); } 返回self :: $ instance; } 事实证明,我们对杀戮的处理过于彻底,因此在旧连接上执行重要操作的流程永远无法完成业务。 所以我们删除了这些行
self::$instance->query('KILL CONNECTION_ID()');
self::$instance = null;
并且由于机器的硬件和设置允许,我们通过添加
来增加服务器上允许的连接数max_connections = 500
到我们的配置文件。到目前为止,这已解决了我们的问题,并且我们了解了有关终止mysql连接的知识。
答案 28 :(得分:0)
我在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}
答案 29 :(得分:-5)
如果您知道自己离线了一段时间,可以关闭连接,进行处理,重新连接并撰写报告。