rman恢复慢主因是i/o或内存瓶颈,盲目增加allocate channel会引发争抢;应合理设置parallelism、启用异步i/o、确保fra空间充足且存储类型一致,并优化底层i/o参数。
为什么 rman 恢复慢,allocate channel 数量不是越多越好
rman 恢复速度卡在 i/o 或内存瓶颈上,盲目增加 allocate channel 反而引发争抢和排队。oracle 默认单通道使用 1mb 缓冲区(db_file_multiblock_read_count 和底层存储块大小共同影响实际读粒度),但恢复时真正起效的是每个通道独占的输入/输出缓冲——由 backup_disk_io_slaves 和 filesystemio_options 隐式控制,而非单纯开通道数。
实操建议:
- 先查当前通道配置:
SHOW ALL;看DEVICE TYPE DISK PARALLELISM和MAXOPENFILES - 物理磁盘阵列(非 SSD/NVMe)下,并行通道数建议 ≤ 存储控制器通道数 × 2;例如双控制器 RAID,设
PARALLELISM 4通常比 8 更稳 - 启用异步 I/O:确认
FILESYSTEMIO_OPTIONS = ASYNCH(Linux/Unix)或SET FILESYSTEMIO_OPTIONS = DIRECTIO(部分场景需配合DISK_ASYNCH_IO=TRUE) - 避免在恢复期间运行其他高 I/O 任务(如统计信息收集、归档切换密集写)
DB_RECOVERY_FILE_DEST_SIZE 不足会拖慢恢复,但调大不等于提速
恢复过程中,RMAN 会把归档日志、增量备份片解压/解密后暂存到快速恢复区(FRA),若 DB_RECOVERY_FILE_DEST_SIZE 接近上限,Oracle 会频繁触发空间回收(如自动删除过期归档),导致恢复线程反复等待 I/O 完成。
这不是“空间不够就恢复失败”,而是“空间紧张→清理动作→I/O 阻塞→恢复变慢”。更隐蔽的问题是:FRA 路径落在机械盘上,而数据文件在 SSD,这种混合路径会放大延迟。
实操建议:
- 用
SELECT * FROM V$RECOVERY_FILE_DEST;查剩余空间和路径,确保 FRA 所在文件系统空闲 ≥ 30% 且与数据文件同类型存储 - 临时调整:恢复前执行
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE = 200G SCOPE=BOTH;(按需放大,但别超磁盘总容量 80%) - 不推荐长期靠增大 FRA 提速;应优先清理无用备份:
DELETE OBSOLETE;或CROSSCHECK ARCHIVELOG ALL;+DELETE EXPIRED;
SET COMMAND ID 和 CONFIGURE DEVICE TYPE DISK BACKUP TYPE TO COPY 对恢复速度几乎没影响
这两个配置常被误认为能加速恢复,其实不然:SET COMMAND ID 只用于跟踪 RMAN 会话日志,不影响 I/O 路径;BACKUP TYPE TO COPY 是针对备份操作的镜像拷贝模式,恢复时 RMAN 仍走标准 restore/recover 流程,不会跳过校验或解密步骤。
真正影响恢复耗时的参数集中在缓冲与通道行为层面:
- 恢复时无法直接设置缓冲大小,但可通过
SET DBID+RESTORE DATABASE PREVIEW观察预估的 I/O 量,判断是否因大量小文件(如千万级小表空间)导致随机读放大 - 对含大量归档日志的应用恢复,启用
RECOVER DATABASE UNTIL SEQUENCE xxx THREAD 1显式限定范围,避免 RMAN 自动扫描全部归档目录 - 若使用压缩备份(
AS COMPRESSED BACKUPSET),恢复必须解压,此时 CPU 成为瓶颈;可考虑关闭压缩备份(CONFIGURE COMPRESSION ALGORITHM 'BASIC' CLEAR),换空间换时间
Buffer Size 实际由 DB_BLOCK_SIZE 和 I/O 栈共同决定,不能手动设
RMAN 没有类似 SET BUFFER SIZE 的命令。所谓“调整 buffer size”,本质是优化 Oracle 底层 I/O 请求的聚合效率:每次从磁盘读取多少个连续块,取决于 DB_BLOCK_SIZE、DB_FILE_MULTIBLOCK_READ_COUNT、存储设备的条带深度,以及 OS 的 I/O 调度策略。
例如 DB_BLOCK_SIZE=8K + DB_FILE_MULTIBLOCK_READ_COUNT=128 → 单次读请求最大 1MB,但这只是理论值;若存储是 64K 条带,实际 I/O 可能被拆成多次 64K 请求。
实操建议:
- 检查当前值:
SHOW PARAMETER DB_BLOCK_SIZE;和SHOW PARAMETER DB_FILE_MULTIBLOCK_READ_COUNT; - 不建议盲目调高
DB_FILE_MULTIBLOCK_READ_COUNT:超过存储条带宽度反而增加寻道次数;SSD 可设为 128,SAS 机械盘建议 32–64 - 关键点常被忽略:恢复目标主机的
/proc/sys/vm/dirty_ratio和/proc/sys/vm/dirty_background_ratio若设得过高(如 80),会导致 Linux 内核延迟刷脏页,间接拖慢 RMAN 写入速度











