作者:付祥
现居珠海,主要负责 Oracle、MySQL、mongoDB 和 Redis 维护工作。
本文来源:原创投稿
*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。
异常现象
开发人员反馈,有一台服务器内存几乎被 MySQL 耗尽了,执行 top 命令,输出如下:

这台机器是个测试环境,MySQL 是开发自己安装的,数据库版本 5.6.51 ,机器总内存32G,MySQL 占了29G。
分析过程
查看 MySQL 启动时间发现1个星期前才启动,猜测之前由于主机内存耗尽触发了 OOM ,查看 MySQL 错误日志,发现每隔10几天,MySQL 就异常关闭一次:
2022-02-24 03:03:42 20981 [Note] InnoDB: Database was not shutdown normally!
2022-03-13 02:31:40 4134 [Note] InnoDB: Database was not shutdown normally!
2022-03-31 02:31:08 6846 [Note] InnoDB: Database was not shutdown normally!
2022-04-12 02:31:41 1159 [Note] InnoDB: Database was not shutdown normally!
2022-04-23 04:41:51 6773 [Note] InnoDB: Database was not shutdown normally!
2022-05-04 02:31:52 2499 [Note] InnoDB: Database was not shutdown normally!
2022-05-13 04:56:06 23010 [Note] InnoDB: Database was not shutdown normally!
2022-05-30 02:31:33 3244 [Note] InnoDB: Database was not shutdown normally!
查看操作系统日志,进一步验证了 MySQL 耗尽主机内存,触发 OOM :
# grep oom-killer /var/log/messages* /var/log/messages-20220605:May 30 02:31:30 vm10-136-9-24 kernel: mysqld invoked
oom-killer: gfp_mask=0x201da, order=0, oom_score_adj=0
查看 my.cnf 配置文件,发现几乎都是默认配置,innodb_buffer_pool_size 等于默认值128M :
mysql> show variables like 'innodb_buffer_pool_size';
+-------------------------+-----------+
| Variable_name | Value |
+-------------------------+-----------+
| innodb_buffer_pool_size | 134217728 |
+-------------------------+-----------+
当前数据库有500多个连接,都是 Sleep 状态,从 MySQL 错误日志发现 performance_schema 下的表结构全是错误的,估计 MySQL 版本做了升级,没有执行 upgrade升 级数据字典,意味着一些内存诊断信息便不能从 PS 获取:
2022-06-09 11:19:08 27468 [ERROR] Native table
'performance_schema'.'cond_instances' has

本文针对一台MySQL服务器频繁耗尽内存的问题进行了深入分析。通过检查错误日志、内存分配及使用情况,发现内存碎片化严重,并采取更换内存分配器等措施有效解决了问题。
最低0.47元/天 解锁文章
171万+

被折叠的 条评论
为什么被折叠?



