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. 最佳实践
- 生产环境必启用 BCT:增量备份提速 10-100 倍
- BCT 文件多路复用:放 ASM 或 RAID 存储
- BCT 文件大小估算:每 GB 数据库约 1/30000 的 BCT 大小(如 1TB 数据 ≈ 33MB BCT)
- Level 0 后立即启用 BCT:确保基线正确
- 监控 used_change_tracking:定期检查 BCT 使用率
- RMAN 配合 BCT:
BACKUP OPTIMIZATION ON - 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