Block Change Tracking File

Block Change Tracking File

适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

Block Change Tracking(BCT) 文件记录数据块的变更,用于加速 RMAN 增量备份[1]:

核心价值

  • 增量备份从”全库扫描”变为”仅扫变更块”
  • 增量备份速度提升 10-100 倍
  • 减少 I/O 开销

2. 工作原理

2.1 无 BCT 的增量备份

RMAN> BACKUP INCREMENTAL LEVEL 1 DATABASE;

无 BCT 时:
1. 扫描所有数据文件的所有数据块
2. 对每个块比较 SCN 与上次备份的 SCN
3. 仅备份变更的块

→ 即使只有 1% 变更,也要扫描 100% 数据
→ 增量备份几乎与全备一样慢

2.2 有 BCT 的增量备份

启用 BCT 后:
1. CTWR 进程实时记录数据块变更
2. 变更信息写入 BCT 文件
3. RMAN 增量备份只读 BCT 文件
4. 仅备份 BCT 中标记变更的块

→ 备份速度只与变更块数量成正比
→ 大型数据库增量备份从几小时降至几分钟

2.3 BCT 文件结构

BCT 文件按 4 位 bitmap 标记数据块变更:

+----------+---------+
| Block 0  | 0000    | ← 未变更
| Block 1  | 0001    | ← 变更
| Block 2  | 0000    | ← 未变更
| Block 3  | 0001    | ← 变更
| ...      | ...     |
+----------+---------+

每 32 个数据块对应一个 BCT 块(约 4KB)

3. 启用 BCT

3.1 配置

-- 启用 BCT
ALTER DATABASE ENABLE BLOCK CHANGE TRACKING 
  USING FILE '/u01/oradata/orcl/bct.ctf';

-- 或使用 OMF
ALTER SYSTEM SET db_create_file_dest='/u01/oradata' SCOPE=BOTH;
ALTER DATABASE ENABLE BLOCK CHANGE TRACKING;

-- 查看 BCT 状态
SELECT 
  filename, 
  status, 
  bytes
FROM v$block_change_tracking;
-- STATUS = ENABLED 表示已启用

3.2 关闭 BCT

ALTER DATABASE DISABLE BLOCK CHANGE TRACKING;
-- 关闭后文件会被删除

3.3 修改 BCT 文件位置

-- 1. 关闭数据库
SHUTDOWN IMMEDIATE;

-- 2. 启动到 mount
STARTUP MOUNT;

-- 3. 修改位置
ALTER DATABASE RENAME FILE '/u01/bct.ctf' TO '/u02/bct.ctf';

-- 4. 打开数据库
ALTER DATABASE OPEN;

4. BCT 与 RMAN 增量备份

4.1 配置增量备份

RMAN> CONFIGURE BACKUP OPTIMIZATION ON;
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;

-- Level 0 全备
RMAN> BACKUP INCREMENTAL LEVEL 0 DATABASE PLUS ARCHIVELOG;

-- Level 1 增量备份
RMAN> BACKUP INCREMENTAL LEVEL 1 DATABASE PLUS ARCHIVELOG;

4.2 累积增量

RMAN> BACKUP INCREMENTAL LEVEL 1 CUMULATIVE DATABASE;
-- 累积自上次 Level 0 以来所有变更

4.3 快速增量备份(BCT 生效)

RMAN> BACKUP INCREMENTAL LEVEL 1 DATABASE TAG 'incr_bct';

-- 查看 BCT 是否被使用
RMAN> LIST BACKUPSET TAG 'incr_bct';

5. 监控与诊断

5.1 BCT 使用情况

-- BCT 状态
SELECT 
  filename,
  status,
  bytes
FROM v$block_change_tracking;

-- RMAN 使用 BCT 的统计
SELECT 
  file#,
  AVG(datafile_blocks) AS avg_blocks,
  AVG(blocks_read) AS avg_read,
  ROUND(AVG(blocks_read)/NULLIF(AVG(datafile_blocks),0)*100, 2) AS read_pct
FROM v$backup_datafile
WHERE used_change_tracking = 'YES'
GROUP BY file#;
-- read_pct 越低,BCT 效果越好

5.2 CTWR 进程

-- CTWR 进程状态
SELECT name, description, status 
FROM v$bgprocess 
WHERE name = 'CTWR';

-- CTWR 相关等待事件
SELECT event, total_wasts, time_waited
FROM v$system_event
WHERE event LIKE '%change tracking%';

6. 常见坑与排错

6.1 ORA-19770: change tracking file synchronization failed

现象:BCT 文件与数据库不同步。

修复

-- 1. 关闭 BCT
ALTER DATABASE DISABLE BLOCK CHANGE TRACKING;

-- 2. 重新启用
ALTER DATABASE ENABLE BLOCK CHANGE TRACKING 
  USING FILE '/u01/oradata/orcl/bct.ctf';

-- 3. 重新做 Level 0 全备
RMAN> BACKUP INCREMENTAL LEVEL 0 DATABASE;

6.2 BCT 文件丢失

现象ORA-19773: change tracking file not found

修复

-- 1. 关闭 BCT(接受丢失)
ALTER DATABASE DISABLE BLOCK CHANGE TRACKING;

-- 2. 重新启用,会创建新 BCT 文件
ALTER DATABASE ENABLE BLOCK CHANGE TRACKING 
  USING FILE '/u01/oradata/orcl/bct.ctf';

-- 3. 做一次 Level 0 备份重置基线
RMAN> BACKUP INCREMENTAL LEVEL 0 DATABASE;

6.3 BCT 文件空间不足

现象:BCT 文件无法扩展。

修复

-- 检查磁盘空间
! df -h /u01

-- 移动到其他位置
ALTER DATABASE DISABLE BLOCK CHANGE TRACKING;
ALTER DATABASE ENABLE BLOCK CHANGE TRACKING 
  USING FILE '/u02/oradata/orcl/bct.ctf';

6.4 增量备份未使用 BCT

现象v$backup_datafile.used_change_tracking 显示 NO。

原因

  • BCT 未启用
  • 上次 Level 0 备份未做
  • 数据文件新建

修复

-- 1. 检查 BCT 状态
SELECT status FROM v$block_change_tracking;

-- 2. 重新做 Level 0
RMAN> BACKUP INCREMENTAL LEVEL 0 DATABASE;

7. 最佳实践

  1. 生产环境必启用 BCT:增量备份提速 10-100 倍
  2. BCT 文件多路复用:放 ASM 或 RAID 存储
  3. BCT 文件大小估算:每 GB 数据库约 1/30000 的 BCT 大小(如 1TB 数据 ≈ 33MB BCT)
  4. Level 0 后立即启用 BCT:确保基线正确
  5. 监控 used_change_tracking:定期检查 BCT 使用率
  6. RMAN 配合 BCTBACKUP OPTIMIZATION ON
  7. BCT 文件定期备份:与 SPFILE/控制文件一起

8. 参考资料

[1] Oracle Database Backup and Recovery User’s Guide 19c, “Block Change Tracking” https://docs.oracle.com/en/database/oracle/oracle-database/19/bradv/rman-backup-concepts.html

[2] Oracle Database Administrator’s Guide 19c, “Managing Block Change Tracking” https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/managing-the-database.html