MySQL内存使用率高问题排查过程以及解决方案!
MySQL内存使用率高问题排查过程以及解决方案!
作者:喝醉酒的小白
在生产环境中MySQL作为一个关键的数据库组件,其性能对整个系统的稳定性至关重要,这篇文章主要介绍了MySQL内存使用率高问题排查过程以及解决方案的相关资料,需要的朋友可以参考下。
一、问题现象
- 内存占用异常:通过
top命令发现MySQL进程(mysqld)占用了90.7%的物理内存(56.5G/62G)。 - 系统负载:CPU使用率较低(1.3%),但内存几乎耗尽。
二、核心排查步骤
1. 参数检查
- MySQL版本:8.0.39(未开启慢查询日志)。
- 关键内存参数:
12
SHOW VARIABLESLIKE'innodb_buffer_pool_size';-- 12G(配置较低,建议调整为总内存的70%~80%)SHOW VARIABLESLIKE'tmp_table_size';-- 16M(临时表内存限制过小) - 临时文件路径:
/tmp(建议改为专用目录以避免性能问题)。
2. 内存使用分析
- 全局内存统计:
123
SELECTSUM(CAST(replace(current_alloc,'MiB','')ASDECIMAL(10,2)))FROMsys.memory_global_by_current_bytesWHEREcurrent_allocLIKE'%MiB%';结果:总内存使用约1933.69MB。
- 分事件内存占用:
123
SELECTevent_name, sys.format_bytes(CURRENT_NUMBER_OF_BYTES_USED)FROMperformance_schema.memory_summary_global_by_event_nameORDERBYCURRENT_NUMBER_OF_BYTES_USEDDESCLIMIT 10;关键发现:
memory/innodb/buf_buf_pool占用13.29GB(InnoDB缓冲池)。memory/group_rpl/Gcs_xcom::xcom_cache占用1024MB(复制相关缓存)。
- 用户级内存统计:
1234
SELECTuser, event_name, current_number_of_bytes_used/1024/1024ASMB_USEDFROMperformance_schema.memory_summary_by_account_by_event_nameWHEREhost <>"localhost"ORDERBYMB_USEDDESCLIMIT 10;发现:特定用户(如
zqzh)在memory/temptable/physical_ram中占用65MB。
3. 存储过程/函数/视图检查
- 存储过程与函数:
123
SELECTRoutine_schema, Routine_typeFROMinformation_schema.RoutinesWHERERoutine_schemaNOTIN('mysql','information_schema','performance_schema','sys');结果:多个业务库存在大量存储过程和函数(如
bpc、bsc等)。 - 视图与触发器:
12
SELECTTABLE_SCHEMA,COUNT(TABLE_NAME)FROMinformation_schema.VIEWS;SELECTTRIGGER_SCHEMA,COUNT(*)FROMinformation_schema.triggers;结果:视图和触发器数量较少,非主要内存消耗源。
4. 操作系统级检查
- 进程内存占用:
1
ps-eouser,pid,vsz,rss | grep mysqld结果:
mysqld进程虚拟内存(VIRT)96.2G,物理内存(RES)56.5G。 - 内存映射分析:
1
pmap-d<mysql_pid> | tail -1关键指标:
writeable/private:进程实际占用的私有内存(持续增长可能提示内存泄漏)。
- 透明大页(THP)检查:
1
cat/sys/kernel/mm/transparent_hugepage/enabled结果:THP处于开启状态(可能导致内存分配效率低下)。
三、解决方案
1. 调整MySQL配置
- 增加InnoDB缓冲池:
1
innodb_buffer_pool_size = 48G-- 根据总内存(62G)调整为77% - 优化临时表内存:
12
tmp_table_size = 256Mmax_heap_table_size = 256M
2. 关闭透明大页(THP)
- 临时关闭:
12
echonever > /sys/kernel/mm/transparent_hugepage/enabledechonever > /sys/kernel/mm/transparent_hugepage/defrag - 永久关闭:
在/etc/rc.local中添加:
|
1
2
3
4
5
6
|
if test -f /sys/kernel/mm/transparent_hugepage/enabled; thenecho never > /sys/kernel/mm/transparent_hugepage/enabledfiif test -f /sys/kernel/mm/transparent_hugepage/defrag; thenecho never > /sys/kernel/mm/transparent_hugepage/defragfi |
3. 优化查询与存储过程
- 分析慢查询:开启慢查询日志,定位低效SQL。
- 减少存储过程依赖:将复杂逻辑移至应用层,避免存储过程内存泄漏。
4. 硬件与环境优化
- 增加物理内存:若业务需求增长,考虑升级服务器内存。
- 迁移临时文件目录:将
tmpdir设置为专用高速存储路径。
四、总结
- 核心问题:MySQL内存使用率高主要由InnoDB缓冲池配置不足、THP机制效率低下及存储过程/函数内存占用引起。
- 解决重点:调整缓冲池大小、关闭THP、优化查询逻辑。
- 后续监控:通过
sys.memory_global_by_current_bytes和pmap持续观察内存变化。
通过以上步骤,可显著降低MySQL内存占用并提升稳定性。
附:为了解决高内存占用问题,可以采取以下措施
- 仔细审查并调整MySQL的其他内存相关配置项,确保它们合理且与系统资源匹配。
- 监控并分析MySQL的实际内存使用情况,使用如SHOW ENGINE INNODB STATUS;和performance_schema来获取更详细的内存使用报告。
- 考虑调整操作系统的内存管理策略,比如调整THP设置或使用/proc/sys/vm/swappiness来调整内存交换行为。
- 如果确定内存分配合理,且应用确实需要这么多内存来保证性能,那么可能需要接受较高的内存占用率作为正常现象,或考虑增加服务器物理内存。
到此这篇关于MySQL内存使用率高问题排查过程以及解决方案的文章就介绍到这了。
学习资料见知识星球。
以上就是今天要分享的技巧,你学会了吗?若有什么问题,欢迎在下方留言。
快来试试吧,小琥 my21ke007。获取 1000个免费 Excel模板福利!
更多技巧, www.excelbook.cn
欢迎 加入 零售创新 知识星球,知识星球主要以数据分析、报告分享、数据工具讨论为主;
1、价值上万元的专业的PPT报告模板。
2、专业案例分析和解读笔记。
3、实用的Excel、Word、PPT技巧。
4、VIP讨论群,共享资源。
5、优惠的会员商品。
6、一次付费只需129元,即可下载本站文章涉及的文件和软件。

