Oracle 19c及11g版本数据库内存持续增长耗尽故障求助
问题排查与解决方案
1. 优先检查Oracle内存参数配置
- 登录数据库实例,执行以下SQL查看内存相关参数:
show parameter memory_max_target; show parameter memory_target; show parameter sga_max_size; show parameter sga_target; show parameter pga_aggregate_target; show parameter pga_aggregate_limit;
- 重点确认
memory_max_target、sga_max_size、pga_aggregate_limit三个参数的总和是否超过物理内存的70%,Oracle官方推荐OLTP场景数据库总内存占用不超过系统物理内存的75%,需要预留足够内存给OS内核和进程使用。如果未设置上限或上限过高,会导致Oracle持续抢占系统内存,直到占满。 - 如果你使用的是AMM(自动内存管理),OL8默认的
/dev/shm大小如果不足或者设置不合理也会触发异常内存占用,建议切换为ASMM(自动共享内存管理),关闭AMM:
重启数据库实例生效。alter system reset memory_target scope=spfile; alter system reset memory_max_target scope=spfile; alter system set sga_max_size=XXG scope=spfile; -- 根据物理内存设置,比如32G内存设为20G alter system set sga_target=XXG scope=spfile; alter system set pga_aggregate_target=XXG scope=spfile; -- 通常设为SGA的20%~30% alter system set pga_aggregate_limit=XXG scope=spfile; -- 略高于pga_aggregate_target
2. 检查大页(HugePage)配置
- Oracle Linux上运行Oracle DB未配置大页是内存持续上涨的高发原因,未用大页时,OS页表会随着Oracle内存占用升高而持续膨胀,这部分内存
drop_caches是无法释放的。 - 执行
grep HugePages /proc/meminfo查看当前大页配置:- 若
HugePages_Total为0说明未配置大页,按照以下步骤配置:- 先关闭AMM(大页不支持AMM)
- 计算需要的大页数量:
HugePages_Total = ceil(sga_max_size / Hugepagesize) + 2,Hugepagesize默认是2MB - 编辑
/etc/sysctl.conf添加:vm.nr_hugepages = 计算出的数值,执行sysctl -p生效 - 编辑
/etc/security/limits.conf给Oracle用户添加大页内存锁定权限:oracle soft memlock unlimited oracle hard memlock unlimited - 重启数据库实例生效。
- 若
3. 排查PGA内存泄露
- 业务大量使用PL/SQL存储过程,很可能出现PGA内存未释放的情况,执行以下SQL查看每个进程的PGA占用:
select program, pga_used_mem, pga_alloc_mem, pga_max_mem from v$process order by pga_alloc_mem desc;
- 如果发现某个进程的PGA持续上涨不释放,检查对应会话的SQL是否有游标未关闭、临时表未清空的问题,同时可以设置
pga_aggregate_limit硬限制PGA最大占用,超过后Oracle会自动终止异常会话。
4. 验证内存占用归属
- 执行
free -h确认占满的内存是buff/cache还是used:- 如果是
used占满,90%以上概率是上面Oracle参数或大页的问题 - 如果是
buff/cache占满且drop_caches无法释放,检查是否有Oracle的数据文件直接IO配置未开启,开启filesystemio_options=SETALL参数让Oracle使用直接IO绕开系统缓存,执行以下SQL生效:
重启数据库实例后即可避免Oracle数据占用系统页缓存。alter system set filesystemio_options=setall scope=spfile; - 如果是
注意:你执行的
drop_caches命令只能释放操作系统层面的文件缓存,Oracle自身占用的SGA、PGA以及OS页表内存属于进程占用内存,该命令完全无法释放,所以之前操作无效是正常现象。
内容的提问来源于stack exchange,提问作者Muhammad Saleem
相关产品推荐
相关产品推荐

