缘起
今天在访问博客的时候,登录首页发现无法正常加载博文。因为之前也出现过这种错误,怀疑还是因为数据库的问题,所以果断查看 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 |
设置 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配置: |
参见
修改 MySQL 配置
(调小 innodb_buffer_pool_size 参数)
参见
- MySQL5.7.12 占用内存过多的原因到底是什么?
- MySQL 调优之 innodb_buffer_pool_size 大小设置
- mariadb 内存占用优化
- MySQL 必须调整的 10 项配置优化
- MySQL 调优之 innodb_buffer_pool_size 大小设置
- 低配服务器 VPS 运行 MYSQL 经常崩溃:[ERROR] mysqld: Out of memory (Needed 128663552 bytes)
版本信息
mysql --version |
[root@VM_0_16_centos imoyao]# cat /etc/system-release |
注意:文中以MariaDB
示例,关于其与MySQL
的关系在此不做过多说明,如果使用MySQL
作为数据库,以上配置命令可能略有不同。