一、核心概念与定位
定义
Streams Pool 是 Oracle 数据库 系统全局区 (SGA) 中的一个可选内存组件,专门用于支持 Oracle Streams 和 Advanced Queuing (AQ) 技术的内存需求。核心目的
- 为 数据复制 (Streams) 提供内存缓冲区,确保高效捕获、传播和应用变更。
- 为 消息队列 (Advanced Queuing) 提供内存存储,加速消息的入队/出队操作。
- 减少 I/O 开销,通过内存缓存提升实时数据集成和消息处理的性能。
技术背景
- Oracle Streams:用于跨数据库的数据复制、变更捕获和事件通知(已弃用,被 GoldenGate 替代,但旧系统仍在使用)。
- **Advanced Queuing (AQ)**:基于数据库的可靠消息队列系统,支持发布/订阅模型。
二、工作原理与内部机制
1. Oracle Streams 的内存流程
- **捕获 (Capture)**:
- 从重做日志(Redo Log)中读取数据变更(DML/DDL)。
- Streams Pool 缓存日志解析结果(LogMiner 缓冲区),生成 **逻辑变更记录 (LCR)**。
- **暂存 (Staging)**:
- LCR 存储在 Streams Pool 的 内存队列 中等待传播。
- **传播 (Propagation)**:
- 通过 Oracle Net 将 LCR 发送到目标数据库。
- 内存中维护传播作业状态和网络缓冲区。
- **应用 (Apply)**:
- 在目标数据库接收 LCR 并应用到表中。
- Streams Pool 缓存待应用的 LCR 和事务依赖关系。
2. Advanced Queuing (AQ) 的内存流程
- **入队 (Enqueue)**:
- 消息写入 Streams Pool 的 内存队列(若内存不足则持久化到表
AQ$_<queue_table>)。
- 消息写入 Streams Pool 的 内存队列(若内存不足则持久化到表
- **出队 (Dequeue)**:
- 消费者直接从内存读取消息(减少磁盘 I/O)。
- 消息管理:
- 内存中维护消息优先级、订阅者列表和传播状态。
3. 内存结构
- **动态内存池 (Dynamic SGA Allocation)**:
- 由多个子池组成,按需分配给 Streams 或 AQ 的不同组件。
- 关键内存区:
- LCR 缓存区:存储逻辑变更记录。
- 消息缓冲区:暂存 AQ 消息。
- 事务上下文区:管理分布式事务状态。
- 元数据区:存储队列/规则/订阅者信息。
三、核心特性
可选性
- 仅在启用 Streams 或 AQ 时需配置。默认未分配内存。
专用性
- 独立于 Shared Pool 和 Buffer Cache,避免内存竞争。
自动内存管理 (ASMM/AMM)
- 支持 ASMM (
SGA_TARGET) 和 AMM (MEMORY_TARGET):- 动态调整大小(需设置
STREAMS_POOL_SIZE作为下限)。 - 手动管理时需固定大小(
STREAMS_POOL_SIZE)。
- 动态调整大小(需设置
- 支持 ASMM (
多租户支持 (12c+)
- 位于 CDB 级别的 SGA,所有 PDB 共享同一 Streams Pool。
内存溢出机制
- 当内存不足时:
- Streams LCR 写入磁盘表
SYSTEM.STREAMS$_HISTORY。 - AQ 消息持久化到队列表(
AQ$_<queue_table>)。
- Streams LCR 写入磁盘表
- 当内存不足时:
四、核心作用
加速数据复制 (Streams)
- 内存缓存 LCR 减少解析重做日志的 I/O。
- 并行应用时缓存事务依赖关系,提升吞吐量。
高性能消息处理 (AQ)
- 内存队列实现毫秒级消息传递(比磁盘快 10-100 倍)。
- 支持 多消费者模型 和 消息优先级。
资源隔离
- 隔离 Streams/AQ 的内存需求,避免影响 SQL 执行或 PL/SQL 缓存。
高可用性支撑
- 确保跨数据库的数据同步和消息传递的实时性。
五、配置与管理
1. 关键参数
- **
STREAMS_POOL_SIZE**:- 设置 Streams Pool 的初始大小(默认
0)。 - 建议值:
- 轻度使用:50MB–100MB
- 重度使用:500MB–2GB+(根据消息量/LCR 速率调整)。
- 设置 Streams Pool 的初始大小(默认
2. 监控视图
| 视图 | 用途 |
|---|---|
V$SGASTAT |
查看 Streams Pool 当前分配大小 ("streams pool")。 |
V$STREAMS_POOL_ADVICE |
预测不同内存大小下的溢出(Spill)次数(调优核心视图)。 |
GV$BUFFERED_QUEUES |
查看 AQ 内存队列的使用情况(内存/磁盘消息数)。 |
GV$STREAMS_CAPTURE |
监控捕获进程的内存使用状态(如 BUFFERED_QUEUESIZE)。 |
DBA_QUEUE_TABLES |
检查 AQ 队列表的存储属性(STORAGE_CLASS 是否设为 MEMORY)。 |
3. 关键性能指标
- **
Buffered Queue Spill**(溢出次数):- 内存不足导致 LCR/AQ 消息写入磁盘的次数(需尽量避免)。
- **
Memory Usage %**:- Streams Pool 使用率(通过
V$SGASTAT计算)。
- Streams Pool 使用率(通过
- **
Enqueue/Dequeue Wait Time**:- AQ 操作等待内存分配的延迟(
V$EVENT_NAME中的"Streams AQ: waiting for messages in memory")。
- AQ 操作等待内存分配的延迟(
4. 调优场景
- 问题:频繁溢出 (
Buffered Queue Spill)- 解决方案:
- 增加
STREAMS_POOL_SIZE。 - 优化 Streams 参数(如
_SGA_SIZE调整 LCR 缓存)。 - 减少大事务(拆分为小事务)。
- 增加
- 解决方案:
- 问题:AQ 延迟高
- 解决方案:
- 确保队列表属性
STORAGE_CLASS='MEMORY'。 - 增加
STREAMS_POOL_SIZE或限制队列内存占用(QUEUE_MEMORY)。
- 确保队列表属性
- 解决方案:
- 问题:ORA-04031 错误
- 原因:Streams Pool 内存碎片或不足。
- 解决方案:
- 重启实例(释放碎片)。
- 增加
STREAMS_POOL_SIZE。
六、与其他 SGA 组件的关联
| 组件 | 关联与区别 |
|---|---|
| Shared Pool | Streams Pool 独立存在,避免 Streams/AQ 占用 SQL 解析内存。 |
| Buffer Cache | Streams 从重做日志捕获变更(不依赖 Buffer Cache),但 Apply 会读写数据块。 |
| Large Pool | 均用于大块内存分配,但 Large Pool 服务于并行执行/RMAN,Streams Pool 专用于 Streams/AQ。 |
| Java Pool | 无直接关联,各自服务不同功能(Java 代码 vs 数据复制/消息队列)。 |
七、演进与替代方案
Oracle Streams 的弃用
- 从 Oracle 12c 开始标记为弃用,推荐迁移到 Oracle GoldenGate。
- GoldenGate 使用独立进程(非 SGA),不依赖 Streams Pool。
Advanced Queuing 的持续演进
- 仍被广泛使用(如 Oracle AQ、DBMS_JOB 依赖 AQ)。
- 增强特性:JSON 消息、微服务集成(Microservices)。
Streams Pool 的存续意义
- 旧系统维护需继续配置。
- AQ 仍是核心组件,需 Streams Pool 支持高性能场景。
八、总结:核心知识点速查表
| 类别 | 说明 |
|---|---|
| 存在条件 | 仅当启用 Streams 或 AQ 时生效。 |
| 内存用途 | 缓存 Streams LCR / AQ 消息 / 事务上下文。 |
| 管理方式 | 手动设置 STREAMS_POOL_SIZE 或由 ASMM/AMM 动态管理。 |
| 关键指标 | Buffered Queue Spill(溢出次数)、内存使用率、Enqueue/Dequeue 延迟。 |
| 调优重点 | 避免溢出(增加内存)、减少大事务、优化 AQ 存储属性。 |
| 多租户影响 | CDB 级别共享,PDB 竞争资源。 |
| 未来方向 | Streams 已弃用(转 GoldenGate),AQ 仍为核心功能。 |
九、运维建议
- 容量规划:
- 监控
V$STREAMS_POOL_ADVICE,按建议值设置STREAMS_POOL_SIZE。
- 监控
- 高负载场景:
- 为 AQ 队列显式设置内存配额(
DBMS_AQADM.ALTER_QUEUE_TABLE(..., QUEUE_MEMORY=xxx))。
- 为 AQ 队列显式设置内存配额(
- 迁移策略:
- 新项目避免使用 Streams,改用 GoldenGate 或 Kafka。
- 故障应急:
- ORA-04031 错误时优先扩容或重启实例。
注:在 Oracle 12.2 及以上版本,Streams Pool 的物理内存分配被合并到 Shared Pool 中(类似 Java Pool),但逻辑功能和管理参数 (
STREAMS_POOL_SIZE) 保持不变。
通过深入理解 Streams Pool 的机制,可有效优化数据复制和消息系统的性能,尤其在遗留系统维护中至关重要。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




