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 PoolRMAN / 共享服务器 / 并行查询0(自动)
Java PoolJava 存储过程内存0(自动)
Streams PoolStreams / GoldenGate / LogMiner0(自动)

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. 最佳实践

  1. 启用 ASMM:让 Oracle 自动管理
  2. RMAN 前预留 Large Pool:≥ 128MB
  3. 使用 Java 时增大 Java Pool:≥ 128MB
  4. Streams/GG 增大 Streams Pool:≥ 1GB
  5. 监控动态调整:定期检查 v$sga_resize_ops
  6. 避免硬编码池大小:让 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