排查并解决MySQL生产库内存使用率高的报警


Posted in MySQL onApril 11, 2022

    近期频繁收到一个MySQL实例的内存使用率高的报警,今天我们花时间排查一下问题出在哪里。

修改performance_schema

因为公司生产环境使用的阿里云RDS,修改参数相对方便,performance_schema默认为0,此次修改为1。修改之后提交参数,数据库会进行重启,建议在业务低峰进行。

打开内存监控

登录MySQL数据库,执行如下SQL,打开内存监控。

update performance_schema.setup_instruments set enabled = 'yes' where name like 'memory%';

打开之后验证一下。

select * from performance_schema.setup_instruments where name like 'memory%innodb%' limit 5;

**注意:**该命令是在线打开内存统计,所以只会统计打开后新增的内存对象,打开前的内存对象不会统计,建议您打开后等待一段时间再执行后续步骤,便于找出内存使用高的线程。

查找内存消耗

统计事件消耗内存

select event_name,
       SUM_NUMBER_OF_BYTES_ALLOC
from performance_schema.memory_summary_global_by_event_name
order by SUM_NUMBER_OF_BYTES_ALLOC desc
LIMIT 10;
+---------------------------------------+-------------------------------------+
| event_name                            | SUM_NUMBER_OF_BYTES_ALLOC           |
+---------------------------------------+-------------------------------------+
| memory/sql/Filesort_buffer::sort_keys | 763523904056                        |
| memory/memory/HP_PTRS                 | 118017336096                        |
| memory/sql/thd::main_mem_root         | 114026214600                        |
| memory/mysys/IO_CACHE                 | 59723548888                         |
| memory/sql/QUICK_RANGE_SELECT::alloc  | 14381459680                         |
| memory/sql/test_quick_select          | 12859304736                         |
| memory/innodb/mem0mem                 | 7607681148                          |
| memory/sql/String::value              | 1405409537                          |
| memory/sql/TABLE                      | 1117918354                          |
| memory/innodb/btr0sea                 | 984013872                           |
+---------------------------------------+-------------------------------------+

可以看到内存消耗最高的event是Filesort_buffer,根据经验,这个应该是排序有关。

统计线程消耗内存

select thread_id,
       event_name,
       SUM_NUMBER_OF_BYTES_ALLOC
from performance_schema.memory_summary_by_thread_by_event_name
order by SUM_NUMBER_OF_BYTES_ALLOC desc
limit 10;
+---------------------+---------------------------------------+-------------------------------------+
| thread_id           | event_name                            | SUM_NUMBER_OF_BYTES_ALLOC           |
+---------------------+---------------------------------------+-------------------------------------+
| 105                 | memory/memory/HP_PTRS                 | 69680198792                         |
| 183                 | memory/sql/Filesort_buffer::sort_keys | 49210098808                         |
| 154                 | memory/sql/Filesort_buffer::sort_keys | 43304339072                         |
| 217                 | memory/sql/Filesort_buffer::sort_keys | 37752275360                         |
| 2773                | memory/sql/Filesort_buffer::sort_keys | 31460644712                         |
| 218                 | memory/sql/Filesort_buffer::sort_keys | 31128994280                         |
| 2331                | memory/sql/Filesort_buffer::sort_keys | 28763981248                         |
| 106                 | memory/memory/HP_PTRS                 | 27938197584                         |
| 191                 | memory/sql/Filesort_buffer::sort_keys | 27701610224                         |
| 179                 | memory/sql/Filesort_buffer::sort_keys | 25624723968                         |
+---------------------+---------------------------------------+-------------------------------------+

可以看到内存消耗多的线程都跟Filesort_buffer相关。

定位具体SQL

根据前边我们查到的thread_id去日志里查找对应的SQL,阿里云RDS审计日志相对还是比较强大的。我们直接根据thread_id直接检索。

排查并解决MySQL生产库内存使用率高的报警

    我们在日志里看到大量这样的SQL,扫描行数在几千到几万不等。虽然每次查询时间并不长,大概在几十到几百毫秒,但是并发量很大。
    跟开发同学核实之后,这个查询没有做分页,取到的数据有很多行,而且最后要做排序,并且排序字段并没有合适的索引。到此,这次内存使用率出现异常的罪魁祸首已经找到。

到此这篇关于分享MySQL生产库内存异常增高的排查过程的文章就介绍到这了,更多相关MySQL生产库内存异常增高内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
MySQL Innodb关键特性之插入缓冲(insert buffer)
Apr 08 MySQL
MySQL 1130异常,无法远程登录解决方案详解
Aug 23 MySQL
MySQL基础快速入门知识总结(附思维导图)
Sep 25 MySQL
面试中老生常谈的MySQL问答集锦夯实基础
Mar 13 MySQL
MySQL数据库查询进阶之多表查询详解
Apr 08 MySQL
为什么MySQL8新特性会修改自增主键属性
Apr 18 MySQL
MySQL sql模式设置引起的问题
May 15 MySQL
MySQL普通表如何转换成分区表
May 30 MySQL
MySQL解决Navicat设置默认字符串时的报错问题
Jun 16 MySQL
MySQL下载安装配置详细教程 附下载资源
Sep 23 MySQL
DQL数据查询语句使用示例
Dec 24 MySQL
Windows下载并安装MySQL8.0.x 版本的完整教程
MySQL数据库优化之通过索引解决SQL性能问题
Apr 10 #MySQL
MySQL 外连接语法之 OUTER JOIN
Apr 09 #MySQL
MySQL中优化SQL语句的方法(show status、explain分析服务器状态信息)
Apr 09 #MySQL
进阶篇之linux环境下安装MySQL数据库
MySQL的存储函数与存储过程的区别解析
Apr 08 #MySQL
MySQL数据库查询进阶之多表查询详解
You might like
PHP提取数据库内容中的图片地址并循环输出
2010/03/21 PHP
PHP面向对象程序设计之对象克隆clone和魔术方法__clone()用法分析
2019/06/12 PHP
javascript客户端解决方案 缓存提供程序
2010/07/14 Javascript
JavaScript.The.Good.Parts阅读笔记(二)作用域&闭包&减缓全局空间污染
2010/11/16 Javascript
Javascript模块化编程(一)AMD规范(规范使用模块)
2013/01/17 Javascript
浅谈Jquery为元素绑定事件
2015/04/27 Javascript
js实现当复选框选择匿名登录时隐藏登录框效果
2015/08/14 Javascript
Javascript中的数据类型之旅
2015/10/18 Javascript
javascript 数组的定义和数组的长度
2016/06/07 Javascript
原生JS实现N级菜单的代码
2017/05/21 Javascript
js移动端事件基础及常用事件库详解
2017/08/15 Javascript
详解基于vue的服务端渲染框架NUXT
2018/06/20 Javascript
vue-cli项目中使用echarts图表实例
2018/10/22 Javascript
微信小程序中转义字符的处理方法
2019/03/28 Javascript
微信小程序 扭蛋抽奖机css3动画实现详解
2019/07/19 Javascript
在Python的Flask框架中使用日期和时间的教程
2015/04/21 Python
Django小白教程之Django用户注册与登录
2016/04/22 Python
python安装PIL模块时Unable to find vcvarsall.bat错误的解决方法
2016/09/19 Python
老生常谈python函数参数的区别(必看篇)
2017/05/29 Python
python实现微信接口(itchat)详细介绍
2017/10/23 Python
Python3自动签到 定时任务 判断节假日的实例
2018/11/13 Python
Python 输入一个数字判断成绩分数等级的方法
2018/11/15 Python
在python plt图表中文字大小调节的方法
2019/07/08 Python
python实现抠图给证件照换背景源码
2019/08/20 Python
简单了解Python读取大文件代码实例
2019/12/18 Python
win10下python2和python3共存问题解决方法
2019/12/23 Python
python进度条显示-tqmd模块的实现示例
2020/08/23 Python
德国知名健康零食网上商店:Seeberger
2017/07/27 全球购物
eBay比利时购物网站:eBay.be
2019/08/09 全球购物
项目施工员岗位职责
2014/03/09 职场文书
贸易跟单员英文求职信
2014/04/19 职场文书
出国留学导师推荐信
2015/03/26 职场文书
SQL Server基本使用和简单的CRUD操作
2021/04/05 SQL Server
详解Redis基本命令与使用场景
2021/06/01 Redis
Python提取PDF指定内容并生成新文件
2021/06/09 Python
python游戏开发Pygame框架
2022/04/22 Python