是的,我写下这段文字的时候,这个网站的访问刚刚恢复过来,在此之前大约一天时间里,如果你访问这个网站,你只会看到错误提示“与数据库的连接出现异常”。也就是说,网站的罢工其实是数据库罢工。
看一下MySQL服务的状态才发现,这个服务已经挂掉了。其实这个问题在前一个周左右时有发生,每次重启一遍系统就好了。但这次不一样,重启之后没多久就又挂了,总不能我随时盯着吧?况且Google Search Console都给我发邮件警告了,说再不修就给我从搜索结果里去掉(废话,网站都挂了还有什么资格出现在搜索结果里)。
查看MySQL的日志,发现有一条很关键的信息:
[ERROR] InnoDB: Cannot allocate memory for the buffer pool
又考虑到承载这个网站的是一台单核1G内存的VPS,嗯,果然是内存不足了。Google了一通,发现改buffer size到64M也没用,即使内存剩余大约100M。但其他所有情况都符合出这个错误的情形。
突然想起前两天为了弄邮件服务器,偷懒搞了个docker,用是能用,但镜像一跑起来,直接内存爆炸然后镜像和MySQL全崩掉(不知道为啥Nginx还正常)。那之后把镜像停了,不过好像也是自从那个时候才出现的偶然连接异常。
又想起来我只是把镜像停了,docker还在后台运行,遂service docker stop,这下不用改buffer size也能运行了,剩余内存多了惊人的200M,MySQL终于能正常地跑起来了。
MySQL 总感觉特别娇贵经常因为内存崩掉…
我觉得把 swap 分区搞大点比较保险 =_=