缘起

今天在访问博客的时候,登录首页发现无法正常加载博文。因为之前也出现过这种错误,怀疑还是因为数据库的问题,所以果断查看 MySQL 日志:

vi /var/log/mariadb/mariadb.log 

gg 打到文件最后,分析日志:
191104 17:48:04 mysqld_safe Number of processes running now: 0
191104 17:48:05 mysqld_safe mysqld restarted
191104 17:48:05 [Note] /usr/libexec/mysqld (mysqld 5.5.64-MariaDB) starting as process 11169 ...
191104 17:48:05 InnoDB: The InnoDB memory heap is disabled
191104 17:48:05 InnoDB: Mutexes and rw_locks use GCC atomic builtins
191104 17:48:05 InnoDB: Compressed tables use zlib 1.2.7
191104 17:48:05 InnoDB: Using Linux native AIO
191104 17:48:05 InnoDB: Initializing buffer pool, size = 128.0M
InnoDB: mmap(137756672 bytes) failed; errno 12
191104 17:48:05 InnoDB: Completed initialization of buffer pool
191104 17:48:05 InnoDB: Fatal error: cannot allocate memory for the buffer pool
**错误信息从此行开始**
191104 17:48:05 [ERROR] Plugin 'InnoDB' init function returned error.
191104 17:48:05 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
191104 17:48:05 [ERROR] mysqld: Out of memory (Needed 128917504 bytes)
191104 17:48:05 [Note] Plugin 'FEEDBACK' is disabled.
191104 17:48:05 [ERROR] Unknown/unsupported storage engine: InnoDB
191104 17:48:05 [ERROR] Aborting

191104 17:48:05 [Note] /usr/libexec/mysqld: Shutdown complete
**服务停止**
191104 17:48:05 mysqld_safe mysqld from pid file /var/run/mariadb/mariadb.pid ended

确认是 MySQL 服务的问题,首先手动把 MySQL 启动起来,保证应用正常使用:
systemctl restart mariadb

之后服务恢复正常

增加 swap 分区

使用 swap 必须要知道它存在的缺点,以便判断何时使用交换分区。
使用交换分区的好处是可以一定程度的缓解内存空间紧张的问题。
然而,由于 CPU 所读取的数据都来自于内存,而交换分区则是存放在磁盘上的,磁盘的速度和内存比较起来慢了好几个数量级,如果不停的读写 swap,那么对系统的性能肯定有影响,尤其是当系统内存很吃紧的时候,读写 swap 空间发生的频率会很高,导致系统运行很慢。

因为本身内存很小只有 1G,而 5.6(?)之后默认使用 innodb 引擎,这个引擎又很消耗内存。所以最好的办法是使用大内存或者将 MySQL 降级到一个合适的版本,但是,如果不是真的喜欢,谁愿意做一条舔狗呢?如果不是没钱,谁愿意用低配服务器呢。所以,退而求其次的办法就是增加一个 swap 分区,在内存不足时,使用 swap 分区。
接下来记录创建一个 1024M 的 swap 分区的办法。

更新
交换分区大小的设置建议值:
内存小于 4GB 时,推荐不少于 2GB 的 swap 空间
内存 4GB~16GB,推荐不少于 4GB 的 swap 空间

创建 swap 文件

dd if=/dev/zero of=/swapfile bs=1024 of=1048576 # 1024*1024

配置 swap 文件

mkswap /swapfile

立即启用 swap 文件

而不是重启之后才生效

swapon /swapfile

配置重启生效

vi /etc/fstab

最后一行追加

/swapfile       swap    swap defaults   0    0

验证

[root@VM_0_16_centos imoyao]# free -m
total used free shared buff/cache available
Mem: 991 697 70 0 223 120
Swap: 1023 0 1023
[root@VM_0_16_centos imoyao]# cat /proc/swaps
Filename Type Size Used Priority
/swapfile file 1048572 520 -2

参考MariaDB 在低配 VPS 上崩溃问题处理方案

设置 MySQL 自动重启

是否设置 MySQL 服务 enable

systemctl is-enabled mariadb

如果返回不是enabled则使用命令systemctl enable mariadb进行使能

编辑配置

/etc/systemd/system/multi-user.target.wants/mariadb.service

修改配置

Service配置项中增加如下配置:

# nu:30
[Service]
……
Restart=always
RestartSec=3
……

配置生效

# 重新启动来重导Systemd配置:
sudo systemctl daemon-reload
# 重新启动MariaDB服务
systemctl restart mariadb

参见

修改 MySQL 配置

(调小 innodb_buffer_pool_size 参数)
参见

版本信息

mysql --version
mysql Ver 15.1 Distrib 5.5.64-MariaDB, for Linux (x86_64) using readline 5.1
[root@VM_0_16_centos imoyao]# cat /etc/system-release
CentOS Linux release 7.6.1810 (Core)

注意:文中以MariaDB示例,关于其与MySQL的关系在此不做过多说明,如果使用MySQL作为数据库,以上配置命令可能略有不同。

参考链接