What To Do When MySQL Runs Out of Memory: Troubleshooting Guide

 

In this article, I will show you how to use the new version of MySQL (5.7+) and how to troubleshoot MySQL memory allocation more easily.

Troubleshooting crashes is never a fun task, especially if MySQL does not report the cause of the crash. For example, when MySQL runs out of memory. Peter Zaitsev wrote a blog post in 2012: Troubleshooting MySQL Memory Usage with a lot of useful tips. With the new versions of MySQL (5.7+) and performance_schema, we have the ability to troubleshoot MySQL memory allocation much more easily.

In this article, I will show you how to use it.

First of all, there are 3 major cases when MySQL will crash due to running out of memory:

  1. MySQL tries to allocate more memory than available because we specifically told it to do so. For example: you did not set innodb_buffer_pool_size correctly. This is very easy to fix
  2. There is some other process(es) on the server that allocates RAM. It can be the application (Java, Python, PHP), web server or even the backup (i.e. mysqldump). When the source of the problem is identified, it is straightforward to fix.
  3. Memory leaks in MySQL. This is a worst-case scenario, and we need to troubleshoot.

Where to Start Troubleshooting MySQL Memory Leaks

Here is what we can start with (assuming it is a Linux server):

Part 1: Linux OS and Config Check

1. Identify the crash by checking MySQL error log and Linux log file (i.e. /var/log/messages or /var/log/syslog). You may see an entry saying that OOM Killer killed MySQL. Whenever MySQL has been killed by OOM "dmesg" also shows details about the circumstances surrounding it.

2. Check the available RAM:

  •  free -g 

  •  cat /proc/meminfo 

3. Check what applications are using RAM: “top” or “htop” (see the resident vs virtual memory)

4. Check MySQL configuration: check /etc/my.cnf or in general /etc/my* (including /etc/mysql/* and other files). MySQL may be running with the different my.cnf ( run ps ax| grep mysql )

5. Run  vmstat 5 5 to see if the system is reading/writing via virtual memory and if it is swapping

6. For non-production environments, we can use other tools (like Valgrind, gdb, etc) to examine MySQL usage

Part 2: Checks Inside MySQL

Now we can check things inside MySQL to look for potential MySQL memory leaks.

MySQL allocates memory in tons of places, especially:

  • Table cache
  • Performance_schema (run: show engine performance_schema status and look at the last line). That may be the cause for the systems with a small amount of RAM, i.e. 1G or less
  • InnoDB (run  show engine innodb status and check the buffer pool section, memory allocated for buffer_pool and related caches)
  • Temporary tables in RAM (find all in-memory tables by running: select * from information_schema.tables where engine='MEMORY')
  • Prepared statements, when it is not deallocated (check the number of prepared commands via deallocate command by running show global status like  'Com_prepare_sql';show global status like 'Com_dealloc_sql')

The good news is, starting with MySQL 5.7, we have memory allocation in performance_schema. Here is how we can use it:

  1. First, we need to enable collecting memory metrics. Run:

 
UPDATE setup_instruments SET ENABLED = 'YES'
 
WHERE NAME LIKE 'memory/%';
 

2. Run the report from sys schema:

 
select event_name, current_alloc, high_alloc
 
from sys.memory_global_by_current_bytes
 
where current_count > 0;
 

3. Usually, this will give you the place in code when memory is allocated. It is usually self-explanatory. In some cases, we can search for bugs or we might need to check the MySQL source code.

For example, for the bug where memory was over-allocated in triggers ( https://bugs.mysql.com/bug.php?id=86821) the select shows:

 
mysql> select event_name, current_alloc, high_alloc from memory_global_by_current_bytes where current_count > 0;
 
+--------------------------------------------------------------------------------+---------------+-------------+
 
| event_name                                                                     | current_alloc | high_alloc  |
 
+--------------------------------------------------------------------------------+---------------+-------------+
 
| memory/innodb/buf_buf_pool                                                     | 7.29 GiB      | 7.29 GiB    |
 
| memory/sql/sp_head::main_mem_root                                              | 3.21 GiB      | 3.62 GiB    |
 
...
 

The largest chunk of RAM is usually the buffer pool but ~3G in stored procedures seems to be too high.

According to the MySQL source code documentation, sp_head represents one instance of a stored program, which might be of any type (stored procedure, function, trigger, event). In the above case, we have a potential memory leak.

In addition, we can get a total report for each higher level event if we want to see from the bird's eye what is eating memory:

 
mysql> select  substring_index(
 
    ->     substring_index(event_name, '/', 2),
 
    ->     '/',
 
    ->     -1
 
    ->   )  as event_type,
 
    ->   round(sum(CURRENT_NUMBER_OF_BYTES_USED)/1024/1024, 2) as MB_CURRENTLY_USED
 
    -> from performance_schema.memory_summary_global_by_event_name
 
    -> group by event_type
 
    -> having MB_CURRENTLY_USED>0;
 
+--------------------+-------------------+
 
| event_type         | MB_CURRENTLY_USED |
 
+--------------------+-------------------+
 
| innodb             |              0.61 |
 
| memory             |              0.21 |
 
| performance_schema |            106.26 |
 
| sql                |              0.79 |
 
+--------------------+-------------------+
 
4 rows in set (0.00 sec)
 

I hope these simple steps can help troubleshoot MySQL crashes due to running out of memory.

 

转载于:https://www.cnblogs.com/DataArt/p/10240725.html

【嵌入式DIY实例ESP32篇】-步数计数器 在本项目中,我们将使用 ESP32 微控制器和博世的 BMI160 加速度计陀螺仪模块构建一款便携式计步器 阅读详情

相关推荐

【STC8G1K08A串口使用】

STC8G1K08A串口打印“Hello world”

m0_47459564的博客 1万+

【20180611】MySQL OOM

关于MySQL OOM的排查思路 服务器发生内存泄露 如何确认服务器发生内存泄漏: 一般执行free -m就查看内存的使用情况就可以了。假如cached和used的值相差特别大的话,安么这个时候我们可以认为发生了内存泄漏。(一般在CentOS6的版本上面可以这么认为,但是这个说法暂时还没有一个比较可信的依据) buffer和cache的区别: buffer: 缓冲,为了提高内存和硬盘之间的数...

weixin_33922670的博客 868

linux中的sendmail发送邮件

linux下的sendmail发送邮件

无痕的博客 6387

mysql 内存一直增长(memory/sql/thd::main_mem_root)

memory/sql/thd::main_mem_root

qq_44989936的博客 875

mysql 内存统计

在 mysql 5.5 中实现了类似mysql5.7中performance schema 的内存统计功能。 功能 1 展示mysql层内存总大小。 2 展示mysql层内存使用分布情况。 3 展示每个线程使用的内存总大小。 4 展示每个线程使用的内存分布情况。 演示 1 增加状态变量Memory_used 显示mysql层总体使用的内存大小。 mysql&g...

weixin_30362233的博客 307

CST--时域仿真的网格设置技巧

对于物理概念清晰的工程师而言,使用时域算法几乎能够解决所有电磁仿真问题,但是,掌握时域算法的仿真技巧比掌握频域的难度大,这恐怕也是很多仿真工程师更喜欢使用频域算法的原因,因此,对于时域算法的灵活应用更能考验你是否是一名合格的仿真工程师。

一只豌豆象的博客 6807

mysql主从同步出错troubleShooting一例,原因及常见解决方法

问题解决DEMO整体思路:分析同步异常信息,按部就班解决问题,若修复三个问题之后还有问题且数据量不太大考虑重建同步。show slave statusError: Worker 4 failed executing transaction '' at master log mysql-bin.000012, end_log_pos 60158; Error 'Can't DROP 'linenum

Ask Self,Ask Tomorrow 1020

【VAE学习笔记】全面通透地理解VAE(Variational Auto Encoder)

完整笔记:http://www.gwylab.com/note-vae.html 李宏毅老师的教程视频:https://www.bilibili.com/video/av15889450/?p=33 —————————————————————————————————   依据李宏毅老师的讲解,我整理了一番VAE的笔记。先简单介绍一下VAE,VAE作为一个生成模型,其基本思路是很容易理解的:把一堆真...

a312863063的博客 14万+

mysql 事务日志已满_解决事务日志已满错误 9002 的问题 - SQL Server | Microsoft Docs

解决事务日志已满的问题(SQL Server 错误 9002)Troubleshoot a Full Transaction Log (SQL Server Error 9002)08/05/2016本文内容适用于:Applies to: SQL ServerSQL Server(所有支持的版本)SQL ServerSQL Server (all supported versions)适用于:Ap...

weixin_30421223的博客 1290

mysql memory used_mysql 内存统计

在 mysql 5.5 中实现了类似mysql5.7中performance schema 的内存统计功能。功能1 展示mysql层内存总大小。2 展示mysql层内存使用分布情况。3 展示每个线程使用的内存总大小。4 展示每个线程使用的内存分布情况。演示1 增加状态变量Memory_used 显示mysql层总体使用的内存大小。mysql> show global status like ...

weixin_28763005的博客 1425

PX4代码解析(1)

前言 做pixhawk飞控有一段时间了,但在学习过程中遇到许多困难,目前网上找不到比较完整的PX4学习笔记,我打算结合自己理解,写写自己对PX4源码的理解,不一定对,只是希望与各位大佬交流交流,同时梳理一下无人机知识。 目前打算分享以下几个内容:代码架构;通信协议;姿态解算算法,控制算法。先这样,后面想到再加。本章先来聊聊px4代码结构 一、代码整体结构 既然要聊px4代码结构,那就先把px4代码结构图放出来,因为px4源码仍然在不断更新迭代,因此老版本与新版本目录结构可能有些不同,我的代码解析参考版本为V

qq_36903625的博客 1万+

98%的DBA不知道的数据库内存知识点

|作者 邓英明,腾讯云DBA,擅长数据库架构设计、故障诊断、性能优化,现主要负责腾讯云数据库MySQL/TDSQL-C/Redis的相关工作。在日常工作中,时不时会收到内存使用率高的告警,...

杨建荣的学习笔记 838

YOLOv8源码解析与复现:ShuffleAttention:高效的混合注意力机制 实现通道和空间混合注意力

随着深度学习在计算机视觉领域的飞速发展,卷积神经网络(CNNs)已经成为图像分类、目标检测、语义分割等任务的核心。为了进一步提升模型的性能,研究者们引入了“注意力机制”,旨在让网络能够动态地关注输入数据中最具信息量的部分。经典的注意力模块,如SE-Net(Squeeze-and-Excitation Networks)和CBAM(Convolutional Block Attention Module),通过通道注意力或结合通道与空间注意力,显著增强了模型的特征表达能力。

FJN110的博客 529

mysql源码解读——内存管理MEM_ROOT

一、内存管理 这个实在是没办法多说了,就当是沿袭所有框架的做法,自己搞一下内存管理,这样才高大上一样。MEM_ROOT定义在my_alloc.h(include文件夹)。其实内存管理最简单方便的就是统一分配,集中回收,动态调整。话说起来容易,做起来难啊。大牛们哪个不清丝明了的知道,可写一个适配大多数的场景下的这种内存管理代码是极其难的。不然,内存管理也不会上升到一个又一个算法推出的地步。 空间和时间的随时变化和内存资源的有限性,不同场合对内存调度的不确定性,都严重影响着编写内存管理者的设计思想。既要保证自己

fpcc的专栏 1208

MySQL 内存问题排查思路

简介:MySQL 内存持续增长的问题虽然不会经常发生,但是如果偶尔发生了,也会让我们不知所措。一 、如果碰到MySQL 内存持续升高问题的主要情况有4种:MySQL 没有合理设置 innodb_buffer_pool_size服务器上还有一些其他进程可以分配内内存。MySQL 内存泄漏。内存缓慢增长属于正常现象,但存在因为一些慢sql频繁执行并因MySQL的内存分配使用了系统glibc,而glibc本身的内存分配算法存在缺陷,导致内存释放不完全。二、MySQL 内存持续排查思路: 1 基于服务器的检查:

u012565458的博客 3137

Git下载与安装

一、Git下载 二、Git安装

欢迎订阅我的“JAVA全栈开发笔记(全)”专栏,价格优惠,仅需19.9元。 6万+

如何解决由触发器导致 MySQL 内存溢出?

MySQL 中不推荐使用大量的触发器以及复杂的存储过程。设置为 1 时,在高并发下会影响 SQL 的执行效率。本案例的从库并发量不高,其他场景请根据实际情况进行调整。触发器越多会导致占用的内存越大,存储过程所使用的内存也会越大。本文只是给出了解决内存溢出的一个方向,具体的底层原理请自行探索。先清空缓存再访问表,查看缓存。

ActionTech的博客 1227

最优控制 (Optimal Control) 算法详解及案例分析

最优控制是一种通过优化控制输入,使系统在满足约束条件的情况下达到最优性能的控制方法。其目标是最小化或最大化一个性能指标。

闲人编程的博客 2040

MySQL查看线程内存占用情况

在无法添加索引时,增加join_buffer_size的值,以获得更快的完全连接。这里会话参数调整后,需同时调整/etc/my.cnf的配置,下次服务启动永久生效,另外之前连接的会话线程由于已分配了该buffer大小,调整后内存并不会马上释放。该命令是在线打开内存统计,所以只会统计打开后新增的内存对象,打开前的内存对象不会统计,建议您打开后等待一段时间再执行后续步骤,便于找出内存使用高的线程。内存使用情况,决定着MySQL的性能,内存使用率过高会使系统响应时间变长,严重时内存耗尽还会出现OOM的情况。

wangleshisei的博客 1897

翻译| 如何排查MySQL 内存泄漏

Troubleshooting对crash的数据库进行故障分析并不是一件快乐的事情,尤其是 MySQL 的日志中没有提供 crash 原因的情形。比如当 MySQL 内存耗尽。在 201...

杨建荣的学习笔记 1005

最新2025写真图片视频打赏系统源码 打赏平台搭建 付费打赏视频源码网站制作 完整可用 附教程.zip

2025最新写真图片视频打赏系统源码完整可用 附教程这是一款开源的写真图片及视频打赏系统源码,顾名思义他可以做写真图片打赏站也可以做视频打赏站,支付对接了易支付,拥有独立代理后台,全部源码无加密,另外也可以配合付费进群使用。支付扣量、域名防洪这些基本的就不介绍了,看图吧!留给有需要的人!请勿用于违法用途,否则后果自负!

为什么数组没有提到释放空间而链表有提到?

在链表中,用malloc申请的空间一般都需要用free给释放掉,同时,用new申请的空间也需要用delet来释放,否则空间就会一直占着内存,若是申请的空间多的话,这会是一间很可怕的事情,用专业术语来说,这种现象是内存泄漏。而在数组中,操作系统会自动删除。 补充内存与硬盘的知识: 我们平常使用的程序,如Windows操作系统、打字软件、游戏软件等,一般都是安装在硬盘等外存上的,但仅此是不能使用其功能的,必须把它们调入内存中运行,才能真正使用其功能,我们平时输入一段文字,或玩一个游戏,其实都是在内存中进行的

bless_my_head的博客 574

会议管理系统源码.zip

有暇,搞了个会议管理系统,供刚入行的小伙伴们学习。有暇,搞了个会议管理系统,供刚入行的小伙伴们学习。有暇,搞了个会议管理系统,供刚入行的小伙伴们学习。有暇,搞了个会议管理系统,供刚入行的小伙伴们学习。有暇,搞了个会议管理系统,供刚入行的小伙伴们学习。有暇,搞了个会议管理系统,供刚入行的小伙伴们学习。有暇,搞了个会议管理系统,供刚入行的小伙伴们学习。有暇,搞了个会议管理系统,供刚入行的小伙伴们学习。有暇,搞了个会议管理系统,供刚入行的小伙伴们学习。有暇,搞了个会议管理系统,供刚入行的小伙伴们学习。有暇,搞了个会议管理系统,供刚入行的小伙伴们学习。有暇,搞了个会议管理系统,供刚入行的小伙伴们学习。有暇,搞了个会议管理系统,供刚入行的小伙伴们学习。有暇,搞了个会议管理系统,供刚入行的小伙伴们学习。有暇,搞了个会议管理系统,供刚入行的小伙伴们学习。有暇,搞了个会议管理系统,供刚入行的小伙伴们学习。有暇,搞了个会议管理系统,供刚入行的小伙

PreparedStatement 查询大容量数据内存溢出解决

PreparedStatement ps = con.prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); ResultSet rs = ps.executeQuery(); 在使用PreparedStatement 查询大容量数据时内存溢出,只需在prepar...

iteye_8029的博客 1138

mysql内存溢出分析办法

mysql内存监控大体归为一下3步 1.os角度查看mysql进程内存使用 2.mysql服务角度查看mysql内存池使用 3.开启performance_schema及内存监控 1.从OS进程使用情况出发,查看mysql进程的内存使用情况 因为mysql是单进程的,可以通过ps -aux或者top -H -p查看进程的内存使用情况 #ps -aux|grep 3306 root 40761 0.0 0.0 9696 1632 ? S Mar22 ...

liuzhilong的博客 3122

pll.zip_FRACTIONAL-N PLL_Fractional PLL_MATLAB 分频_PLL_分频

基于simulink的频率合成器实现,可实现小数分频

MYSQL内存请求一直不释放_MySQL内存不释放分析

问题分析场景1 使用sysbench压测数据库场景2 load 一个很大事务的insert语句问题突破测试jemalloc场景1使用sysbench压测数据库场景2 load 一个很大事务的insert语句小结MySQL到底有没有释放内存?通过gdb调试结论线上MySQL数据库发现一些实例,内存使用不断增高,并且当连接数断开后内存不会释放,最终导致的结果是被操作系统OOM问题分析模拟两个场景来分析...

weixin_33223159的博客 3439

DeepSeek助力国自然基金写作[源码]

本文探讨了如何利用DeepSeek提示词全方位助力国家自然科学基金(国自然基金)课题写作。文章从课题构思、申请书撰写、评估改进到综合审查四个环节,详细剖析了DeepSeek提示词的应用价值与实践策略。在课题构思阶段,DeepSeek可帮助凝练关键科学问题、构建研究思路框架及评估可行性;在申请书撰写环节,它能强化立项依据、精准提炼摘要与关键词,并细化研究方案;在评估改进阶段,通过模拟评审和数据分析提供针对性建议;最后,在综合审查中确保伦理规范与敏感信息安全。文章还通过成功案例展示了DeepSeek的实际效果,并展望了人工智能在科研领域的未来发展趋势。

故障排除指南:MySQL运行内存不足怎么办?

故障排除对于所有人来说都不会是一件有趣的事情,尤其是在没有崩溃报告的情况下。如果MySQL因内存不足而崩溃时应该怎么办?Peter Zaitsev曾在2012年写过的一篇博客中给出了许多有用的提示,而利用新版本的MySQL(...

763

mysql源码学习笔记:内存管理模块MEM_ROOT

源码为mysql-5.7.16社区版。 MEM_ROOT为mysql的内存管理模块,用于统一申请和释放内存,减少在堆中的内存申请操作的次数,以提升性能。这种内存管理的方法可以移植到其他的应用程序中,用于解决内存管理问题。

slwang001的博客 1432
上一篇: MySQL重做日志相关
下一篇: 数据包分析的基础
三叔的负能量
博客等级 码龄11年 12粉丝 96原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值