\_BLKSIZE设再大也不提速甚至更慢,因其实际I/O受存储条带、ASM AU、OS调度等多重约束;强行设1MB而条带仅64KB会导致非对齐I/O和碎片;该参数是RMAN缓冲单位,非直接下发块大小,真实I/O由DB_FILE_MULTIBLOCK_READ_COUNT×DB_BLOCK_SIZE与底层协商决定。
为什么 _BLKSIZE 设再大也不提速,甚至更慢?
因为 rman 实际使用的 i/o 块大小不只看 _blksize,还受底层存储条带(stripe unit)、asm au 大小、os i/o 调度器和磁盘队列深度共同约束。强行设成 1mb,但存储条带只有 64kb,就会导致每次物理读写跨多个条带,引发大量非对齐 i/o 和内部碎片。
-
_BLKSIZE是 RMAN 内部缓冲区单位,不是直接下发给存储的块大小;真实下发的是由DB_FILE_MULTIBLOCK_READ_COUNT×DB_BLOCK_SIZE和底层驱动协商后的结果 - Oracle 11gR2+ 默认忽略手动设置的
_BLKSIZE,除非显式启用SET COMMAND ID或使用ALLOCATE CHANNEL ... PARMS强制传递 - 常见误操作:在
RMAN> CONFIGURE DEVICE TYPE DISK PARALLELISM 4;后直接SET _BLKSIZE=1048576,但没绑定到具体 channel,该设置不生效
怎么查清你的存储条带和 ASM 配置是否匹配?
不查清楚底层,调 _BLKSIZE 就是蒙眼调参。重点看三处:
- 查 ASM 磁盘组条带:运行
SELECT name, allocation_unit_size, sector_size, logical_sector_size FROM v$asm_diskgroup;—— 其中allocation_unit_size(通常 1MB)才是 ASM 对齐的最小单元,_BLKSIZE应为其整数分之一(如 128KB、256KB)或整数倍(需配合MAXPIECESIZE控制) - 查底层存储条带:对裸设备或 LUN,用
dd if=/dev/zero of=/tmp/test bs=64k count=1000 oflag=direct+iostat -x 1观察avgrq-sz,若长期偏离 128 或 256,则说明上层未对齐 - 查当前备份通道实际 I/O 行为:在备份时执行
SELECT event, p1text, p1, p2text, p2 FROM v$session_event WHERE sid IN (SELECT sid FROM v$session WHERE program LIKE '%rman%') AND event LIKE 'direct path%';,观察p1(物理块大小)是否接近你设的_BLKSIZE
RMAN channel 级别强制对齐的实操写法
全局 _BLKSIZE 不可靠,必须在分配 channel 时显式控制。注意 Oracle 版本差异:
- 12cR1 及以后:用
ALLOCATE CHANNEL c1 DEVICE TYPE DISK MAXPIECESIZE 2G PARMS='BLKSIZE=262144';—— 这里BLKSIZE是真实传给 OS 的逻辑块大小,且必须是 512B 的整数倍、≤MAXPIECESIZE的 1/8 - 11gR2:只能通过隐含参数
PARMS='SBT_LIBRARY=/path/libobk.so,ENV=(NSR_SERVER=backup01,NSR_CLIENT=ora01,_BLKSIZE=262144)'透传(仅限 SBT),DISK 类型不支持 - 所有版本都禁止在
CONFIGURE CHANNEL中设_BLKSIZE,它会被忽略;必须在ALLOCATE CHANNEL或RUN { ALLOCATE ... }块内指定
容易被忽略的副作用:归档日志备份和压缩的冲突
当你为数据文件备份调大 _BLKSIZE,归档日志备份也会继承同一 channel 设置,但归档日志是连续小块(每个约几 MB),大块读反而增加 buffer copy 开销,并可能触发更多 log file sync 等待。
- 解决方案:拆通道——用不同 channel 分开跑数据文件和归档日志,例如:
ALLOCATE CHANNEL d1 DEVICE TYPE DISK PARMS='BLKSIZE=524288';跑BACKUP DATABASE,再用ALLOCATE CHANNEL a1 DEVICE TYPE DISK PARMS='BLKSIZE=65536';跑BACKUP ARCHIVELOG ALL - 启用
BACKUP ... AS COMPRESSED BACKUPSET时,_BLKSIZE必须 ≤ 1MB,否则报错ORA-19570: block size 2097152 not allowed for compressed backupset - 如果用了 ZFS/NFS 存储,
_BLKSIZE还要避开其 recordsize(如 ZFS 默认 128KB),否则引发 double buffering
真正起效的对齐,从来不是调一个参数,而是让 RMAN buffer、ASM AU、存储条带、文件系统块、压缩引擎限制全部咬合。少查一环,就白调。










