Oracle RAC节点内存使用不均如何处理

浅萱大大_8282

浅萱大大_8282

2026-07-22

495人浏览

原创

要分层定位内存占用者,先查oracle实例sga/pga实际用量,再查os层非oracle进程和共享内存段残留,避免盲目调参。

oracle rac节点内存使用不均如何处理

查清楚到底是谁在吃内存:别只看 top,要分层定位

单看 top 或 free -h 说“节点1内存98%、节点2才70%”,没用——你得拆开看 Oracle 进程、系统缓存、其他用户进程各自占多少。RAC 节点内存不均,80% 以上是某类进程或配置偏差导致,不是随机现象。

  • 先确认 Oracle 实例实际使用的 SGA+PGA:show parameter sga_target 和 show parameter pga_aggregate_target 查配置;再跑 SELECT SUM(pga_used_mem)/1024/1024/1024 FROM gv$process 算各节点 PGA 实际用量(注意是 gv$process,不是 v$process)
  • SGA 实际分配看 SELECT inst_id, component, current_size/1024/1024 AS mb FROM gv$memory_dynamic_components,重点比对 DEFAULT buffer cache、shared_pool、large_pool 是否某节点明显偏大
  • 查非 Oracle 进程:在 OS 层用 ps aux --sort=-%mem | head -20,特别留意 Python、Java、备份脚本等常驻进程——案例里两个 alert_monitor.py 就吃掉 120G 内存
  • 检查共享内存段是否残留:ipcs -m 看是否有未释放的 hugepage 段,尤其当之前重启过实例但没 clean shutdown 时

SGA 分配失衡:db_cache_size 不是全局开关,别乱调

db_cache_size 是实例级参数,每个节点独立生效。有人看到节点1慢,就只给它加大 db_cache_size,结果节点1 SGA 暴涨、挤压 shared_pool,反而引发 ORA-4031 和大量硬解析,CPU 升高、GC 等待飙升——这不是均衡,是制造瓶颈。

  • 查真实缓存使用:SELECT inst_id, component, current_size FROM gv$memory_dynamic_components WHERE component = 'DEFAULT buffer cache',对比各节点值是否偏离超过 2 倍
  • 如果某节点 current_size 远高于配置值,说明 AMM(memory_target)在动态调整,此时手动设 db_cache_size 会被忽略,得先关 AMM 或调 memory_max_target
  • 盲目加缓存前,先看 gc cr blocks received 和 gc current blocks received:若前者远高于后者,说明该节点读热点集中但本地缓存命中差,加 db_cache_size 可能缓解;若后者远高,说明写争用严重,加缓存只会加剧块传输压力
  • RAC 中 buffer cache hit ratio 失效:一个节点显示 95%,但其中 40% 的 “命中” 是从其他节点拉 CR 块来的,不算真高效。更应关注 physical reads direct 占比——太高说明全表扫描绕缓存,调 db_cache_size 没用

跨节点诊断必须逐实例执行:gv$ 视图不是魔法,inst_id 别漏

所有带 g 前缀的视图(gv$sysstat、gv$session、gv$process)都需显式过滤 inst_id 或按 inst_id 分组,否则数据混在一起,会把节点1狂发、节点2狂收的 GC 流量互相抵消,误判“整体平稳”。

QuantOracle
QuantOracle

63个确定性量化金融计算器 + 10个通过MCP的复合工作流。期权定价、Greeks、奇异衍生品、风险指标、投资组合优化……

下载
  • 查内存相关统计必须加 inst_id:SELECT inst_id, name, value FROM gv$sysstat WHERE name IN ('session pga memory', 'session pga memory max')
  • 查会话级内存占用:SELECT inst_id, sid, serial#, program, pga_used_mem/1024/1024 AS mb FROM gv$session ORDER BY pga_used_mem DESC,一眼看出哪个节点哪个会话在吃内存
  • 查 buffer cache 命中率不能只算全局:SELECT inst_id, (SUM(decode(name,'db block gets',value,0)) + SUM(decode(name,'consistent gets',value,0)) - SUM(decode(name,'physical reads',value,0))) / NULLIF(SUM(decode(name,'db block gets',value,0)) + SUM(decode(name,'consistent gets',value,0)),0) FROM gv$sysstat GROUP BY inst_id
  • 漏 inst_id 的典型错误:SELECT SUM(pga_used_mem) FROM gv$process —— 这个 sum 把所有节点 PGA 加一起,完全掩盖了不均问题

ADRCI 和 AWR 不能替代实时观察:滞后性会骗人

AWR 快照间隔默认 60 分钟,ADRCI 的 alert 日志也是滚动写入。当你发现节点1内存突然飙到 95%,翻 AWR 报告可能只看到“过去一小时平均 70%”,根本抓不到峰值时刻的真相。

  • 紧急排查时,立刻连到高内存节点运行:SELECT * FROM v$memory_target_advice(看 AMM 建议)、SELECT * FROM v$sgastat ORDER BY bytes DESC(看 shared_pool 内部碎片)
  • 用 adrci 查当前节点最近 10 分钟告警:adrci> show home → adrci> set homepath diag/rdbms/<db_name>/<inst_name></inst_name></db_name> → adrci> show alert -tail 100,重点搜 ORA-4030(PGA 耗尽)、ORA-4031(shared_pool 不足)
  • OSWatcher 数据比 AWR 更及时:检查 oswmem 输出,看 PageIn/PageOut 是否突增、Free 是否跌破 5%——这是内存真正吃紧的铁证,不是“使用率高”这种模糊指标
  • 别信“自动均衡”:Oracle 不会把 PGA 从节点1挪到节点2。内存不均要么是应用连接分布不均(全连 VIP 而非 SCAN),要么是 SQL 绑定不均(某些 SQL 总在节点1执行),要么是外部进程失控——得靠人工定位,不是等 Oracle 自愈

真实场景里,最常被忽略的是:内存不均往往不是 Oracle 自己的问题,而是某个监控脚本、ETL 工具或备份进程在某个节点上失控运行。查 ps 和 ipcs 比调参数快十倍。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

oracle

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
oracle清空表数据
oracle清空表数据

当表中的数据不需要时,则应该删除该数据并释放所占用的空间。本专题为大家提供oracle清空表数据的相关文章,帮助大家解决该问题。

2023.08.16

901

5

Oracle中declare的使用
Oracle中declare的使用

Oracle DECLARE语句是PL/SQL编程语言中用于声明变量、常量、游标或异常的关键字。它的主要作用是在程序中定义这些对象,以便在后续的代码中使用。DECLARE语句的语法简单明了,可以根据需要声明多个对象。通过使用这些声明的对象,可以进行各种操作,如计算、查询数据库、处理异常等 。

2023.09.15

2553

5

oracle怎么分页
oracle怎么分页

实现分页的步骤:1、使用ROWNUM进行分页查询;2、在执行查询之前进行设置分页参数;3、使用"COUNT(*)"函数来获取总行数,并使用"CEIL"函数来向上取整计算总页数;4、在外部查询中使用"WHERE"子句来筛选出特定的行号范围,以实现分页查询。想了解更多oracle怎么分页的文章,可以来阅读本专题先的文章。

2023.09.18

2590

5

Oracle查看表操作历史记录
Oracle查看表操作历史记录

查看操作历史记录的方法:1、使用Oracle内置的审计功能,可以记录数据库中发生的各种操作,包括登录、DDL语句、DML语句等;2、使用Oracle日志文件,其中包含了数据库中发生的各种操作,可以通过查看日志文件来获取操作历史记录;3、使用Oracle的Flashback功能,可以查看数据库在某个时间点的操作历史记录;4、使用第三方工具等。本专题还提供其他查看表操作的文章,大家可以免费阅读。

2023.09.19

1489

3

Oracle中RAC的用法
Oracle中RAC的用法

Oracle中RAC的用法:1、通过在多个服务器上运行数据库实例来提供高可用性;2、允许在需要时增加或减少节点数量;3、通过将工作负载分布到多个节点上来实现负载均衡;4、使用共享存储来实现多个节点之间的数据共享;5、允许多个节点同时处理数据库请求,从而实现并行处理;6、提供了透明故障切换功能;7、使用了一些技术来确保数据的一致性;8、提供了管理工具来简化RAC环境的管理和维护。本专题还提供RAC相关的其他文章,大家可以免费阅读。

2023.09.19

2093

7

oracle imp
oracle imp

imp是Oracle数据库中的一个命令行工具,用于将导出的数据和对象从一个数据库实例导入到另一个数据库实例。imp命令的一般语法为“imp username/password@connect_string file=file_name [options]”。

2023.09.19

2749

4

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

4309

19

oracle通配符有哪些
oracle通配符有哪些

oracle通配符有“%”、“_”、“[]”和“[^]"。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.11.08

237

5

oracle四舍五入怎么操作
oracle四舍五入怎么操作

oracle四舍五入操作可以使用ROUND函数来实现,其语法为“ROUND(number, decimal_places)”,其中,number是要进行四舍五入的数值,decimal_places是指定的小数位数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.11.14

706

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程