• ADADADADAD

    故障排除指南:MySQL运行内存不足怎么办?[ mysql数据库 ]

    mysql数据库 时间:2024-12-03 12:14:23

    作者:文/会员上传

    简介:

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

    以下为本文的正文内容,内容仅供参考!本站为公益性网站,复制本文以及下载DOC文档全部免费。

    故障排除对于所有人来说都不会是一件有趣的事情,尤其是在没有崩溃报告的情况下。如果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操作系统和配置,

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

        检查可用的RAM:free-gcat/proc/meminfo

        检查哪些应用程序正在使用RAM:“top”或“htop”

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

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

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

      检查MySQL内部

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

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

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

        Table cache

        Performance_schema(运行:showengineperformance_schemastatus,并查看最后一行)。

        InnoDB(运行showengineinnodbstatus 并检查缓冲池部分,为buffer_pool和相关缓存分配的内存)

        RAM中的临时表(通过运行以下语句查找所有内存表:select*frominformation_schema.tableswhereengine='MEMORY')

        Prepared statements。

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

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

      UPDATEsetup_instrumentsSETENABLED='YES'WHERENAMELIKE'memory/%';

      sys schema运行report:

      selectevent_name,current_alloc,high_allocfromsys.memory_global_by_current_byteswherecurrent_count>0;

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

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

      mysql>selectevent_name,current_alloc,high_allocfrommemory_global_by_current_byteswherecurrent_count>0;+--------------------------------------------------------------------------------+---------------+-------------+|event_name|current_alloc|high_alloc|+--------------------------------------------------------------------------------+---------------+-------------+|memory/innodb/buf_buf_pool|7.29GiB|7.29GiB||memory/sql/sp_head::main_mem_root|3.21GiB|3.62GiB

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

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

      mysql>selectsubstring_index(->substring_index(event_name,'/',2),->'/',->-1->)asevent_type,->round(sum(CURRENT_NUMBER_OF_BYTES_USED)/1024/1024,2)asMB_CURRENTLY_USED->fromperformance_schema.memory_summary_global_by_event_name->groupbyevent_type->havingMB_CURRENTLY_USED>0;+--------------------+-------------------+|event_type|MB_CURRENTLY_USED|+--------------------+-------------------+|innodb|0.61||memory|0.21||performance_schema|106.26||sql|0.79|+--------------------+-------------------+4rowsinset(0.00sec)
    故障排除指南:MySQL运行内存不足怎么办?.docx

    将本文的Word文档下载到电脑

    推荐度:

    下载
    热门标签: mysql不足排除