SGA 各组件作用与配置
SGA 各组件作用与配置
适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
SGA(System Global Area) 是 Oracle 实例的共享内存区,所有服务器进程和后台进程都能访问[1]。
SGA 主要组件:
| 组件 | 作用 | 必需 |
|---|---|---|
| Database Buffer Cache | 缓存数据块 | 是 |
| Shared Pool | 缓存 SQL、PL/SQL、字典 | 是 |
| Redo Log Buffer | 缓存 Redo 记录 | 是 |
| Large Pool | 大块内存分配(RMAN/共享服务器) | 否 |
| Java Pool | Java 程序内存 | 否 |
| Streams Pool | Streams/GoldenGate 内存 | 否 |
| Fixed SGA | 内部数据结构 | 自动 |
2. 查看当前 SGA 配置
-- SGA 总体信息
SELECT * FROM v$sga;
-- SGA 详细信息
SELECT * FROM v$sgainfo;
-- SGA 动态组件
SELECT
name,
bytes/1024/1024 AS mb,
resizeable
FROM v$sga_dynamic_components;
-- SGA 参数
SHOW PARAMETER sga;
SHOW PARAMETER memory;
3. Database Buffer Cache
3.1 作用
缓存从数据文件读取的数据块,减少磁盘 I/O[2]。
3.2 关键参数
SHOW PARAMETER db_cache_size;
SHOW PARAMETER db_block_size;
SHOW PARAMETER db_nk_cache_size; -- 非标准块大小
SHOW PARAMETER db_keep_cache_size; -- KEEP 池
SHOW PARAMETER db_recycle_cache_size; -- RECYCLE 池
3.3 多缓冲池
-- KEEP 池:常驻缓存的小表
ALTER TABLE small_lookup_table STORAGE (BUFFER_POOL KEEP);
-- RECYCLE 池:访问少的大表
ALTER TABLE large_history_table STORAGE (BUFFER_POOL RECYCLE);
-- DEFAULT 池:默认(大多数表)
3.4 查看 Buffer Cache 命中率
SELECT
1 - (physical.value - direct.value - lobs.value) / NULLIF(consistent.value + dbblk.value, 0) AS hit_ratio
FROM
v$sysstat physical,
v$sysstat direct,
v$sysstat lobs,
v$sysstat consistent,
v$sysstat dbblk
WHERE
physical.name = 'physical reads cache'
AND direct.name = 'physical reads direct'
AND lobs.name = 'physical reads direct (lob)'
AND consistent.name = 'consistent gets'
AND dbblk.name = 'db block gets';
-- 健康标准:> 95%
4. Shared Pool
4.1 作用
缓存 SQL/PL/SQL 代码、数据字典、解析树等[3]。
4.2 关键组件
| 子组件 | 作用 |
|---|---|
| Library Cache | SQL/PL/SQL 解析结果 |
| Data Dictionary Cache | 数据字典缓存(rowcache) |
| Result Cache | 查询结果缓存 |
| Reserved Pool | 大块内存预留 |
4.3 配置
SHOW PARAMETER shared_pool_size;
SHOW PARAMETER shared_pool_reserved_size;
SHOW PARAMETER result_cache_size;
4.4 查看 Shared Pool 使用
SELECT
pool,
name,
bytes/1024/1024 AS mb
FROM v$sgastat
WHERE pool = 'shared pool'
ORDER BY bytes DESC;
5. Redo Log Buffer
5.1 作用
缓存 Redo 记录,LGWR 进程将其写入 Redo Log 文件。
5.2 配置
SHOW PARAMETER log_buffer;
-- 默认 14MB,最小 64KB
5.3 LGWR 写入触发
- 每 3 秒
- 用户 COMMIT
- Buffer 1/3 满(或 1MB)
- DBWn 写脏块前
详细内容见:Oracle 重做日志 Redo Log 机制详解。
6. Large Pool
6.1 作用
避免 Shared Pool 碎片化,为大块内存分配预留:
- RMAN 备份/恢复
- 共享服务器 UGA
- 并行查询消息缓冲区
6.2 配置
SHOW PARAMETER large_pool_size;
-- 默认 0(自动管理)
-- 手动配置
ALTER SYSTEM SET large_pool_size=256M SCOPE=BOTH;
7. Java Pool
7.1 作用
Java 程序执行内存(如 Java 存储过程)。
7.2 配置
SHOW PARAMETER java_pool_size;
-- 默认 0(自动管理)
8. Streams Pool
8.1 作用
Oracle Streams / GoldenGate / LogMiner 使用的内存。
8.2 配置
SHOW PARAMETER streams_pool_size;
-- 默认 0(自动管理)
9. SGA 内存管理方式
9.1 三种管理方式
| 方式 | 参数 | 说明 |
|---|---|---|
| 手动管理 | 各组件独立设置 | 灵活但繁琐 |
| ASMM | SGA_TARGET | SGA 内自动分配 |
| AMM | MEMORY_TARGET | SGA + PGA 统一管理 |
9.2 ASMM 配置
-- 启用 ASMM
ALTER SYSTEM SET sga_target=8G SCOPE=BOTH;
ALTER SYSTEM SET sga_max_size=8G SCOPE=SPFILE;
-- 各组件设为 0(自动)
ALTER SYSTEM SET shared_pool_size=0 SCOPE=BOTH;
ALTER SYSTEM SET db_cache_size=0 SCOPE=BOTH;
ALTER SYSTEM SET large_pool_size=0 SCOPE=BOTH;
ALTER SYSTEM SET java_pool_size=0 SCOPE=BOTH;
ALTER SYSTEM SET streams_pool_size=0 SCOPE=BOTH;
9.3 AMM 配置
-- 启用 AMM(11g+)
ALTER SYSTEM SET memory_target=12G SCOPE=SPFILE;
ALTER SYSTEM SET memory_max_target=16G SCOPE=SPFILE;
-- 重启生效
9.4 ASMM vs AMM
| 维度 | ASMM | AMM |
|---|---|---|
| 范围 | SGA 内 | SGA + PGA |
| HugePages | 兼容 | 不兼容(Linux) |
| 推荐 | OLTP | 通用 |
| 控制粒度 | 细 | 粗 |
Linux 生产推荐:ASMM + HugePages(性能最佳)。
10. 常见坑与排错
10.1 ORA-04031: unable to allocate string bytes of shared memory
现象:Shared Pool 空间不足。
修复:
-- 1. 增大 Shared Pool
ALTER SYSTEM SET shared_pool_size=2G SCOPE=BOTH;
-- 2. 查看 Shared Pool 详情
SELECT pool, name, bytes/1024/1024 AS mb
FROM v$sgastat
WHERE pool='shared pool'
ORDER BY bytes DESC;
-- 3. 刷新 Shared Pool(临时)
ALTER SYSTEM FLUSH SHARED_POOL;
-- 4. 优化 SQL 使用绑定变量(根本解决)
10.2 Buffer Cache 命中率低
-- 检查命中率(应 > 95%)
SELECT name, value
FROM v$sysstat
WHERE name IN ('consistent gets','db block gets','physical reads cache');
修复:
- 增大 Buffer Cache
- 优化全表扫描 SQL
- 为小表使用 KEEP 池
10.3 ASMM 自动调整失败
现象:v$sga_dynamic_components 显示组件大小固定不变。
原因:某些参数被手动设置,覆盖了 ASMM。
修复:
-- 将所有 SGA 子组件设为 0
ALTER SYSTEM SET shared_pool_size=0 SCOPE=BOTH;
ALTER SYSTEM SET db_cache_size=0 SCOPE=BOTH;
-- ...
10.4 AMM 与 HugePages 冲突
现象:Linux 上使用 AMM 后,HugePages 利用率低。
修复:改用 ASMM + HugePages。
# 计算 HugePages 需求
# HugePages 数 = SGA_TARGET / Hugepagesize(通常 2MB)
# /etc/sysctl.conf
vm.nr_hugepages = 4096 # 假设 8GB SGA / 2MB = 4096
# /etc/security/limits.conf
oracle soft memlock unlimited
oracle hard memlock unlimited
11. 最佳实践
- 生产用 ASMM + HugePages:性能与稳定性最佳
- Shared Pool ≥ 1GB:避免硬解析频繁
- Buffer Cache 占 SGA 60-70%:最大化缓存命中
- 小表用 KEEP 池:减少缓存争用
- 大表用 RECYCLE 池:避免挤占默认池
- 监控命中率:定期检查 Buffer Cache、Library Cache 命中率
- 优化 SQL 减少硬解析:使用绑定变量
- 保留参数默认值:除非有明确依据,否则不要手动调整
12. 参考资料
[1] Oracle Database Concepts 19c, “Memory Architecture” https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/memory-architecture.html
[2] Oracle Database Administrator’s Guide 19c, “Managing the Buffer Cache” https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/managing-memory.html
[3] Oracle Database Administrator’s Guide 19c, “Managing the Shared Pool” https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/managing-memory.html