千家信息网

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

发表于:2025-11-14 作者:千家信息网编辑
千家信息网最后更新 2025年11月14日,故障排除对于所有人来说都不会是一件有趣的事情,尤其是在没有崩溃报告的情况下。如果MySQL因内存不足而崩溃时应该怎么办?Peter Zaitsev曾在2012年写过的一篇博客中给出了许多有用的提示,而
千家信息网最后更新 2025年11月14日故障排除指南:MySQL运行内存不足怎么办?

故障排除对于所有人来说都不会是一件有趣的事情,尤其是在没有崩溃报告的情况下。如果MySQL因内存不足而崩溃时应该怎么办?Peter Zaitsev曾在2012年写过的一篇博客中给出了许多有用的提示,而利用新版本的MySQL(5.7及以上)和performance_schema,我们可以更轻松地解决MySQL内存分配问题。

本文将向大家介绍如何解决MySQL内存分配问题。

首先,我们先来看一下在哪些情况下MySQL会因内存不足而崩溃:

  • 当MySQL尝试分配比可用内存更多的内存时,例如没有正确设置innodb_buffer_pool_size;

  • 服务器上还有一些其他进程可以分配RAM,比如它应用程序(java,python,php)、Web服务器,或者是备份(即mysqldump)。

  • MySQL中的内存泄漏。这是最糟糕的情况,我们需要进行故障排除。

以上,就是常见的三种MySQL因内存不足而崩溃的情况,其中前两种情况比较好解决,而第三种情况就比较棘手。

从哪里开始排除MySQL内存泄漏问题

假设这是一个Linux服务器,首先我们要 检查Linux操作系统和配置

  1. 检查mysql错误日志和Linux日志文件(即/ var / log / messages或/ var / log / syslog)来识别崩溃。你可能会看到OOM Killer杀死MySQL的条目,可以使用"dmesg"来显示相关的详细信息。

  2. 检查可用的RAM: free -g cat / proc / meminfo

  3. 检查哪些应用程序正在使用RAM: "top"或"htop"

  4. 检查mysql配置: /etc/my.cnf 或general /etc/my* (including /etc/mysql/*等文件),MySQL可能正在运行不同的my.cnf(run ps ax | grep mysql )

  5. 运行 vmstat 5 5 以查看系统是否正在通过虚拟内存进行读/写以及是否正在进行交换

  6. 对于非生产环境,我们可以使用其他工具(如Valgrind,gdb等)来检查MySQL的使用情况.

检查MySQL内部

我们也可以通过检查MySQL内部来发现潜在的MySQL内存泄露。MySQL在很多地方都会有内存分配,尤其是在以下情况下:

现在我们可以检查MySQL内部的东西来寻找潜在的MySQL内存泄漏。

MySQL在很多地方分配内存。特别:

  1. Table cache

  2. Performance_schema(运行: show engine performance_schema status ,并查看最后一行)。

  3. InnoDB(运行 show engine innodb status 并检查缓冲池部分,为buffer_pool和相关缓存分配的内存)

  4. RAM中的临时表(通过运行以下语句查找所有内存表: select * from information_schema .tables where engine ='MEMORY' )

  5. Prepared statements。

不过,从MySQL 5.7版本开始,我们就可以在performance_schema中查看内存分配。那么,如何使用呢?

首先,我们需要启用收集内存指标。Run:

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

sys schema 运行 report

select event_name, current_alloc, high_allocfrom sys.memory_global_by_current_byteswhere current_count > 0;

通常,分配内存时会提供代码,所以在某些情况下搜索某些错误时,我们可能需要检查 MySQL 源代码。例如,对于在触发器中过度分配内存的错误:

某些情况下搜索某些错误时,我们可能需要检查MySQL源代码。例如,对于在触发器中过度分配内存的错误:

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

RAM中最大的块通常是缓冲池,但存储过程中的3G似乎也太高了。

根据MySQL源代码文档,SPHead表示存储程序的一个实例,该程序可能是任何类型(存储过程、函数、触发器、事件)。在这种情况下,就会有潜在的内存泄漏。此外,如果我们想要更清楚的知道MySQL内存情况,还可以得到一个更高级别的总报告。

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)
内存 情况 检查 分配 运行 错误 正在 程序 服务器 源代码 潜在 触发器 问题 存储 服务 故障 地方 应用程序 报告 文件 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 打开啊网络安全手抄报简单易画 老夫子网络技术有限公司 喜默缘网络技术服务公司 网络技术帧中继 安徽党员教育软件开发系统 go语言桌面软件开发机器码 怎么软件开发 前十软件开发费用 打开数据库报错不能加载主类 软件设计和网络安全 网络安全行业金融项目特点 qq仙侠传怎么查看服务器 苹果电脑直连服务器 网络安全龙头中小板 中国网络安全目录 周鸿祎谈网络安全行业 代理服务器出问题连不上网 陕西省文艺院团数据库 电商要买哪种服务器 嘉兴软件开发专业学校 杭州是秒互联网科技有限公司 求生之路正版无法找到服务器 软件开发服务资质三级认证机构 卓岚串口服务器读取数据速度慢 航天金税盘代理服务器怎么设置 富民信息化软件开发市场报价 昆山网络安全决赛 软程科技软件开发如何报价 数据库备份事务日志是什么 恶意攻击无线网络安全
0