我正在办公室运行一台服务器来处理一些文件,并将结果报告给远程MySQL服务器。
文件处理需要一段时间,进程中途死亡,并出现以下错误:
2006, MySQL server has gone away
我听说过MySQL的设置,wait_timeout,但是我需要在我办公室的服务器或远程MySQL服务器上更改它吗?
我正在办公室运行一台服务器来处理一些文件,并将结果报告给远程MySQL服务器。
文件处理需要一段时间,进程中途死亡,并出现以下错误:
2006, MySQL server has gone away
我听说过MySQL的设置,wait_timeout,但是我需要在我办公室的服务器或远程MySQL服务器上更改它吗?
当前回答
我找到了解决“#2006 - MySQL服务器已经消失”这个错误的方法。 解决办法就是检查两个文件
config.inc.php config.sample.inc.php
这些文件在windows下的路径为
C:\wamp64\apps\phpmyadmin4.6.4
在这两个文件中this的值:
$cfg['Servers'][$i]['host']must be 'localhost' .
我的情况是:
$cfg['Servers'][$i]['host'] = '127.0.0.1';
改为:
"$cfg['Servers'][$i]['host']" = 'localhost';
两方面都要确保:
config.inc.php Config.sample.inc.php文件必须是'localhost'。
最后一组:
$cfg['Servers'][$i]['AllowNoPassword'] = true;
然后重新启动Wampserver。
修改phpmyadmin用户名和密码
可以直接通过config.inc.php文件修改phpmyadmin的用户名和密码
这两条线
$cfg['Servers'][$i]['user'] = 'root';
$cfg['Servers'][$i]['password'] = '';
在这里你可以输入新的用户名和密码。 更改后保存文件并重新启动WAMP服务器。
其他回答
我遇到过这种情况很多次,我通常发现答案是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。
造成这个错误的原因有几个。
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 有关错误的更多信息,请查看文档
我也遇到了这个错误。但是,即使增加了max_allowed_packet或my.cnf中的任何值,错误仍然存在。
我所做的是对我的数据库进行故障排除:
我检查了错误持续存在的表 然后我检查了每一行 有些行可以读取,有些行错误只会显示 似乎这些行中存在导致此错误的值 但是,即使只选择主列,错误仍然会出现(SELECT primary_id FROM table)
我想到的解决方案是重新导入数据库。好在我有这个数据库的备份。但是我只是删除了有问题的表,然后导入了这个表的备份。这解决了我的问题。
我对这个问题的看法是:
始终有数据库备份。手动或通过CRON作业 我注意到在受影响的行中有一些特殊字符。因此,当我恢复该表时,我立即将该表的排序规则从latin1_swedish_ci更改为utf8_general_ci 在我的数据库工作正常之前,我的系统突然遇到这个问题。也许这也与我们的主机提供商升级MySQL数据库有关。所以经常备份是必须的!
在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}
对我来说是内存问题。
我甚至在拥有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