MAXOPENFILES在磁带备份中易被忽略,因其受MML并发流数、驱动器物理数量和PGA内存三重限制,设过高会导致MML拒绝连接(如RMAN-03009/ORA-19554),合理值通常为4,且应≤PARALLELISM以避免通道阻塞。
为什么MAXOPENFILES在磁带备份中容易被忽略
磁带设备(如sbt)本身不支持像磁盘那样随意打开大量文件句柄,maxopenfiles设得过高反而会触发介质管理器(mml)拒绝连接或排队超时,尤其在netbackup、commvault等环境中常见报错:rman-03009: failure of backup command on ora_sbt_tape_1 channel + 底层ora-19554: error allocating device。这不是rman自身错误,而是mml侧资源协商失败——但日志里往往只显示rman层报错,排查时容易绕远。
MAXOPENFILES该设多大才合理
这个参数不是越大越好,它受三个实际限制共同约束:
- 介质管理器单客户端允许的最大并发流数(如NetBackup默认是4–8,需查
bp.conf中的NUMBER_OF_STREAMS) - 磁带驱动器物理数量(1台驱动器通常最多支撑2–3个并发流,否则机械寻道争抢严重)
- Oracle为每个通道分配的PGA内存:每增加1个open file,RMAN会额外预留约1MB缓冲区,
MAXOPENFILES=16且开4通道,就多占64MB PGA,可能挤占排序/哈希内存
实操建议:从4起步,在run { ... }块中显式分配通道时同步限定:
run {
allocate channel c1 device type sbt parms 'ENV=(NB_ORA_CLASS=RMAN_PROD)' maxopenfiles 4;
allocate channel c2 device type sbt parms 'ENV=(NB_ORA_CLASS=RMAN_PROD)' maxopenfiles 4;
backup as compressed backupset database;
}
和PARALLELISM、SECTION SIZE怎么配合
三者联动不当会导致部分通道空转或section排队:
-
CONFIGURE DEVICE TYPE SBT PARALLELISM 4只是声明“最多可用4通道”,但不保证实际调度——真正起效必须靠allocate channel语句 - 若用
SECTION SIZE=500M切分一个2GB数据文件,会产生4个section;此时PARALLELISM至少为4,且每个allocate channel的maxopenfiles≥1,否则多余section会卡在队列里等空闲通道 - 磁带场景下,
maxopenfiles值通常应≤PARALLELISM,避免单通道试图打开过多文件导致MML拒绝服务
典型错误配置:PARALLELISM 6但只allocate了2个channel,且每个设maxopenfiles 8——结果是2个通道各自卡住,其余4个并行度完全浪费。
验证MAXOPENFILES是否生效的最快方法
别等备份跑完看日志,直接查视图:
SELECT channel#, open_files, max_open_files FROM V$RMAN_STATUS WHERE operation = 'BACKUP' AND status = 'RUNNING';
如果open_files长期卡在1–2,而max_open_files显示你设的值,说明MML侧已拒绝提升并发;这时要立刻检查sbtsvc.log或bptm日志,而不是调RMAN参数。
磁带备份的瓶颈从来不在Oracle侧,MAXOPENFILES只是把RMAN和MML之间的握手信号调对——信号错了,再快的磁带机也喂不饱。



















