开启BCT能明显加快Oracle增量备份,因其使RMAN跳过全文件块扫描,直接读取变更块位图文件;实测11g+版本1级备份耗时下降60%~80%,但需确保STATUS为ENABLED且使用INCREMENAL LEVEL 1命令。
为什么开启BCT能明显加快增量备份
oracle的增量备份默认要扫描整个数据文件,找出哪些块被修改过。10tb库做0级+1级备份时,光扫描就可能耗掉2小时——这比实际写入备份集还慢。开启block change tracking(bct)后,数据库会把变更块信息实时记录到一个专用小文件里,rman直接读这个文件,跳过全盘扫描。实测11g及以上版本开启后,1级增量备份耗时普遍下降60%~80%。
开启BCT的具体操作和关键限制
必须用SYSDBA权限执行,且数据库需处于MOUNT或OPEN状态。命令本身很简单,但有三个容易被忽略的条件:
-
ALTER DATABASE ENABLE BLOCK CHANGE TRACKING USING FILE '/u01/oradata/PROD/bct_file.f'—— 路径必须是本地磁盘(不能是NFS或ASM diskgroup),否则报错ORA-19721 - 该文件大小与数据库规模正相关,但Oracle自动管理;不过建议单独挂载小容量高速盘(如SSD),避免和数据文件争I/O
- 启用后,每次checkpoint都会写BCT文件,所以归档日志量略增(通常可忽略),但
V$BLOCK_CHANGE_TRACKING视图里的STATUS必须为ENABLED才真正生效
BCT在RMAN中如何被实际调用
不是开了就自动加速——RMAN必须明确使用INCREMENTAL LEVEL 1,且不能带BACKUP ... NOT BACKED UP SINCE TIME这类绕过BCT的语法。典型高效流程如下:
RUN {
ALLOCATE CHANNEL c1 DEVICE TYPE DISK;
BACKUP INCREMENTAL LEVEL 1 DATABASE;
RELEASE CHANNEL c1;
}
注意:LEVEL 0备份不走BCT,它本质是全量;而LEVEL 1 CUMULATIVE会比LEVEL 1多扫一遍,除非你明确需要累积效果,否则别用。
常见失效场景和验证方法
最常踩的坑是误以为“开了就永久生效”。实际上BCT文件损坏、路径被删、磁盘满或数据库异常重启都可能导致状态变为DISABLED。每天巡检务必执行:
SELECT STATUS, FILENAME, BYTES FROM V$BLOCK_CHANGE_TRACKING;
如果STATUS不是ENABLED,或BYTES长期为0,说明BCT没在工作。此时不要直接重开,先查alert.log里是否有Block change tracking file is corrupted类错误——损坏的BCT文件必须先DISABLE再ENABLE,否则RMAN仍会尝试读旧文件并卡住。











