排查并解决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 逻辑备份与恢复测试的相关总结
May 14 MySQL
MySQL中出现乱码问题的终极解决宝典
May 26 MySQL
MySQL中使用or、in与union all在查询命令下的效率对比
May 26 MySQL
MySQL 全文检索的使用示例
Jun 07 MySQL
如何使用分区处理MySQL的亿级数据优化
Jun 18 MySQL
mysql获取指定时间段中所有日期或月份的语句(不设存储过程,不加表)
Jun 18 MySQL
MySQL query_cache_type 参数与使用详解
Jul 01 MySQL
MySQL分区表实现按月份归类
Nov 01 MySQL
详解MySql中InnoDB存储引擎中的各种锁
Feb 12 MySQL
MySQL库表太大怎么办? 数据库分库分表项目实践
Apr 11 MySQL
mysql序号rownum行号实现方式
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
弄了个检测传输的参数是否为数字的Function
2006/12/06 PHP
浅析php-fpm静态和动态执行方式的比较
2016/11/09 PHP
Thinkphp5.0框架的Db操作实例分析【连接、增删改查、链式操作等】
2019/10/11 PHP
JQuery实现用户名无刷新验证的小例子
2013/03/22 Javascript
JavaScript ES6的新特性使用新方法定义Class
2016/06/28 Javascript
jQuery实现动态添加tr到table的方法
2016/12/26 Javascript
用JavaScript实现让浏览器停止载入页面的方法
2017/01/19 Javascript
详谈js使用in和hasOwnProperty获取对象属性的区别
2017/04/25 Javascript
gulp解决跨域的配置文件问题
2017/06/08 Javascript
详解如何去除vue项目中的#——History模式
2017/10/13 Javascript
Vue中正确使用jQuery的方法
2017/10/30 jQuery
浅谈Node 调试工具入门教程
2018/03/20 Javascript
Windows下支持自动更新的Electron应用脚手架的方法
2018/12/24 Javascript
JavaScript代码调试方法实例小结
2019/01/05 Javascript
Node.js Stream ondata触发时机与顺序的探索
2019/03/08 Javascript
Vue实现 点击显示再点击隐藏效果(点击页面空白区域也隐藏效果)
2020/01/16 Javascript
Vue性能优化的方法
2020/07/30 Javascript
vue router-link 默认a标签去除下划线的实现
2020/11/06 Javascript
Python Requests安装与简单运用
2016/04/07 Python
利用Python脚本生成sitemap.xml的实现方法
2017/01/31 Python
python版本的仿windows计划任务工具
2018/04/30 Python
Python实现读取SQLServer数据并插入到MongoDB数据库的方法示例
2018/06/09 Python
python 遍历目录(包括子目录)下所有文件的实例
2018/07/11 Python
Django添加sitemap的方法示例
2018/08/06 Python
python下载微信公众号相关文章
2019/02/26 Python
Python基于pip实现离线打包过程详解
2020/05/15 Python
Python利用myqr库创建自己的二维码
2020/11/24 Python
open_basedir restriction in effect. 原因与解决方法
2021/03/14 PHP
新西兰珠宝品牌:Michael Hill
2017/09/16 全球购物
Omio意大利:全欧洲低价大巴、火车和航班搜索和比价
2017/12/02 全球购物
Java面试题:请问一下代码输出是什么
2015/05/27 面试题
建龙钢铁面试总结
2014/04/15 面试题
《大江保卫战》教学反思
2014/04/11 职场文书
民主评议党员个人总结
2015/02/13 职场文书
奔腾年代观后感
2015/06/09 职场文书
MySQL 开窗函数
2022/02/15 MySQL