本文介绍了一次解决 MySQL 定时任务导致服务器内存溢出的问题经历。通过调整 MySQL 配置参数,如关闭查询缓存和调整 key_buffer_size 大小,成功解决了因内存不足引发的服务器故障。
日志显示如下:
————————————————
Out of memory: Kill process 830 ( mysqld ) score 611 or sacrifice child
MySQL 占用的太多内存,这台服务器内存只有1G,看来是内存不足。
Out of memory 问题,这通常是因为某时刻应用程序大量请求内存导致系统内存不足造成的,这通常会触发 Linux 内核里的 Out of Memory ( OOM ) killer,OOM killer 会杀掉某个进程以腾出内存留给系统用,不致于让系统立刻崩溃。
在整体的系统运行过程中,数据库服务器 MySQL 的压力是最大的,不仅占用很多的内存和 CPU 资源,而且占用着大部分的磁盘 io 资源。
一、优化 mysql 缓存
mysql > show variables like '%query_cache%';
mysql 本身是有对 sql 语句缓存的机制的,合理设置我们的 mysql 缓存可以降低数据库的 io 资源。
| Variable_name | Value |
| have_query_cache | YES |
| query_cache_limit | 1048576 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 16777216 |
| query_cache_type | ON |
| query_cache_wlock_invalidate | OFF |
query_cache_type 查询缓存的方式 ( 默认是 ON )
query_cache_size 如果你希望禁用查询缓存,设置 query_cache_size = 0。禁用了查询缓存,将没有明显的开销
query_cache_limit 不缓存大于这个值的结果。( 缺省为 1M )
找到 /etc/mysql/my.cnf 配置进行修改(注意备份):首先我把 query_cache_size 这个值改为了 0,禁用了缓存
二、再提一下 key_buffer_size
mysql > show variables like '%key_buffer_size%';
| Variable_name | Value |
| key_buffer_size | 16777216 |
key_buffer_size 是对 MyISAM 表性能影响最大的一个参数
key_buffer_size 表示索引缓冲区的大小,严格说是它决定了数据库索引处理的速度,尤其是索引读的速度。
可以检查状态值 Key_read_requests 和 Key_reads ,即可知道 key_buffer_size 设置是否合理。比例key_reads / key_read_requests 应该尽可能的低,至少是 1:100,1:1000 更好,如果这个数值过大,就应该调高 key_buffer_size 的数值
mysql > show global status like '%key_read%';
| Variable_name | Value |
| Key_read_requests | 180 |
| Key_reads | 0 |
对于 1G 内存的机器,如果不使用 MyISAM 表,推荐值是16M(8-64M)
重启 mysql:servicemysqld start
启动服务,测试。没有再报错。
原文链接:https://blog.csdn.net/axela30w/article/details/70314797