文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-04-02 19:55

关注

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

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

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

首先,我们先来看一下在哪些情况下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_alloc
from sys.memory_global_by_current_bytes
where 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)
阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯