MySQL内存使用率高问题排查过程以及解决方案

 更新时间:2025年07月05日 09:41:30   作者:喝醉酒的小白  
在生产环境中MySQL作为一个关键的数据库组件,其性能对整个系统的稳定性至关重要,这篇文章主要介绍了MySQL内存使用率高问题排查过程以及解决方案的相关资料,需要的朋友可以参考下

一、问题现象

  • 内存占用异常:通过top命令发现MySQL进程(mysqld)占用了90.7%的物理内存(56.5G/62G)。
  • 系统负载:CPU使用率较低(1.3%),但内存几乎耗尽。

二、核心排查步骤

1. 参数检查

  • MySQL版本:8.0.39(未开启慢查询日志)。
  • 关键内存参数
    SHOW VARIABLES LIKE 'innodb_buffer_pool_size';  -- 12G(配置较低,建议调整为总内存的70%~80%)
    SHOW VARIABLES LIKE 'tmp_table_size';           -- 16M(临时表内存限制过小)
    
  • 临时文件路径/tmp(建议改为专用目录以避免性能问题)。

2. 内存使用分析

  • 全局内存统计

    SELECT SUM(CAST(replace(current_alloc,'MiB','') AS DECIMAL(10,2))) 
    FROM sys.memory_global_by_current_bytes 
    WHERE current_alloc LIKE '%MiB%';
    

    结果:总内存使用约1933.69MB。

  • 分事件内存占用

    SELECT event_name, sys.format_bytes(CURRENT_NUMBER_OF_BYTES_USED)
    FROM performance_schema.memory_summary_global_by_event_name
    ORDER BY CURRENT_NUMBER_OF_BYTES_USED DESC LIMIT 10;
    

    关键发现

    • memory/innodb/buf_buf_pool占用13.29GB(InnoDB缓冲池)。
    • memory/group_rpl/Gcs_xcom::xcom_cache占用1024MB(复制相关缓存)。
  • 用户级内存统计

    SELECT user, event_name, current_number_of_bytes_used/1024/1024 AS MB_USED
    FROM performance_schema.memory_summary_by_account_by_event_name
    WHERE host <> "localhost"
    ORDER BY MB_USED DESC LIMIT 10;
    

    发现:特定用户(如zqzh)在memory/temptable/physical_ram中占用65MB。

3. 存储过程/函数/视图检查

  • 存储过程与函数

    SELECT Routine_schema, Routine_type 
    FROM information_schema.Routines 
    WHERE Routine_schema NOT IN ('mysql','information_schema','performance_schema','sys');
    

    结果:多个业务库存在大量存储过程和函数(如bpcbsc等)。

  • 视图与触发器

    SELECT TABLE_SCHEMA, COUNT(TABLE_NAME) FROM information_schema.VIEWS;
    SELECT TRIGGER_SCHEMA, COUNT(*) FROM information_schema.triggers;
    

    结果:视图和触发器数量较少,非主要内存消耗源。

4. 操作系统级检查

  • 进程内存占用

    ps -eo user,pid,vsz,rss | grep mysqld
    

    结果mysqld进程虚拟内存(VIRT)96.2G,物理内存(RES)56.5G。

  • 内存映射分析

    pmap -d <mysql_pid> | tail -1
    

    关键指标

    • writeable/private:进程实际占用的私有内存(持续增长可能提示内存泄漏)。
  • 透明大页(THP)检查

    cat /sys/kernel/mm/transparent_hugepage/enabled
    

    结果:THP处于开启状态(可能导致内存分配效率低下)。

三、解决方案

1. 调整MySQL配置

  • 增加InnoDB缓冲池
    innodb_buffer_pool_size = 48G  -- 根据总内存(62G)调整为77%
    
  • 优化临时表内存
    tmp_table_size = 256M
    max_heap_table_size = 256M
    

2. 关闭透明大页(THP)

  • 临时关闭
    echo never > /sys/kernel/mm/transparent_hugepage/enabled
    echo never > /sys/kernel/mm/transparent_hugepage/defrag
    
  • 永久关闭
    /etc/rc.local中添加:
    if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
        echo never > /sys/kernel/mm/transparent_hugepage/enabled
    fi
    if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
        echo never > /sys/kernel/mm/transparent_hugepage/defrag
    fi
    

3. 优化查询与存储过程

  • 分析慢查询:开启慢查询日志,定位低效SQL。
  • 减少存储过程依赖:将复杂逻辑移至应用层,避免存储过程内存泄漏。

4. 硬件与环境优化

  • 增加物理内存:若业务需求增长,考虑升级服务器内存。
  • 迁移临时文件目录:将tmpdir设置为专用高速存储路径。

四、总结

  • 核心问题:MySQL内存使用率高主要由InnoDB缓冲池配置不足、THP机制效率低下及存储过程/函数内存占用引起。
  • 解决重点:调整缓冲池大小、关闭THP、优化查询逻辑。
  • 后续监控:通过sys.memory_global_by_current_bytespmap持续观察内存变化。

通过以上步骤,可显著降低MySQL内存占用并提升稳定性。

附:为了解决高内存占用问题,可以采取以下措施

  1. 仔细审查并调整MySQL的其他内存相关配置项,确保它们合理且与系统资源匹配。
  2. 监控并分析MySQL的实际内存使用情况,使用如SHOW ENGINE INNODB STATUS;和performance_schema来获取更详细的内存使用报告。
  3. 考虑调整操作系统的内存管理策略,比如调整THP设置或使用/proc/sys/vm/swappiness来调整内存交换行为。
  4. 如果确定内存分配合理,且应用确实需要这么多内存来保证性能,那么可能需要接受较高的内存占用率作为正常现象,或考虑增加服务器物理内存。

到此这篇关于MySQL内存使用率高问题排查过程以及解决方案的文章就介绍到这了,更多相关MySQL内存使用率高问题内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • windows 10 下安装mysql 5.7.17的简单笔记

    windows 10 下安装mysql 5.7.17的简单笔记

    之前一直在Linux下用MySQL,安装也很简单,今天试一下windows下安装,发现有很多坑,今天小编通过本教程给大家记录下,一起看看吧
    2016-12-12
  • mysql kill进程后出现killed死锁问题及解决

    mysql kill进程后出现killed死锁问题及解决

    这篇文章主要介绍了mysql kill进程后出现killed死锁问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • 在Linux系统的命令行中为MySQL创建用户的方法

    在Linux系统的命令行中为MySQL创建用户的方法

    这篇文章主要介绍了在Linux系统的命令行中为MySQL创建用户的方法,包括对所建用户的权限管理,需要的朋友可以参考下
    2015-06-06
  • MySQL 中如何归档数据的实现方法

    MySQL 中如何归档数据的实现方法

    本文主要介绍了MySQL 中如何归档数据的实现方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • MySQL故障排查与生产环境优化指南

    MySQL故障排查与生产环境优化指南

    本文基于 MySQL 8.0 生产环境,整理高频故障排查方案、全维度优化配置、SQL 性能调优,包含完整可执行代码,补充关键知识点,简洁易懂、不与原文重复,需要的朋友可以参考下
    2026-04-04
  • MySQL中is null和=null的区别及说明

    MySQL中is null和=null的区别及说明

    这篇文章主要介绍了MySQL中is null和=null的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • MYSQL锁表问题的解决方法

    MYSQL锁表问题的解决方法

    这篇文章主要介绍了MYSQL锁表问题的解决方法,结合实例形式分析了MySQL锁表问题的常见情况与相应解决方法,需要的朋友可以参考下
    2016-03-03
  • 详解如何通过Mysql的二进制日志恢复数据库数据

    详解如何通过Mysql的二进制日志恢复数据库数据

    本篇文章主要介绍了详解如何通过Mysql的二进制日志恢复数据库数据,具有一定的参考价值,有兴趣的可以了解一下。
    2017-04-04
  • mysql之create index和alter add index用法及说明

    mysql之create index和alter add index用法及说明

    本文详细介绍了MySQL创建索引的三种方法,包括直接创建索引和使用ALTER TABLE添加索引,并对比了两种方法的优缺点,建议在创建索引时优先使用ALTER TABLE以提高效率
    2026-06-06
  • MySQL数据库IP白名单的安全设置指南

    MySQL数据库IP白名单的安全设置指南

    本文详细指导如何在MySQL服务器上安全地设置IP白名单,包括登录、查看权限、使用GRANT语句、刷新权限以及防火墙和云服务注意事项,确保数据库安全,防止未经授权访问,需要的朋友可以参考下
    2025-08-08

最新评论