分享MySQL生产库内存异常增高的排查过程 - 网站

分享MySQL生产库内存异常增高的排查过程

分类:数据库 · 发布时间:2023-11-21 07:07 · 阅读:3915

这篇文章主要介绍了分享MySQL生产库内存异常增高的排查过程,基于MySQL实例的内存使用率高的报警的问题展开对主题的问题,具有一定的参考价值,需要的小伙伴可以参考一下

    近期频繁收到一个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生产库内存异常增高的排查过程_MySQL

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

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

标签:
MySQL 异常 内存 增高

相关文章

MySQL给字符串加一个高效索引的实现

本文主要介绍了MySQL给字符串加一个高效索引的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

pentaho工具将数据库数据导入导出为Excel图文步骤

本篇博客讲述的是如何使用pentaho工具快速的将数据库数据导出为Excel文件,以及如何将Excel文件数据导入数据库,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪

MySQL深入浅出掌握触发器用法

触发器是SQLserver提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,事件是在 MySQL 5.1后引入的,有点类似操作系统的计划任务,但是周期性任务是内置在MySQL服务端执行的

MySQL创建定时任务实例(每天凌晨1点、每小时、每分钟、某一时间点)

在mysql中有时候要定时更新或者删除一部分数据需要用到mysql的定时任务,下面这篇文章主要给大家介绍了关于MySQL创建定时任务的相关资料,包括每天凌晨1点、每小时、每分钟、某一时间点等,需要的朋友可以参考下

你真的会用Mysql的explain吗

explain显示了mysql如何使用索引来处理select语句以及连接表,可以帮助选择更好的索引和写出更优化的查询语句,下面这篇文章主要给大家介绍了关于Mysql中explain用法的相关资料,需要的朋友可以参考下

返回分类 返回首页