排查并解决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 相关文章推荐
数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)
Apr 05 MySQL
MySQL中出现乱码问题的终极解决宝典
May 26 MySQL
MySQL中distinct与group by之间的性能进行比较
May 26 MySQL
MySQL不使用order by实现排名的三种思路总结
Jun 02 MySQL
mysql外连接与内连接查询的不同之处
Jun 03 MySQL
MySQL的Query Cache图文详解
Jul 01 MySQL
MySQL系列之十一 日志记录
Jul 02 MySQL
一篇文章看懂MySQL主从复制与读写分离
Nov 07 MySQL
SQL注入篇学习之盲注/宽字节注入
Mar 03 MySQL
面试提问mysql一张表到底能存多少数据
Mar 13 MySQL
MySQL分区表管理命令汇总
Mar 21 MySQL
Innodb存储引擎中的后台线程详解
Apr 03 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
重置版战役片段
2020/04/09 魔兽争霸
php文件缓存类用法实例分析
2015/04/22 PHP
PHP array_key_exists检查键名或索引是否存在于数组中的实现方法
2016/06/13 PHP
php实现的debug log日志操作类实例
2016/07/12 PHP
php使用mysqli和pdo扩展,测试对比连接mysql数据库的效率完整示例
2019/05/09 PHP
在IE上直接编辑网页内容的js代码(IE地址栏js)
2009/04/27 Javascript
JavaScript计算字符串中每个字符出现次数的小例子
2013/07/02 Javascript
ionic组件ion-tabs选项卡切换效果实例
2016/08/27 Javascript
浅谈js对象的创建和对6种继承模式的理解和遐想
2016/10/16 Javascript
ES6概念 ymbol.for()方法
2016/12/25 Javascript
html5+canvas实现支持触屏的签名插件教程
2017/05/08 Javascript
解决bootstrap中使用modal加载kindeditor时弹出层文本框不能输入的问题
2017/06/05 Javascript
nodejs的安装使用与npm的介绍
2019/09/11 NodeJs
vue路由传参页面刷新参数丢失问题解决方案
2019/10/08 Javascript
vue组件传值的实现方式小结【三种方式】
2020/02/05 Javascript
从源码角度来回答keep-alive组件的缓存原理
2021/01/18 Javascript
用yum安装MySQLdb模块的步骤方法
2016/12/15 Python
python使用正则表达式替换匹配成功的组
2017/11/17 Python
python单例模式实例解析
2018/08/28 Python
python3.x实现base64加密和解密
2019/03/28 Python
python tkinter之 复选、文本、下拉的实现
2020/03/04 Python
pyqt5数据库使用详细教程(打包解决方案)
2020/03/25 Python
零基础学python应该从哪里入手
2020/08/11 Python
python import 上级目录的导入
2020/11/03 Python
基于zepto的插件之移动端无缝向上滚动并上下触摸滑动实例代码
2016/12/20 HTML / CSS
viagogo法国票务平台:演唱会、体育比赛、戏剧门票
2017/03/27 全球购物
SHEIN美国:购买时髦的女性服装
2020/12/02 全球购物
两则小学生的自我评价分享
2013/11/14 职场文书
后备干部考察材料
2014/02/12 职场文书
个性与发展自我评价
2015/03/06 职场文书
青年岗位能手事迹材料(2016推荐版)
2016/03/01 职场文书
少儿励志名言(80句)
2019/08/14 职场文书
python如何正确使用yield
2021/05/21 Python
如何将JavaScript将数组转为树形结构
2021/06/02 Javascript
golang操作rocketmq的示例代码
2022/04/06 Golang
win server2012 r2服务器共享文件夹如何设置
2022/06/21 Servers