前段时间为博客换了台内存较小的云服务器,内存只有512M,确实是有点小,图个便宜哈,但也因此遇到了非常让我头疼的问题--数据库经常挂掉,导致博客无法访问。查看MySQL日志可以看到,主因其实还是内存问题
2018-06-14 22:48:19 11104 [Note] Plugin 'FEDERATED' is disabled.
2018-06-14 22:48:21 11104 [Note] InnoDB: Using atomics to ref count buffer pool pages
2018-06-14 22:48:21 11104 [Note] InnoDB: The InnoDB memory heap is disabled
2018-06-14 22:48:21 11104 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
2018-06-14 22:48:21 11104 [Note] InnoDB: Memory barrier is not used
2018-06-14 22:48:21 11104 [Note] InnoDB: Compressed tables use zlib 1.2.3
2018-06-14 22:48:21 11104 [Note] InnoDB: Using Linux native AIO
2018-06-14 22:48:21 11104 [Note] InnoDB: Using CPU crc32 instructions
2018-06-14 22:48:21 11104 [Note] InnoDB: Initializing buffer pool, size = 128.0M InnoDB: mmap(137363456 bytes) failed; errno 12
2018-06-14 22:48:21 11104 [ERROR] InnoDB: Cannot allocate memory for the buffer pool
2018-06-14 22:48:21 11104 [ERROR] Plugin 'InnoDB' init function returned error.
2018-06-14 22:48:21 11104 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
2018-06-14 22:48:21 11104 [ERROR] Unknown/unsupported storage engine: InnoDB
2018-06-14 22:48:21 11104 [ERROR] Aborting
搜了好些优化的参数,什么innodb_use_sys_malloc、innodb_buffer_pool_size之类的,前几感觉似乎有点作用,但没两天发现也只是频率减少了些而矣,未从根本上解决问题。
MySQL安装时使用用yum安装的5.6.40的版本,自MySQL 5.6.2开始就已经不再被赞成使用innodb_use_sys_malloc和innodb_additional_mem_pool_size这两项配置了,更是在5.8开始直接移除该参数项。关键一点:innodb_use_sys_malloc和innodb_additional_mem_pool_size也不可以同时存在的。所以每次启动MySQL服务时,日志中都会有一条这样的警告信息。
InnoDB: Warning: Setting innodb_use_sys_malloc to FALSE is DEPRECATED. This option may be removed in future releases, together with the InnoDB's internal memory allocator.
问题分析
1.主因应该还是云服务器内存太小的问题,如果有条件,建议还是优先使用1G内存及以上的服务
2.MySQL未能配置适合服务的最优配置
解决方案
1.通过不断修改innodb_buffer_pool_size的数值,先后由256M逐次递减,最后设定到64M时,发现服务死掉的时间间隔比较长了,由频繁时的一天几次递减到几天一次,但仍然不知道会在什么时间死掉
2.写了一个Shell监控MySQL进程的脚本,每5分钟执行一次,在监测到服务死掉后自动重启MySQL服务
附MySQL服务监测执行脚本截图