RMAN默认不限速导致I/O争抢,业务变慢;需在ALLOCATE CHANNEL中显式指定RATE参数(如rate 15M)限制每秒读取字节数,多通道时总限速≈单通道RATE×并发数,并通过V$RMAN_BACKUP_JOB_DETAILS验证实际速率。
为什么RMAN默认会抢光I/O,导致业务变慢
rman在oracle 12c中默认不设限,allocate channel启动后会全力读取数据文件,尤其在多通道并行时,很容易把磁盘带宽占满。常见现象是:备份期间db file sequential read或direct path read等待飙升,报表sql响应时间翻倍,awr里%db time集中在i/o类事件。这不是数据库坏了,是rman没被“管住”。
ALLOCATE CHANNEL里的RATE参数怎么写才生效
RATE必须出现在ALLOCATE CHANNEL命令中,且只对当前通道生效;放在CONFIGURE CHANNEL里无效(12c已弃用该配置项的RATE支持)。它限制的是**每秒最大读取字节数**,不是写入或压缩后大小。
- 单位必须带后缀:
20M表示20 MiB/s(即20 × 1024 × 1024 字节/秒),5M、100K也合法,但20m或20MB会报错ORA-19566: exceeded limit of 0 corrupt blocks(实际是语法错误被误报) - 值不能为0,最小有效值是
1K;设太高(如200M)可能超出物理磁盘能力,反而触发重试和超时 - 若同时开多个通道,总限速 ≈ 单通道
RATE× 实际并发数,但要注意底层存储是否真能支撑——比如RAID5阵列在高并发小IO下,rate 30M开4个通道,实际吞吐可能卡在80M左右
run块里手动分配通道 + RATE的典型写法
这是生产环境最可控的方式,避免自动分配通道绕过限速逻辑。注意RATE要写在ALLOCATE同一行,不能换行或加注释隔开。
run {
allocate channel c1 type disk rate 15M;
allocate channel c2 type disk rate 15M;
allocate channel c3 type disk rate 10M;
backup as compressed backupset database plus archivelog delete input;
release channel c1;
release channel c2;
release channel c3;
}
说明:
- 三个通道限速不同,适用于混合存储(如c1/c2跑SSD、c3跑SATA盘)
- 没写
maxpiecesize时,RMAN仍按默认2G切片;若想配合RATE更稳,建议显式加maxpiecesize 2G -
release channel非必需(RMAN退出时自动释放),但显式写出可避免后续run块意外复用旧通道
容易被忽略的兼容性与监控点
RATE在12.1.0.2+版本稳定支持,但以下两点常被跳过:
- 如果数据库启用了
block change tracking,限速后增量备份耗时增加明显,因为跟踪文件读取不受RATE约束,会形成IO热点——建议搭配ALTER DATABASE DISABLE BLOCK CHANGE TRACKING临时关闭再备份 - 查限速是否真起作用,别只看RMAN日志里的“elapsed time”,要用
V$RMAN_BACKUP_JOB_DETAILS查INPUT_BYTES_PER_SEC字段:SELECT input_bytes_per_sec/1048576 AS mbps FROM V$RMAN_BACKUP_JOB_DETAILS WHERE START_TIME > SYSDATE-1/24 ORDER BY START_TIME DESC - Linux上若启用了
ionice或cgroup限速,和RMAN的RATE会叠加生效,可能导致实际速度远低于预期,调试时建议先关掉系统级IO调度
限速不是越低越好,关键是让backup和archivelog switch不打架——观察V$ARCHIVE_DEST_STATUS里STATUS是否长期DEFERRED,那是归档积压的信号。


















