在本地虚拟机 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/>。转载请保留此信息及相应链接。