千家信息网

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

发表于:2024-11-25 作者:千家信息网编辑
千家信息网最后更新 2024年11月25日,故障排除对于所有人来说都不会是一件有趣的事情,尤其是在没有崩溃报告的情况下。如果MySQL因内存不足而崩溃时应该怎么办?Peter Zaitsev曾在2012年写过的一篇博客中给出了许多有用的提示,而
千家信息网最后更新 2024年11月25日故障排除指南: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安全错误 数据库的锁怎样保障安全 银行软件开发必部笔试内容 房山区网络技术售后服务 确保pi数据库镜像安全 江苏有鱼互联网科技有限公司 服务器远程操作教程 网络技术从业人数与人才状况 dos命令安装数据库 数据库检测报告范本 软件开发者能在后台植入病毒吗 北京融保网络技术有限公司 迪庆互联网科技招生 上海智行合力网络技术 代理服务器管理 安卓 广西北大青鸟软件开发培训 数据库卡是什么原因 想学手机软件开发相关专业 戴尔服务器的电源冗余策略 怪物猎人p3服务器 NCBI各子数据库之间的关系 深圳和为网络技术有限公司 数据库查询最低分学生学号 辰华网络技术服务公司 淘宝上卖数据库合法吗 确保pi数据库镜像安全 易语言mdb数据库 qq群视频连接不上服务器 打联通电话说乐话信箱服务器 网络安全专项整改报告怎么写 戴尔服务器的电源冗余策略 亿城新房网络技术
0