MySQL server has gone away 的另一可能原因

在本地虚拟机 CentOS 7 系统中测试 MariaDB 服务器的时候,每次执行 mysql 指令总会遇到“ERROR 2006 (HY000): MySQL server has gone away”的错误。校准了虚拟机内时间后,前述问题小时。这两者之间是否有必然联系还不好说,暂作记录。

1. 问题

在 MariaDB 中随便执行一条指令,不管是 create database 也好,还是 flush privileges 也好,都会在显示指令执行结果前有类似这样的输出,

ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 32
Current database: *** NONE ***

例如查询一下时间,

MariaDB [(none)]> select now();
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 32
Current database: *** NONE ***

+---------------------+
| now() |
+---------------------+
| 2014-11-30 10:28:20 |
+---------------------+
1 row in set (0.02 sec)

可以看到,这条简单查询耗时 0.02 秒。而且其中 Connection id 后面的数字还会随着每次出现而增加 1。

关于这个问题,网上多数的探讨结果都发现是因为数据库运行参数 max_allowed_packet 的值过小造成的,只要相应调大该参数即可。典型的分析帖子可以参考 Ronald Bradford 博客和 stackoverflow。如果不曾在 /etc/my.cnf 中设置此值,则可以在数据库中查询到,

MariaDB [(none)]> show global variables like 'max_allowed_packet';

修改可以直接在数据库中执行,

MariaDB [(none)]> set global max_allowed_packet=1024*1024*16;

不明白为什么大家建议的值都是 16MB。但是既然这个参数只是规定了上限,并不是说就一定要占用这么内存,大点也无所谓。当然直接修改配置文件 /etc/my.cnf 也行,在 [mysqld] 下增加一个声明:

# vim /etc/my.cnf
[mysqld]
max_allowed_packet = 16M

但是显然,我这里的情况并不是因为这个最常见的问题。

2. 校准系统时钟

因为系统时间不准,就安装 ntp 校对了一下。

# yum -y -q install ntp
# ntpdate -s ntp.org
# date
Sat Dec 13 09:17:40 GMT 2014

3. 问题消失

然后紧接着就发现前面出现的问题消失。再次执行同一查询指令,

MariaDB [(none)]> select now();
+---------------------+
| now() |
+---------------------+
| 2014-12-13 09:19:08 |
+---------------------+
1 row in set (0.00 sec)

数据库失去连接的错误消失了。查询执行时间也不再那么长了。

不过这个问题和系统时钟不正常之间是否有关还真不知道。而且这也不是什么重要的事情,就没有再做进一步分析。这里暂作记录。如果有人遇到类似的情况还请留言讨论一下。©

本文发表于水景一页。永久链接:<http://cnzhx.net/blog/mysql-server-has-gone-away-another-possible-reason/>。转载请保留此信息及相应链接。

雁过留声,人过留名

您的电子邮箱地址不会被公开。 必填项已用 * 标注

特别提示:与当前文章主题无关的讨论相关但需要较多讨论求助信息请发布到水景一页讨论区的相应版块,谢谢您的理解与合作!请参考本站互助指南
您可以在评论中使用如下的 HTML 标记来辅助表达: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>