青年数据库学习互助会

ORACLE数据库学习整理之十八:Large Pool

Oracle Large Pool 深度解析

一、核心原理

1. 设计目标

  • • 解决共享池(Shared Pool)的碎片化问题:处理大块内存请求时(如RMAN备份),共享池容易出现内存碎片
  • • 隔离大内存操作:防止大内存操作(如并行查询)影响共享池中SQL解析等核心功能
  • • 替代PGA的部分功能:在共享服务器模式下存储会话UGA(User Global Area)

2. 内存分配机制

3. 工作流程

  1. 1. 客户端发起大内存操作请求(如RMAN备份)
  2. 2. Oracle判断请求类型需使用大池
  3. 3. 从大池分配连续内存块
  4. 4. 操作完成后直接释放内存(非LRU机制)

二、关键特性

1. 内存管理特性

特性
说明
非LRU管理
直接分配/释放内存,无最近最少使用淘汰机制
大块连续分配
最小分配单元通常为4KB(操作系统页大小)
手动配置
必须通过参数显式设置大小(LARGE_POOL_SIZE)
非自动管理
不支持自动内存管理(AMM),需DBA手动调整

2. 性能特性

  • • 减少共享池争用:降低共享池闩锁(latch)竞争
  • • 提升大操作效率:RMA备份速度可提升30%-50%
  • • 避免内存碎片:连续分配减少内存碎片产生

三、核心作用

1. 支持RMAN备份恢复

  • • 内存用途:
    • • 磁盘I/O缓冲区(BACKUP_DISK_IO_SLAVES=TRUE时)
    • • 压缩/加密中间数据存储
  • • 配置要求:
    ALTERSYSTEMSET LARGE_POOL_SIZE =256M;  -- 典型RMAN设置
  • • 错误规避:未配置大池时可能报错:
    ORA-04031: unable to allocate 128K of shared memory...

2. 并行查询处理

  • • 内存用途:
    • • 并行执行进程间通信
    • • 哈希连接和排序的中间结果
  • • 关联参数:
    PARALLEL_MAX_SERVERS =32
    PARALLEL_MIN_MESSAGE_POOL =64M

3. 共享服务器模式

  • • UGA存储:
  • • 优势:避免共享池被会话数据污染

4. I/O从进程支持

  • • 场景:
    • • 异步I/O不可用时
    • • 磁带备份操作
  • • 配置:
    DISK_ASYNCH_IO =FALSE-- 启用I/O从进程
    BACKUP_TAPE_IO_SLAVES =TRUE

四、配置管理

1. 参数配置

参数
说明
示例值
LARGE_POOL_SIZE
大池初始大小
256M
PARALLEL_MAX_SERVERS
最大并行进程数(影响需求)
32
SHARED_SERVERS
共享服务器进程数(影响需求)
20

2. 容量计算公式

所需大池大小 = 
  (RMAN通道数 × 128KB) +          -- RMAN
  (并行进程数 × 4MB) +            -- 并行查询 
  (共享服务器数 × 1MB) +          -- UGA存储
  安全冗余(20%)

3. 动态调整

-- 在线调整大小
ALTERSYSTEMSET LARGE_POOL_SIZE =512M SCOPE=BOTH;

-- 需重启的调整
ALTERSYSTEMSET LARGE_POOL_SIZE =1G SCOPE=SPFILE;

五、监控诊断

1. 关键视图

-- 查看大池分配情况
SELECT pool, name, bytes 
FROM v$sgastat 
WHERE pool ='large pool';

-- 监控空闲内存
SELECT*FROM v$sgastat 
WHERE name ='free memory'
AND pool ='large pool';

2. 性能指标

指标
健康值
问题阈值
大池空闲内存占比
>20%
<5%
内存请求失败率
0%
>1%
共享池中大型对象分配次数
低
持续增长

3. **常见错误处理

  • • ORA-04031 错误:
    -- 解决方案:
    ALTERSYSTEMSET LARGE_POOL_SIZE = [当前值+增量];

    -- 检查占用对象
    SELECT*FROM v$sgastat 
    WHERE pool ='large pool'
    ORDERBY bytes DESC;

  • • 内存泄漏检测:
    -- 查找未释放内存
    SELECT sid, type, name, value
    FROM v$sesstat s
    JOIN v$statname n ON s.statistic# = n.statistic#
    WHERE n.name LIKE'%large pool%'
    AND s.value >0;

六、最佳实践

1. 配置建议

  • • RMA环境:最小256MB,每通道追加64MB
  • • 并行查询:PARALLEL_MAX_SERVERS × 4MB
  • • 共享服务器:SHARED_SERVERS × 1.5MB
  • • 混合环境:取各需求最大值之和再加20%冗余

2. 优化策略

  • • 定期评估:
    -- 计算建议值
    SELECT'LARGE_POOL_SIZE=>'||ROUND(SUM(bytes)/1024/1024)||'M'
    FROM (
    SELECTMAX(bytes) bytes FROM v$sgastat WHERE pool='large pool'
    UNIONALL
    SELECT (MAX(PQ_COUNT)*4*1024*1024) FROM v$px_process_sysstat
    );
  • • 使用黄金法则:

    "当使用以下任一功能时,必须配置大池:

  1. 1. RMAN备份压缩/加密
  2. 2. 并行查询
  3. 3. 共享服务器模式
  4. 4. I/O从进程"

3. 避免陷阱

  • • 勿过度分配:监控v$sgastat.free memory,空闲内存>30%需缩减
  • • 混合模式禁用:RMAN与并行查询同时运行时,按两者需求之和配置
  • • ASM环境:使用ASM时,大池需求增加20%

七、技术本质总结

核心价值:

"Large Pool是Oracle架构中关键的专业内存工作区,通过隔离大块内存操作,既保护了共享池的核心功能,又为特定工作负载提供了高性能内存通道。其本质是Oracle在通用性(Shared Pool)和专用性(Large Pool)之间实现的精妙平衡。"