You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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说明未配置大页,按照以下步骤配置:
      1. 先关闭AMM(大页不支持AMM)
      2. 计算需要的大页数量:HugePages_Total = ceil(sga_max_size / Hugepagesize) + 2,Hugepagesize默认是2MB
      3. 编辑/etc/sysctl.conf添加:vm.nr_hugepages = 计算出的数值,执行sysctl -p生效
      4. 编辑/etc/security/limits.conf给Oracle用户添加大页内存锁定权限:
        oracle soft memlock unlimited
        oracle hard memlock unlimited
        
      5. 重启数据库实例生效。

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生效:
    alter system set filesystemio_options=setall scope=spfile;
    
    重启数据库实例后即可避免Oracle数据占用系统页缓存。

注意:你执行的drop_caches命令只能释放操作系统层面的文件缓存,Oracle自身占用的SGA、PGA以及OS页表内存属于进程占用内存,该命令完全无法释放,所以之前操作无效是正常现象。

内容的提问来源于stack exchange,提问作者Muhammad Saleem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 06:36:03