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内存使用率高问题内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL explain获取查询指令信息原理及实例

    MySQL explain获取查询指令信息原理及实例

    这篇文章主要介绍了MySQL explain获取查询指令信息原理及实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • MySQL 触发器的使用及需要注意的地方

    MySQL 触发器的使用及需要注意的地方

    这篇文章主要介绍了MySQL 触发器的使用及需要注意的地方,帮助大家更好的理解和使用MySQL,感兴趣的朋友可以了解下
    2021-01-01
  • Java连接MySql的详细介绍

    Java连接MySql的详细介绍

    本篇文章主要是对Java连接MySql的详细介绍。需要的朋友参考下
    2013-04-04
  • mysql分表分库的应用场景和设计方式

    mysql分表分库的应用场景和设计方式

    为大家讲述一下在mysql在什么到时候需要进行分表分库,以及现实的设计方式。
    2017-11-11
  • MySQL如何实现快速插入大量测试数据

    MySQL如何实现快速插入大量测试数据

    这篇文章主要介绍了MySQL如何实现快速插入大量测试数据问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • MySQL开发规范与使用技巧总结

    MySQL开发规范与使用技巧总结

    今天小编就为大家分享一篇关于MySQL开发规范与使用技巧总结,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • 详解MySQL中UNION的用法

    详解MySQL中UNION的用法

    这篇文章主要介绍了详解MySQL中UNION的用法,是MySQL入门学习中的基础知识,需要的朋友可以参考下
    2015-05-05
  • Linux下MySql 1036 错误码解决(1036: Table ''xxxx'' is read only)

    Linux下MySql 1036 错误码解决(1036: Table ''xxxx'' is read only)

    我们在进行数据库搬家的时候,经常会遇到(1036: Table 'xxxx' is read only)的问题,字面意思很明确,就是数据库只有读权限,无写权限,那么我们来分享下我的处理办法
    2014-07-07
  • MySQL数据库忽略大小写的配置方法

    MySQL数据库忽略大小写的配置方法

    这篇文章主要给大家介绍了MySQL数据库忽略大小写的配置方法,文中通过代码示例给大家讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-01-01
  • SQL Server携程核心系统无感迁移到MySQL实战

    SQL Server携程核心系统无感迁移到MySQL实战

    这篇文章主要介绍了SQL Server携程核心系统无感迁移到MySQL实战,文章通过基于数据库部署架构镜像构建了订单缓存统一管理热点数据,解决各端差异,具体详情需要的小伙伴可以参考下面文章详细内容
    2022-05-05

最新评论