DigitalOcean 512MB小内存主机MySQL服务经常崩溃的原因

这段时间在DigitalOcean上面的Web服务器架设好了。但是过几天发现网站频繁的出现WordPress报错:“数据库连接失败”。SSH登录上服务器发现MySQL服务已经停了。重启MySQL service mysql restart 之后过几天又出现了同样的问题,网站服务访问,显示“数据库连接失败”。看来每次手动重启MySQL不是个办法,必须找到出错的原因。

首先考虑既然是MySQL出的问题,我就修改配置文件,把MySQL错误日志打开,一般出错,日志里面应该有我需要的报错详细信息。修改 /etc/mysql/my.cnf

[mysqld_safe]
log-error=/var/log/mysql/tunps.com.err
[mysqld]
log-error=/var/log/mysql/tunps.com.err

加入log-error指定错误日志文件路径。过了几天网站又打不开了,赶紧的查看 /var/log/mysql/tunps.com.err 文件

141222 20:08:50 [Note] Plugin 'FEDERATED' is disabled.
141222 20:08:50 InnoDB: The InnoDB memory heap is disabled
141222 20:08:50 InnoDB: Mutexes and rw_locks use GCC atomic builtins
141222 20:08:50 InnoDB: Compressed tables use zlib 1.2.7
141222 20:08:50 InnoDB: Using Linux native AIO
141222 20:08:50 InnoDB: Initializing buffer pool, size = 128.0M
InnoDB: mmap(137363456 bytes) failed; errno 12
141222 20:08:50 InnoDB: Completed initialization of buffer pool
141222 20:08:50 InnoDB: Fatal error: cannot allocate memory for the buffer pool
141222 20:08:50 [ERROR] Plugin 'InnoDB' init function returned error.
141222 20:08:50 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
141222 20:08:50 [ERROR] Unknown/unsupported storage engine: InnoDB
141222 20:08:50 [ERROR] Aborting

发现如上内容。Fatal error: cannot allocate memory for the buffer pool。看来是申请内存失败。网上搜索发现很多人都出现过这个问题。一般会出现在内存较小的VPS主机上。比如我这台主机只有512MB的内存。解决方法是利用Linux的swap交换分区虚拟部分硬盘当内存来使用。具体操作步骤如下

  1. dd if=/dev/zero of=/swapfile bs=1M count=1024

  2. mkswap /swapfile

  3. swapon /swapfile

  4. /etc/fstab 文件新建一行写入 /swapfile swap swap defaults 0 0

这样一个1GB的swap分区就建立成功了,重启MySQL,以后MySQL服务运行得很稳定,再也没有无故停止过。

标签: Linux, MySQL, Debian, VPS, DigitalOcean

仅有一条评论

  1. 沿阶草 沿阶草

    我也遇到这个问题,刚按照你这么做了,希望不会再发生这样的错误。
    谢谢。

添加新评论