rman备份期间pga飙升主因是压缩、校验、归档解析等操作在通道私有进程中集中分配大块内存;应显式allocate channel限速限片、拆分归档与数据备份、release channel及时释放,并仅在启用memory_target且重启后通过\_pga\_aggregate\_limit硬限制新通道。

RMAN备份期间PGA飙升,不是因为“备份太重”,而是它在反复分配大块内存做压缩、校验、归档解析——这些操作默认不走共享池,全挤在PGA里。
为什么RMAN会悄悄吃掉几GB PGA?
RMAN本身不显式声明PGA用量,但以下动作全由每个通道私有进程在PGA中完成:
-
BULK COLLECT加载归档日志元数据时,若未加LIMIT,可能一次拉入数百万条记录到PL/SQL集合 - 启用
AS COMPRESSED BACKUPSET且算法为'MEDIUM'或'HIGH'时,每个通道独占10–30MB压缩缓冲区(与CPU核心数正相关) -
BACKUP DATABASE PLUS ARCHIVELOG合并在一个RUN块中,导致归档扫描线程和数据文件读取线程共享同一PGA上下文,缓冲区无法复用 - 隐含参数
_kghdsidx_count在12c+中影响哈希表分配策略,若设得高(如默认8),RMAN校验块时会多开8个并行哈希区
如何用ALLOCATE CHANNEL直接限死单通道PGA峰值?
别依赖全局CONFIGURE CHANNEL——它会让空闲通道持续驻留PGA。改用显式通道分配,并绑定速率与内存行为:
- 写死写入速率:
ALLOCATE CHANNEL c1 DEVICE TYPE DISK RATE 12M,速率越低,缓冲区填充越慢,PGA瞬时峰值越平缓 - 禁用压缩缓冲膨胀:
ALLOCATE CHANNEL c1 DEVICE TYPE DISK MAXPIECESIZE 2G,防止单个备份片过大触发内部大块分配 - 强制释放通道上下文:
RELEASE CHANNEL c1必须紧跟在BACKUP语句后,否则PGA不会立即归还(尤其在RUN块内) - 避免
BACKUP ARCHIVELOG ALL:改用BACKUP ARCHIVELOG FROM TIME 'SYSDATE-1' UNTIL TIME 'SYSDATE',缩小元数据扫描范围
PGA_AGGREGATE_LIMIT真能拦住RMAN爆内存吗?
能,但只在满足三个硬条件时才生效:
- 数据库必须启用
MEMORY_TARGET(哪怕只设1G),且PGA_AGGREGATE_TARGET保持为0(即不能显式配置) -
_pga_aggregate_limit需用ALTER SYSTEM SET "_pga_aggregate_limit"=6G SCOPE=SPFILE设置,重启后才参与硬限制 - RMAN进程必须是“新连接”——已运行的RMAN session不受限,只有后续新建的通道才会被拦截
- 触发拦截的表现不是报错,而是
ORA-04036直接终止该通道进程,V$PGASTAT中total PGA used mem会卡在接近设定值的位置
最常被忽略的一点:RMAN在归档日志处理阶段(尤其是ARCHIVELOG ALL)会绕过_pga_aggregate_limit的校验逻辑,优先使用固定大小的私有堆栈。所以限制必须从源头切——拆开归档与数据备份,显式控制通道生命周期,比调参更可靠。











