最近我遇到了一个奇怪的问题,我的MariaDB 数据库时不时会崩溃。因为考虑只作博客用途,我选用了1G内存的低配主机,然而遇到MariaDB 出现内存不足问题,导致最后数据库进程崩溃了。
如果你遇到了这个问题,可以检查下 MariaDB 的log
tail -n 100 /var/log/mariadb/mariadb.log
找到了类似如下的报错:
180208 12:08:05 [Note] InnoDB: Initializing buffer pool, size = 128.0M InnoDB: mmap(137363456 bytes) failed; errno 12 180208 12:08:05 [ERROR] InnoDB: Cannot allocate memory for the buffer pool 180208 12:08:05 [ERROR] mysqld: Out of memory (Needed 128917504 bytes) 180208 12:08:05 [ERROR] Unknown/unsupported storage engine: InnoDB
最初,我在网上搜索了这个问题,按其他人讲的,增加了虚拟内存(swapfile),可是完全不奏效,还是一样会崩溃。
在查阅了MariaDB 官方资料,我找到了解决方案:
MariaDB - Starting MySQL On Low Memory Virtual Machines
大致意思是,MariaDB 启用了性能模式,启动时就会申请大量内存来执行性能模式,默认就使用400M的内存了。当然,这还不包括数据库本身需要的内存。
方法就是修改配置 /etc/my.cnf, 在 [mysqld] 项中,增加一行配置:
performance_schema = off
然后,重启下 MariaDB。至此,问题已解决。
下面借此文章,再讨论两个问题:
1、配置虚拟内存(swapfile),可改善低配主机的内存使用
2、MariaDB 更改为 MySQL,数据库文件可兼容,无须迁移
配置虚拟内存(swapfile)
如果是创建2G的虚拟内存,命令为:
sudo swapoff /var/swapfile sudo dd if=/dev/zero of=/var/swapfile bs=1M count=2048 sudo mkswap /var/swapfile sudo swapon /var/swapfile
然后,修改/etc/fstab , 添加一行配置,以便系统重启时自动生效。
/var/swapfile swap swap defaults 0 0
启用虚拟内存后,可以通过 cat /proc/swaps 或 free -m 查看 swapfile 的使用情况
MariaDB 更改为 MySQL
MariaDB和MySQL虽然是不同的产品,但主要的作者都是同一个人,在MySQL被收购后,他便推出替代MySQL的产品MariaDB。两者除了新特性的区别,其他几乎是一样的,配置文件可能有些小差异。
这里以CentOS 7做讨论,其他系统没试过,可参照操作,在操作前备份下数据库。
1.下载mysql的repo源
$ wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
2.安装rpm包
$ sudo rpm -ivh mysql57-community-release-el7-11.noarch.rpm
注:MySQL rpm 包可以在 https://dev.mysql.com/downloads/repo/yum/ 找到,安装后,系统会生成两个用于安装mysql的yum 源:/etc/yum.repos.d/mysql-community.repo 和 /etc/yum.repos.d/mysql-community-source.repo
3.安装mysql
$ sudo yum install mysql-server
根据提示安装就可以了,不过安装完成后没有密码,需要重置密码
4.重启mysql服务
$ service mysqld restart
搞定!