Kaijia昨天安装新VestaCP服务器后遇到了罕见MySQL无法退出重启的问题。通常情况下执行 service

mysql

stop

时MySQL会立即停止,在储存语料、数据的MySQL实例上最多也就需要半分钟将缓存写回硬盘后停止,然而Kaijia这台全新安装的MySQL服务器在发送退出命令后始终没有任何响应,直到十分钟后才会由 systemctl

超时杀死进程。

围观了一下MySQL日志,提示了未能停止的原因是在等待 page_cleaner

完成清理缓冲池:

2017-10-18T12:36:44.721465Z 0 [Note] InnoDB: Buffer pool(s) dump completed at 171018 20:36:44

2017-10-18T12:37:45.372406Z 0 [Note] InnoDB: Waiting for page_cleaner to finish flushing of buffer pool

明显对于一台尚无写入数据的MySQL,存在10分钟还清理不玩的缓冲池是不可能的。Kaijia再将往前日志往前翻回到正常记录的最后:

2017-10-18T20:30:52.647775Z 0 [Note] /usr/sbin/mysqld: ready for connections.

Version: ‘5.7.19-0ubuntu0.16.04.1’ socket: ‘/var/run/mysqld/mysqld.sock’ port: 3306 (Ubuntu)

上下对比发现正常日志的时间( 20:30:52

)与停止出现问题时的时间( 12:36:44

)差了8个小时,即北京时间与协调世界时(UTC)的时差。对此Kaijia理解服务器NTP设定的时区于服务器物理时间有差异,MySQL开机启动于NTP之前(记录的是物理时间,即本例中快了8小时),NTP运行后修改了时间(向后减去8小时),因此出现MySQL退出时要求清空比生成时间“还早”的缓存而导致了锁死。

发现是时间的问题,Kaijia便利用 dpkg

将时区调整回UTC:

dpkg-reconfigure tzdata

在图形化界面中选择 None

-> UTC

。亦可避免图形界面方式调整时间:

echo "UTC" > /etc/timezone

dpkg-reconfigure -f noninteractive tzdata

命令一执行后MySQL立刻停止,可以说是立竿见影。之后可以再次执行 dpkg-reconfigure

将时区调整回东八区或所在时区。由于早前NTP已经完成对时,在重启Linux操作系统前MySQL都将可以正常停止或重启。