Large Pool / Java Pool / Streams Pool 详解
Large Pool / Java Pool / Streams Pool 详解
适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
SGA 中除了 Buffer Cache、Shared Pool、Redo Log Buffer 外,还有三个可选池:
| 池 | 作用 | 默认大小 |
|---|---|---|
| Large Pool | RMAN / 共享服务器 / 并行查询 | 0(自动) |
| Java Pool | Java 存储过程内存 | 0(自动) |
| Streams Pool | Streams / GoldenGate / LogMiner | 0(自动) |
2. Large Pool
2.1 作用
为大块内存分配预留空间,避免 Shared Pool 碎片化[1]:
- RMAN 备份/恢复缓冲区
- 共享服务器 UGA
- 并行查询消息缓冲区
- 旧版 SQL*Plus COPY 命令
2.2 配置
SHOW PARAMETER large_pool_size;
-- 默认 0(ASMM 自动分配)
-- 手动配置
ALTER SYSTEM SET large_pool_size=256M SCOPE=BOTH;
2.3 何时需要 Large Pool
| 场景 | 建议 |
|---|---|
| RMAN 备份 | 至少 64MB(并行时更多) |
| 共享服务器 | 每会话 1-2MB |
| 并行查询 | 每并行进程 1MB |
| ASMM 启用 | 自动管理 |
2.4 查看使用情况
SELECT
name,
bytes/1024/1024 AS mb
FROM v$sgastat
WHERE pool='large pool'
ORDER BY bytes DESC;
2.5 RMAN 与 Large Pool
-- RMAN 备份时 Large Pool 使用
-- 每个 tape channel 约 16MB
-- 每个 disk channel 约 1MB
-- 推荐配置
ALTER SYSTEM SET large_pool_size=128M SCOPE=BOTH;
-- 大型并行备份
RMAN> CONFIGURE DEVICE TYPE DISK PARALLELISM 4;
-- 4 个并行通道,Large Pool 需 ≥ 4MB
3. Java Pool
3.1 作用
Java 存储过程、Java 类的执行内存[1]:
- Java 类加载
- Java 方法执行
- Java 对象内存
3.2 配置
SHOW PARAMETER java_pool_size;
-- 默认 0(ASMM 自动分配)
-- 手动配置
ALTER SYSTEM SET java_pool_size=128M SCOPE=BOTH;
3.3 启用 Java 支持
-- 安装 Java VM(需要 SYSDBA)
@$ORACLE_HOME/javavm/install/initjvm.sql
-- 验证
SELECT comp_name, status FROM dba_registry
WHERE comp_id='JAVAVM';
3.4 使用场景
-- 创建 Java 类
CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED "Hello" AS
public class Hello {
public static String say() { return "Hello World"; }
};
-- 发布为函数
CREATE OR REPLACE FUNCTION hello RETURN VARCHAR2
AS LANGUAGE JAVA
NAME 'Hello.say() return java.lang.String';
-- 调用
SELECT hello() FROM dual;
3.5 查看使用
SELECT name, bytes/1024/1024 AS mb
FROM v$sgastat
WHERE pool='java pool';
4. Streams Pool
4.1 作用
Oracle Streams / GoldenGate / LogMiner 使用的内存[2]:
- Streams Capture 进程
- Streams Propagate
- Streams Apply
- LogMiner 字典缓存
- XStream outbound/inbound
4.2 配置
SHOW PARAMETER streams_pool_size;
-- 默认 0(ASMM 自动分配)
-- 手动配置
ALTER SYSTEM SET streams_pool_size=256M SCOPE=BOTH;
4.3 启用 Streams
-- 设置 Streams 参数
ALTER SYSTEM SET streams_pool_size=256M SCOPE=BOTH;
ALTER SYSTEM SET global_names=TRUE SCOPE=BOTH;
ALTER SYSTEM SET open_links=4 SCOPE=SPFILE;
-- 创建 Streams 管理员
CREATE USER strmadmin IDENTIFIED BY ******
DEFAULT TABLESPACE users
TEMPORARY TABLESPACE temp
QUOTA UNLIMITED ON users;
GRANT DBA TO strmadmin;
4.4 GoldenGate 与 Streams Pool
GoldenGate 12c+ 默认使用 Streams Pool 进行 LogMiner:
-- GG 进程使用 Streams Pool
-- 建议 ≥ 1GB(GG 大数据量场景)
ALTER SYSTEM SET streams_pool_size=1G SCOPE=BOTH;
-- 监控
SELECT name, bytes/1024/1024 AS mb
FROM v$sgastat
WHERE pool='streams pool';
4.5 LogMiner 使用
-- 启动 LogMiner
EXEC DBMS_LOGMNR.START_LOGMNR(
STARTTIME => SYSDATE-1,
ENDTIME => SYSDATE,
OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG +
DBMS_LOGMNR.COMMITTED_DATA_ONLY
);
-- 查询 LogMiner 视图
SELECT operation, sql_redo, sql_undo
FROM v$logmnr_contents
WHERE seg_owner='SCOTT'
AND table_name='EMP';
5. ASMM 自动管理
启用 ASMM 后,三个池由 Oracle 自动调整:
-- 启用 ASMM
ALTER SYSTEM SET sga_target=8G SCOPE=BOTH;
-- 子池设为 0 表示自动
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;
自动调整逻辑:
- Large Pool:RMAN 备份时扩大
- Java Pool:Java 调用时扩大
- Streams Pool:Streams 活动时扩大
6. 内存视图查询
-- 所有 SGA 池总览
SELECT
pool,
name,
bytes/1024/1024 AS mb
FROM v$sgastat
WHERE pool IN ('large pool', 'java pool', 'streams pool')
ORDER BY pool, bytes DESC;
-- 动态调整历史
SELECT
component,
oper_type,
oper_mode,
parameter,
initial_size/1024/1024 AS initial_mb,
final_size/1024/1024 AS final_mb,
status
FROM v$sga_resize_ops
WHERE component IN ('large pool','java pool','streams pool')
ORDER BY time DESC;
7. 常见坑与排错
7.1 ORA-04031: Large Pool 不足
现象:RMAN 备份时报 Large Pool 不足。
修复:
ALTER SYSTEM SET large_pool_size=512M SCOPE=BOTH;
7.2 Java 存储过程执行失败
现象:ORA-29532 Java 调用失败。
排查:
SELECT name, bytes/1024/1024 AS mb
FROM v$sgastat
WHERE pool='java pool';
-- 检查 Java 是否安装
SELECT comp_name, status FROM dba_registry
WHERE comp_id='JAVAVM';
修复:
-- 增大 Java Pool
ALTER SYSTEM SET java_pool_size=256M SCOPE=BOTH;
7.3 Streams 性能问题
现象:Streams 同步延迟过大。
修复:
-- 增大 Streams Pool
ALTER SYSTEM SET streams_pool_size=1G SCOPE=BOTH;
-- 优化并行度
BEGIN
DBMS_STREAMS_ADM.SET_PARAMETER(
parameter => 'PARALLELISM',
value => '4'
);
END;
7.4 GoldenGate 性能问题
现象:GG 抽取/复制慢。
修复:
-- 增大 Streams Pool
ALTER SYSTEM SET streams_pool_size=2G SCOPE=BOTH;
-- GG 参数调整
-- TRANLOGOPTIONS FETCHPARTIALLOB
-- TRANLOGOPTIONS _LOGREADERBUFSIZE 4096
8. 最佳实践
- 启用 ASMM:让 Oracle 自动管理
- RMAN 前预留 Large Pool:≥ 128MB
- 使用 Java 时增大 Java Pool:≥ 128MB
- Streams/GG 增大 Streams Pool:≥ 1GB
- 监控动态调整:定期检查
v$sga_resize_ops - 避免硬编码池大小:让 ASMM 自适应
9. 参考资料
[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 Memory” https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/managing-memory.html