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)

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

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

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

时间过去太久,评论已关闭。
如果您有话要说,请到讨论区留言并给出此文章链接。
谢谢您的理解 :-)