MySQL在长期运行过程中,如果发现进程占用内存不断上升且重启后过段时间又涨回去,就要考虑是否存在内存泄漏。MySQL本身提供了Performance Schema这一内置诊断框架,其中的内存监控仪能够按账户、线程、主机、用户以及具体内存类型统计分配与释放情况,是定位内存泄漏的实用手段。

开启Performance Schema内存监控
默认情况下,部分内存监控项可能未启用。可以通过setup_instruments表控制内存相关采集器:
-- 开启所有内存相关的instrument UPDATE performance_schema.setup_instruments SET ENABLED = 'YES', TIMED = 'YES' WHERE NAME LIKE 'memory/%'; -- 确认开启状态 SELECT NAME, ENABLED, TIMED FROM performance_schema.setup_instruments WHERE NAME LIKE 'memory/%' LIMIT 5;
关键内存监控表介绍
Performance Schema提供了一系列memory_summary开头的汇总表,常用如下:
- memory_summary_by_thread_by_event_name:按线程和事件名统计
- memory_summary_by_account_by_event_name:按账户统计
- memory_summary_by_user_by_event_name:按用户统计
- memory_summary_by_host_by_event_name:按主机统计
- memory_summary_global_by_event_name:全局按事件名统计
定位内存泄漏点
我们可以查询全局内存统计,找出分配量大且未释放的对象:
SELECT EVENT_NAME,
COUNT_ALLOC,
COUNT_FREE,
CURRENT_NUMBER_OF_BYTES_USED AS CUR_USED,
HIGH_NUMBER_OF_BYTES_USED AS HIGH_USED
FROM performance_schema.memory_summary_global_by_event_name
ORDER BY CUR_USED DESC
LIMIT 10;
若某个EVENT_NAME的CURRENT_NUMBER_OF_BYTES_USED远高于其他项,且COUNT_ALLOC与COUNT_FREE差值持续扩大,就说明此处可能存在泄漏。进一步可换成按线程查询:
SELECT THREAD_ID, EVENT_NAME,
CURRENT_NUMBER_OF_BYTES_USED AS CUR_USED
FROM performance_schema.memory_summary_by_thread_by_event_name
ORDER BY CUR_USED DESC
LIMIT 10;
结合线程找源头
拿到可疑THREAD_ID后,关联threads表确认其所属用户与程序:
SELECT t.THREAD_ID, t.PROCESSLIST_USER, t.PROCESSLIST_HOST,
t.PROCESSLIST_INFO, m.EVENT_NAME, m.CURRENT_NUMBER_OF_BYTES_USED
FROM performance_schema.threads t
JOIN performance_schema.memory_summary_by_thread_by_event_name m
ON t.THREAD_ID = m.THREAD_ID
WHERE t.THREAD_ID = 12345
ORDER BY m.CURRENT_NUMBER_OF_BYTES_USED DESC;
常见泄漏原因与处理
| 现象 | 可能原因 | 处理建议 |
|---|---|---|
| memory/sql/THD持续上涨 | 连接未正确关闭 | 检查应用连接池释放逻辑 |
| memory/innodb多类上涨 | 特定SQL大量内部临时结构 | 优化慢查询,调整buffer配置 |
| memory/mysys分配异常 | 插件或UDF问题 | 禁用可疑插件并升级版本 |
注意事项
开启内存监控会带来轻微性能开销,生产环境建议仅在排查时开启,定位完成后可关闭非必要instrument。另外,Performance Schema统计的是MySQL内部内存,不包括操作系统级缓存,若整体内存仍高还需结合top等系统命令分析。
通过Performance Schema的内存监控仪,无需外部工具即可看清MySQL内存流向,是排查泄漏的第一手方案。
MySQLPerformance_Schema内存泄漏修改时间:2026-07-25 20:03:13