排查并解决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查询的控制语句图文详解
Apr 11 MySQL
浅析MySQL如何实现事务隔离
Jun 26 MySQL
Mysql中调试存储过程最简单的方法
Jun 30 MySQL
MySQL系列之十三 MySQL的复制
Jul 02 MySQL
详细聊聊MySQL中慢SQL优化的方向
Aug 30 MySQL
MySQL中的隐藏列的具体查看
Sep 04 MySQL
MySQL中连接查询和子查询的问题
Sep 04 MySQL
关于MySQL中的 like操作符详情
Nov 17 MySQL
解析MySQL索引的作用
Mar 03 MySQL
mysql全面解析json/数组
Jul 07 MySQL
jdbc中自带MySQL 连接池实践示例
Jul 23 MySQL
分享很少见很有用的SQL功能CORRESPONDING
Aug 05 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
WindowsXP中快速配置Apache+PHP5+Mysql
2008/06/05 PHP
smarty内置函数capture用法分析
2015/01/22 PHP
php简单获取文件扩展名的方法
2015/03/24 PHP
php通过分类列表产生分类树数组的方法
2015/04/20 PHP
php发送邮件的问题详解
2015/06/22 PHP
thinkPHP下的widget扩展用法实例分析
2015/12/26 PHP
详解yii2使用多个数据库的案例
2017/06/16 PHP
jquery 学习之二 属性相关
2010/11/23 Javascript
关于jQuery参考实例2.0 用jQuery选择元素
2013/04/07 Javascript
jQuery实现鼠标悬停显示提示信息窗口的方法
2015/04/30 Javascript
基于JavaScript判断浏览器到底是关闭还是刷新(超准确)
2016/02/01 Javascript
Node.js编写爬虫的基本思路及抓取百度图片的实例分享
2016/03/12 Javascript
前端弹出对话框 js实现ajax交互
2016/09/09 Javascript
javascript汉字拼音互转的简单实例
2016/10/09 Javascript
AngularJS自定义插件实现网站用户引导功能示例
2016/11/07 Javascript
react-native-video实现视频全屏播放的方法
2018/03/19 Javascript
vue动态设置img的src路径实例
2018/09/18 Javascript
微信小程序与后台PHP交互的方法实例分析
2018/12/10 Javascript
js实现上传按钮并显示缩略图小轮子
2020/05/04 Javascript
JS跨浏览器解析XML应用过程详解
2020/10/16 Javascript
10款最好的Web开发的 Python 框架
2015/03/18 Python
python安装以及IDE的配置教程
2015/04/29 Python
Python针对给定字符串求解所有子序列是否为回文序列的方法
2018/04/21 Python
查看TensorFlow checkpoint文件中的变量名和对应值方法
2018/06/14 Python
python3.5基于TCP实现文件传输
2020/03/20 Python
torch 中各种图像格式转换的实现方法
2019/12/26 Python
pandas读取csv文件提示不存在的解决方法及原因分析
2020/04/21 Python
python爬虫请求头设置代码
2020/07/28 Python
基于 HTML5 的 WebGL 3D 版俄罗斯方块的示例代码
2018/05/28 HTML / CSS
HTML5 video 上传预览图片视频如何设置、预览视频某秒的海报帧
2018/08/28 HTML / CSS
canvas小画板之平滑曲线的实现
2020/08/12 HTML / CSS
用C#语言写出与SQLSERVER访问时的具体过程
2013/04/16 面试题
自我鉴定注意事项
2014/01/19 职场文书
大龄毕业生求职别忘职业规划
2014/03/11 职场文书
社区六一儿童节活动总结
2015/02/11 职场文书
阿里云Nginx配置https实现域名访问项目(图文教程)
2021/03/31 Servers