Oracle RMAN 增量备份与 Block Change Tracking

Oracle RMAN 增量备份与 Block Change Tracking

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


1. 概述

RMAN 增量备份 仅备份变化的数据块[1],配合 Block Change Tracking 大幅提升性能:

核心特性

  • 增量备份仅备份变化块
  • Block Change Tracking 记录变化
  • 多级增量备份(0/1/2)
  • 增量更新备份(19c)

2. 增量备份级别

2.1 备份级别

级别说明
0全量备份(基础)
1 cumulative累积增量(自上次 0 级)
1 differential差异增量(自上次任意备份)

2.2 备份策略

周日: Level 0(全量)
周一-周六: Level 1 differential

周日: Level 0
周三: Level 1 cumulative
其他: Level 1 differential

3. 创建增量备份

3.1 Level 0 全量备份

RMAN> BACKUP INCREMENTAL LEVEL 0 DATABASE PLUS ARCHIVELOG;

3.2 Level 1 增量备份

-- 差异增量(默认)
RMAN> BACKUP INCREMENTAL LEVEL 1 DATABASE;

-- 累积增量
RMAN> BACKUP INCREMENTAL LEVEL 1 CUMULATIVE DATABASE;

3.3 表空间增量

RMAN> BACKUP INCREMENTAL LEVEL 1 TABLESPACE users, example;

3.4 数据文件增量

RMAN> BACKUP INCREMENTAL LEVEL 1 DATAFILE 4, 5;

4. Block Change Tracking

4.1 启用 BCT

-- 启用 Block Change Tracking
ALTER DATABASE ENABLE BLOCK CHANGE TRACKING 
  USING FILE '/u01/oradata/orcl/bct.log';

-- OMF 自动命名
ALTER SYSTEM SET db_create_file_dest='+DATA' SCOPE=BOTH;
ALTER DATABASE ENABLE BLOCK CHANGE TRACKING;

4.2 查看 BCT 状态

SELECT 
  filename, 
  status, 
  bytes
FROM v$block_change_tracking;

4.3 禁用 BCT

ALTER DATABASE DISABLE BLOCK CHANGE TRACKING;

4.4 移动 BCT 文件

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

-- 2. 启动到 mount
STARTUP MOUNT;

-- 3. 移动文件
ALTER DATABASE RENAME FILE '/u01/oradata/orcl/bct.log' TO '/u02/bct.log';

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

5. 增量备份性能

5.1 无 BCT

扫描所有数据块,对比 SCN
- 1TB 数据库需扫描所有块
- 耗时接近全量备份

5.2 有 BCT

仅扫描变化的块
- 仅读取 BCT 文件
- 增量备份速度提升 10-100 倍

5.3 性能对比

数据库大小无 BCT有 BCT
100GB30 分钟5 分钟
1TB5 小时30 分钟
10TB50 小时3 小时

6. 增量更新备份(IUB)

6.1 概念

19c 引入,将增量备份应用到 Image Copy:

1. 初始: Image Copy
2. 增量: 应用到 Image Copy
3. 下次: Image Copy 已是最新

6.2 配置 IUB

RMAN> RUN {
  RECOVER COPY OF DATABASE WITH TAG 'incr_update';
  BACKUP INCREMENTAL LEVEL 1 FOR RECOVER OF COPY WITH TAG 'incr_update' DATABASE;
}

6.3 优势

  • 快速恢复(无需应用增量)
  • 节省存储
  • 自动维护

7. 增量备份恢复

7.1 完全恢复

-- 1. 恢复 Level 0
RMAN> RESTORE DATABASE;

-- 2. 应用 Level 1 增量
RMAN> RECOVER DATABASE;

-- 3. 应用归档
RMAN> RECOVER DATABASE;

7.2 不完全恢复

RMAN> RUN {
  SET UNTIL TIME "TO_DATE('2026-07-21 14:00:00','YYYY-MM-DD HH24:MI:SS')";
  RESTORE DATABASE;
  RECOVER DATABASE;
}

7.3 块介质恢复

-- 仅恢复损坏块
RMAN> RECOVER DATAFILE 4 BLOCK 123;
RMAN> RECOVER CORRUPTION LIST;

8. 备份策略示例

8.1 标准策略

-- 周日 Level 0
RMAN> BACKUP INCREMENTAL LEVEL 0 DATABASE PLUS ARCHIVELOG DELETE INPUT;

-- 周一至周六 Level 1
RMAN> BACKUP INCREMENTAL LEVEL 1 DATABASE PLUS ARCHIVELOG DELETE INPUT;

8.2 保留策略

RMAN> CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;
RMAN> CONFIGURE RETENTION POLICY TO REDUNDANCY 2;

8.3 自动化

RMAN> CONFIGURE BACKUP OPTIMIZATION ON;
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/u01/backup/%F';

9. 监控增量备份

9.1 查看备份

SELECT 
  b.tag,
  b.incremental_level,
  b.backup_type,
  b.completion_time,
  b.handle
FROM v$backup_set b, v$backup_piece p
WHERE b.set_stamp = p.set_stamp
  AND b.incremental_level IS NOT NULL
ORDER BY b.completion_time DESC;

9.2 BCT 效果

-- 查看增量备份读取的块数
SELECT 
  file#,
  avg(datafile_blocks) AS total_blocks,
  avg(blocks_read) AS blocks_read,
  ROUND(avg(blocks_read) / avg(datafile_blocks) * 100, 2) AS read_pct
FROM v$backup_datafile
WHERE incremental_level > 0
GROUP BY file#;

10. 常见坑与排错

10.1 增量备份慢

修复

-- 1. 启用 BCT
ALTER DATABASE ENABLE BLOCK CHANGE TRACKING USING FILE '/u01/bct.log';

-- 2. 验证
SELECT status FROM v$block_change_tracking;

10.2 ORA-19716: BCT 文件无效

修复

-- 1. 禁用 BCT
ALTER DATABASE DISABLE BLOCK CHANGE TRACKING;

-- 2. 删除旧文件
! rm /u01/oradata/orcl/bct.log

-- 3. 重新启用
ALTER DATABASE ENABLE BLOCK CHANGE TRACKING USING FILE '/u01/bct.log';

10.3 Level 0 缺失

现象:Level 1 失败。

修复

-- 先创建 Level 0
RMAN> BACKUP INCREMENTAL LEVEL 0 DATABASE;

-- 然后 Level 1
RMAN> BACKUP INCREMENTAL LEVEL 1 DATABASE;

10.4 增量备份过大

原因:变化数据多。

修复

-- 1. 检查 BCT 是否启用
SELECT status FROM v$block_change_tracking;

-- 2. 检查数据库活动
SELECT name, value FROM v$sysstat WHERE name LIKE '%changes%';

10.5 ORA-19625: 文件不存在

修复

-- 检查数据文件
SELECT file_name, status FROM dba_data_files;

-- 跨平台恢复需要 RESTORE FROM PLATFORM

11. 最佳实践

  1. 生产启用 BCT:增量备份性能 10-100 倍
  2. 每周 Level 0:基础备份
  3. 每日 Level 1:增量备份
  4. 使用 IUB(19c+):快速恢复
  5. 合理保留策略:7-30 天
  6. 备份归档日志:完整恢复
  7. 监控 BCT 状态:v$block_change_tracking
  8. 定期验证备份:RESTORE DATABASE VALIDATE
  9. 备份到多目的地:避免单点
  10. 测试恢复:定期演练

12. 参考资料

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

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