Oracle RMAN 备份恢复全流程

Oracle RMAN 备份恢复全流程

适用版本:Oracle Database 19c / 23ai 阅读基础:了解归档模式、控制文件、redo log 文档版本:v1.0 / 2026-07


目录


1. 概述:为什么 RMAN 是 Oracle 备份的事实标准

Recovery Manager(RMAN)是 Oracle 提供的备份恢复工具,自 Oracle 8i 引入,已成为 Oracle 数据库备份恢复的事实标准[1]。

RMAN 相对传统备份方式的优势

特性RMANOS 拷贝 / 用户管理备份
备份粒度数据块级别文件级别
增量备份支持块级增量不支持
备份验证内置 VALIDATE需额外脚本
损坏块检测自动跳过损坏块可能备份到损坏块
Oracle 集成深度集成有限
恢复速度通常更快较慢
压缩加密多种算法依赖外部工具
在线备份完全支持需 begin backup 模式
备份元数据控制文件 + Catalog手动维护

RMAN 的核心价值

  1. 块级增量:只备份自上次备份以来变更的数据块,大幅减少备份量
  2. WAL 协同:自动与 redo log / 归档日志配合,支持时间点恢复
  3. 损坏检测:备份时自动跳过损坏块,避免”备份了不可用的数据”
  4. 集中管理:通过 Recovery Catalog 集中管理多个数据库的备份

2. RMAN 核心概念与组件

┌─────────────────────────────────────────────────────┐
│                   RMAN Architecture                  │
├─────────────────────────────────────────────────────┤
│  RMAN Client(命令行或图形界面)                     │
│     ↓                                                │
│  Target Database(目标库,被备份的库)                │
│     ├─ Server Process(执行实际备份)                │
│     ├─ Channel(通道,I/O 通道)                     │
│     ├─ Target Control File(备份元数据存储)         │
│     └─ Target Database Files(被备份的数据文件)     │
├─────────────────────────────────────────────────────┤
│  Recovery Catalog(恢复目录,可选)                  │
│     └─ 独立的小数据库,存储多个目标库的备份元数据     │
├─────────────────────────────────────────────────────┤
│  Auxiliary Database(辅助数据库)                    │
│     └─ TSPITR、Duplicate 时使用的临时实例             │
├─────────────────────────────────────────────────────┤
│  Media Manager(介质管理器,可选)                   │
│     └─ 磁带库、对象存储等                            │
└─────────────────────────────────────────────────────┘

关键术语[1][3]:

术语含义
Target Database被备份的数据库
ChannelRMAN 与存储设备的 I/O 通道,可以是 DISK 或 SBT_TAPE
Backup Set备份集,逻辑单元,包含一个或多个数据文件
Backup Piece备份片,备份集的物理文件
Image Copy镜像副本,与原文件 1:1 的拷贝
Incarnation数据库的”化身”,每次 resetlogs 后产生新 incarnation
Snapshot Control FileRMAN 备份时的控制文件快照
Recovery Catalog恢复目录,独立数据库存储备份元数据

连接 RMAN

# 连接本地目标库(OS 认证)
rman target /

# 连接远程目标库
rman target sys/password@orcl

# 连接目标库 + 恢复目录
rman target / catalog rman/rman@catdb

# 使用网络连接辅助库(用于 duplicate / TSPITR)
rman target / auxiliary sys/password@auxdb

3. RMAN 备份类型

3.1 完全备份 vs 增量备份

完全备份(Full Backup)[1]:

  • 备份所有”使用过的”数据块(不包括从未使用的空块)
  • 不依赖其他备份,可独立恢复
  • 不影响后续增量备份的基线

增量备份(Incremental Backup)

  • 只备份自上次备份以来变更的块
  • 依赖 Level 0 备份作为基线
  • 大幅减少备份量和时间

3.2 差异增量 vs 累积增量

差异增量(Differential Incremental,默认)[3]:

  • 备份自上次同级或更低级备份以来变更的块
  • 周日 Level 0,周一至周六 Level 1 差异
  • 周一备份周日之后的变更
  • 周二备份周一之后的变更(不含周日到周一)
周日 L0  周一 L1(差) 周二 L1(差) 周三 L1(差)
  5TB     +200GB     +200GB    +200GB
恢复周三:
  需还原周日 L0 + 周一 + 周二 + 周三 = 5.6 TB

累积增量(Cumulative Incremental)[3]:

  • 备份自上次 Level 0 备份以来所有变更的块
  • 周一备份周日之后的变更(200 GB)
  • 周二备份周日到周二的变更(400 GB)
  • 周三备份周日到周三的变更(600 GB)
周日 L0   周一 L1(累) 周二 L1(累) 周三 L1(累)
  5TB      +200GB     +400GB    +600GB
恢复周三:
  只需还原周日 L0 + 周三累积 = 5.6 TB

选型原则[3]:

维度差异增量累积增量
单次备份量大(持续增长)
恢复时间长(需还原多个增量)短(只需最近一个)
适用场景备份窗口紧张恢复时间敏感
推荐日常生产紧急恢复场景

3.3 备份集 vs 镜像副本

特性Backup SetImage Copy
格式RMAN 专有格式与原文件相同
大小较小(可压缩、可跳过空块)与原文件一致
恢复速度需 Restore 解压可直接切换使用
增量支持支持不支持
推荐场景日常备份快速恢复、Standby

3.4 全备 vs 0 级增量备份

关键区别

  • Full Backup:备份所有数据块,但不作为增量基线
  • Level 0 Incremental Backup:备份所有数据块,作为增量基线

坑 1:执行 BACKUP DATABASE 是 Full Backup,后续 Level 1 增量会备份自上次 Level 0 以来的所有变更。如果没有 Level 0 备份,Level 1 会自动转为 Level 0。


4. RMAN 配置与最佳实践

4.1 持久化配置参数

-- 查看当前配置
RMAN> SHOW ALL;

-- 配置保留策略(7 天恢复窗口)
RMAN> CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;

-- 配置冗余数(保留 2 份)
RMAN> CONFIGURE RETENTION POLICY TO REDUNDANCY 2;

-- 启用控制文件和 SPFILE 自动备份
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/u01/backup/%F';

-- 配置默认设备类型
RMAN> CONFIGURE DEFAULT DEVICE TYPE TO DISK;

-- 配置备份优化(跳过未变更的备份)
RMAN> CONFIGURE BACKUP OPTIMIZATION ON;

-- 配置压缩
RMAN> CONFIGURE DEVICE TYPE DISK PARALLELISM 4 BACKUP TYPE TO COMPRESSED BACKUPSET;

-- 配置通道
RMAN> CONFIGURE CHANNEL 1 DEVICE TYPE DISK FORMAT '/u01/backup/%d_%T_%U.bkp';
RMAN> CONFIGURE CHANNEL 2 DEVICE TYPE DISK FORMAT '/u01/backup/%d_%T_%U.bkp';

-- 配置归档日志删除策略
RMAN> CONFIGURE ARCHIVELOG DELETION POLICY TO BACKED UP 2 TIMES TO DISK;

-- 配置快照控制文件位置
RMAN> CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/u01/backup/snapcf_orcl.f';

4.2 替换变量说明

变量含义示例
%d数据库名ORCL
%T日期 YYYYMMDD20260721
%U唯一 ID07so2v2k_1_1
%F控制文件自动备份格式 c-DBID-YYYYMMDD-SEQc-1234567890-20260721-0
%s备份集号123
%p备份片号1
%t时间戳1234567890
%e归档日志 sequence1234

4.3 启用控制文件自动备份

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

为什么必须启用

  1. 控制文件丢失时,可从自动备份恢复
  2. 自动备份包含 SPFILE,可一起恢复
  3. 文件名格式固定(c-DBID-YYYYMMDD-SEQ),便于查找

5. RMAN 备份完整流程

5.1 启用归档模式

-- 检查当前模式
SQL> ARCHIVE LOG LIST;
-- 或
SQL> SELECT log_mode FROM v$database;

-- 启用归档模式(需停库)
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP MOUNT;
SQL> ALTER DATABASE ARCHIVELOG;
SQL> ALTER DATABASE OPEN;

-- 配置归档目标
SQL> ALTER SYSTEM SET log_archive_dest_1 = 'location=/archivelog' SCOPE=BOTH;
SQL> ALTER SYSTEM SET log_archive_format = 'orcl_%t_%s_%r.arc' SCOPE=SPFILE;

坑 2:生产环境必须启用归档模式。NOARCHIVELOG 模式下:

  • 只能冷备(停库备份)
  • 无法在线备份
  • 无法时间点恢复
  • 无法搭建 Data Guard

5.2 配置 Flash Recovery Area

-- 配置 FRA
SQL> ALTER SYSTEM SET db_recovery_file_dest_size = 100G SCOPE=BOTH;
SQL> ALTER SYSTEM SET db_recovery_file_dest = '/u01/flash_recovery' SCOPE=BOTH;

-- 查看 FRA 使用情况
SELECT name, space_limit/1024/1024/1024 AS "Limit(GB)",
       space_used/1024/1024/1024 AS "Used(GB)",
       space_reclaimable/1024/1024/1024 AS "Reclaim(GB)"
FROM v$recovery_file_dest;

FRA 包含

  • 控制文件多路复用副本
  • 在线 redo log 多路复用副本
  • 归档日志
  • RMAN 备份集
  • Flashback log

5.3 配置 RMAN 持久化参数

(见 4.1)

5.4 全备脚本

#!/bin/bash
# rman_full_backup.sh
# Oracle 19c RMAN Full Backup with Compression
export ORACLE_SID=orcl
export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH

BACKUP_DIR=/u01/backup/rman
LOG_FILE=/u01/backup/logs/rman_full_$(date +%Y%m%d_%H%M%S).log
mkdir -p ******

rman target / <<EOF | tee -a $LOG_FILE
RUN {
    ALLOCATE CHANNEL ch1 DEVICE TYPE DISK FORMAT '$BACKUP_DIR/%d_%T_%U.bkp';
    ALLOCATE CHANNEL ch2 DEVICE TYPE DISK FORMAT '$BACKUP_DIR/%d_%T_%U.bkp';
    ALLOCATE CHANNEL ch3 DEVICE TYPE DISK FORMAT '$BACKUP_DIR/%d_%T_%U.bkp';
    ALLOCATE CHANNEL ch4 DEVICE TYPE DISK FORMAT '$BACKUP_DIR/%d_%T_%U.bkp';

    -- 全库压缩备份(含归档日志)
    BACKUP AS COMPRESSED BACKUPSET
        INCREMENTAL LEVEL 0
        DATABASE PLUS ARCHIVELOG;

    -- 单独备份控制文件和 SPFILE
    BACKUP CURRENT CONTROLFILE SPFILE;

    -- 释放通道
    RELEASE CHANNEL ch1;
    RELEASE CHANNEL ch2;
    RELEASE CHANNEL ch3;
    RELEASE CHANNEL ch4;
}

-- 验证备份
CROSSCHECK BACKUP;
CROSSCHECK ARCHIVELOG ALL;

-- 删除过期备份
DELETE NOPROMPT EXPIRED BACKUP;
DELETE NOPROMPT EXPIRED ARCHIVELOG ALL;

-- 删除过时备份(按保留策略)
DELETE NOPROMPT OBSOLETE;

EXIT;
EOF

if [ $? -eq 0 ]; then
    echo "[$(date)] Backup SUCCESS" >> $LOG_FILE
else
    echo "[$(date)] Backup FAILED" >> $LOG_FILE
    # 发送告警
    mail -s "RMAN Backup FAILED: $ORACLE_SID" dba@company.com < $LOG_FILE
fi

# 清理 15 天前的日志
find /u01/backup/logs -name "rman_*.log" -mtime +15 -delete

5.5 增量备份脚本

#!/bin/bash
# rman_incremental_backup.sh
# Oracle 19c RMAN Incremental Level 1 Backup
export ORACLE_SID=orcl
export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH

BACKUP_DIR=/u01/backup/rman
LOG_FILE=/u01/backup/logs/rman_incr_$(date +%Y%m%d_%H%M%S).log

rman target / <<EOF | tee -a $LOG_FILE
RUN {
    ALLOCATE CHANNEL ch1 DEVICE TYPE DISK FORMAT '$BACKUP_DIR/%d_%T_%U.bkp';
    ALLOCATE CHANNEL ch2 DEVICE TYPE DISK FORMAT '$BACKUP_DIR/%d_%T_%U.bkp';

    -- 增量备份(差异,默认)
    BACKUP AS COMPRESSED BACKUPSET
        INCREMENTAL LEVEL 1
        DATABASE PLUS ARCHIVELOG;

    BACKUP CURRENT CONTROLFILE SPFILE;

    RELEASE CHANNEL ch1;
    RELEASE CHANNEL ch2;
}

-- 合并增量到 Level 0 副本(增量更新备份)
-- 见 7 节 Block Change Tracking 与增量更新

DELETE NOPROMPT OBSOLETE;
EXIT;
EOF

5.6 归档日志备份

#!/bin/bash
# rman_archive_backup.sh
# Backup archive logs and delete backed-up ones
export ORACLE_SID=orcl
export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH

BACKUP_DIR=/u01/backup/archive
LOG_FILE=/u01/backup/logs/rman_arch_$(date +%Y%m%d_%H%M%S).log

rman target / <<EOF | tee -a $LOG_FILE
RUN {
    ALLOCATE CHANNEL ch1 DEVICE TYPE DISK FORMAT '$BACKUP_DIR/arch_%T_%U.bkp';

    -- 备份所有未备份的归档日志
    BACKUP ARCHIVELOG ALL
        NOT BACKED UP 1 TIMES
        FORMAT '$BACKUP_DIR/arch_%T_%U.bkp';

    -- 备份后删除已备份的归档
    DELETE NOPROMPT ARCHIVELOG ALL
        BACKED UP 1 TIMES TO DEVICE TYPE DISK;

    RELEASE CHANNEL ch1;
}
EXIT;
EOF

6. RMAN 恢复完整流程

6.1 完全恢复

场景:数据文件丢失,但所有归档日志和在线 redo log 都在。

rman target /

# 1. 启动到 mount(数据文件操作需要 mount)
RMAN> STARTUP MOUNT;

# 2. 还原数据库(从备份恢复数据文件)
RMAN> RESTORE DATABASE;

# 3. 应用归档日志和 redo
RMAN> RECOVER DATABASE;

# 4. 打开数据库
RMAN> ALTER DATABASE OPEN;

单数据文件恢复(数据库保持 open):

# 数据文件 5 损坏
RMAN> SQL 'ALTER DATABASE DATAFILE 5 OFFLINE';

RMAN> RESTORE DATAFILE 5;
RMAN> RECOVER DATAFILE 5;

RMAN> SQL 'ALTER DATABASE DATAFILE 5 ONLINE';

6.2 不完全恢复(时间点恢复)

场景:误操作(如误删表),需要恢复到错误发生前的时间点。

基于时间点恢复

rman target /

RMAN> SHUTDOWN IMMEDIATE;
RMAN> STARTUP MOUNT;

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

RMAN> ALTER DATABASE OPEN RESETLOGS;

基于 SCN 恢复

RMAN> RUN {
    SET UNTIL SCN 1234567890;
    RESTORE DATABASE;
    RECOVER DATABASE;
}
RMAN> ALTER DATABASE OPEN RESETLOGS;

基于 Sequence 恢复

RMAN> RUN {
    SET UNTIL SEQUENCE 1234 THREAD 1;
    RESTORE DATABASE;
    RECOVER DATABASE;
}
RMAN> ALTER DATABASE OPEN RESETLOGS;

关键点

  • 不完全恢复后必须 OPEN RESETLOGS,会创建新的 incarnation
  • 必须先备份当前数据库(resetlogs 后的旧备份不能再用于恢复)
  • 归档日志可能被覆盖(resetlogs 后旧 redo 失效)

6.3 表空间时间点恢复(TSPITR)

场景:误删了某个表空间的数据,但不影响其他表空间。

# 1. 配置辅助实例(auxiliary)
RMAN> CONFIGURE AUXNAME FOR DATAFILE 1 TO '/u01/aux/system01.dbf';
RMAN> CONFIGURE AUXNAME FOR DATAFILE 3 TO '/u01/aux/sysaux01.dbf';
RMAN> CONFIGURE AUXNAME FOR DATAFILE 4 TO '/u01/aux/undotbs01.dbf';

# 2. 执行 TSPITR
RMAN> RECOVER TABLESPACE users
      UNTIL TIME "TO_DATE('2026-07-21 14:00:00', 'YYYY-MM-DD HH24:MI:SS')"
      AUXILIARY DESTINATION '/u01/aux';

# 3. 备份恢复后的表空间
RMAN> BACKUP TABLESPACE users;

6.4 表级恢复

场景:误删表、误 truncate 表(12c+ 特性)。

# 恢复被 drop 的表
RMAN> RECOVER TABLE scott.emp
      UNTIL TIME "TO_DATE('2026-07-21 14:00:00', 'YYYY-MM-DD HH24:MI:SS')"
      AUXILIARY DESTINATION '/u01/aux'
      REMAP TABLE scott.emp:scott.emp_recovered;

# 恢复被 truncate 的表
RMAN> RECOVER TABLE scott.emp
      UNTIL TIME "TO_DATE('2026-07-21 14:00:00', 'YYYY-MM-DD HH24:MI:SS')"
      AUXILIARY DESTINATION '/u01/aux'
      REMAP TABLE scott.emp:scott.emp_recovered;

6.5 块介质恢复

场景:少数数据块损坏(ORA-01578),无需还原整个数据文件[3]。

# 单块恢复
RMAN> BLOCKRECOVER DATAFILE 5 BLOCK 1234;

# 多块恢复
RMAN> BLOCKRECOVER DATAFILE 5 BLOCK 1234, 1235, 1236;

# 从特定备份恢复
RMAN> BLOCKRECOVER DATAFILE 5 BLOCK 1234
      FROM BACKUPSET 123;

# 恢复所有损坏块(先用 VALIDATE 找出损坏块)
RMAN> VALIDATE DATABASE;
-- 查询 v$database_block_corruption
RMAN> BLOCKRECOVER CORRUPTION LIST;

性能对比[3]:

方式37 个坏块恢复耗时
还原整个 800 GB 数据文件约 3 小时
BLOCKRECOVER8 分钟

6.6 控制文件丢失恢复

场景:所有控制文件副本都丢失。

# 1. 从自动备份恢复控制文件
RMAN> STARTUP NOMOUNT;
RMAN> SET DBID 1234567890;  -- 已知 DBID
RMAN> RESTORE CONTROLFILE FROM AUTOBACKUP;

# 2. Mount 数据库
RMAN> ALTER DATABASE MOUNT;

# 3. 恢复数据库
RMAN> RECOVER DATABASE;

# 4. 打开数据库(必须 resetlogs)
RMAN> ALTER DATABASE OPEN RESETLOGS;

# 5. 立即做全备(resetlogs 后旧备份失效)
RMAN> BACKUP DATABASE PLUS ARCHIVELOG;

如果不知道 DBID

# 在自动备份目录列出文件(文件名格式:c-DBID-YYYYMMDD-SEQ)
ls -l /u01/backup/c-*

# 假设看到文件 c-1234567890-20260721-0c
# 则 DBID = 1234567890

# 或者从 catalog 中查询
RMAN> LIST DB_UNIQUE_NAME ALL;

6.7 Resetlogs 后恢复

场景:resetlogs 后发现还需要旧 incarnation 的备份恢复。

# 1. 列出所有 incarnation
RMAN> LIST INCARNATION;

# 2. 重置到旧 incarnation
RMAN> RESET DATABASE TO INCARNATION 2;

# 3. 在旧 incarnation 上下文中恢复
RMAN> STARTUP MOUNT;
RMAN> RESTORE DATABASE;
RMAN> RECOVER DATABASE;
RMAN> ALTER DATABASE OPEN RESETLOGS;

7. Block Change Tracking 加速增量备份

作用:通过 BCT 文件记录数据块变更,大幅加速增量备份[3]。

-- 启用 BCT
SQL> ALTER DATABASE ENABLE BLOCK CHANGE TRACKING
     USING FILE '/u01/oradata/bct_orcl.ctf';

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

-- 禁用 BCT
SQL> ALTER DATABASE DISABLE BLOCK CHANGE TRACKING;

性能提升

场景无 BCT有 BCT
全备(Level 0)5 小时5 小时(无影响)
增量(Level 1)2 小时15 分钟

原理:CTWR 后台进程将变更块信息写入 BCT 文件,增量备份时直接读取 BCT 而非扫描所有数据块。


8. 备份压缩与加密

8.1 压缩算法

# BASIC(默认,向后兼容)
RMAN> BACKUP AS COMPRESSED BACKUPSET DATABASE;

# LOW / MEDIUM / HIGH(11g+ Advanced Compression Option)
RMAN> CONFIGURE COMPRESSION ALGORITHM 'MEDIUM';
RMAN> BACKUP AS COMPRESSED BACKUPSET DATABASE;
算法压缩比CPU 占用速度
BASIC3-4x
LOW2-3x
MEDIUM4-5x中(推荐)
HIGH6-8x

8.2 加密

透明加密(TDE)

# 配置 keystore(一次性)
SQL> ADMINISTER KEY MANAGEMENT
     CREATE KEYSTORE '/u01/oracle/wallet'
     IDENTIFIED BY ******

SQL> ADMINISTER KEY MANAGEMENT
     SET KEYSTORE OPEN IDENTIFIED BY ******

SQL> ADMINISTER KEY MANAGEMENT
     SET KEY IDENTIFIED BY ******

# 启用透明加密备份
RMAN> CONFIGURE ENCRYPTION FOR DATABASE ON;
RMAN> BACKUP DATABASE;

密码加密

RMAN> SET ENCRYPTION ON IDENTIFIED BY ****** ONLY;
RMAN> BACKUP DATABASE;

# 恢复时
RMAN> SET DECRYPTION ON IDENTIFIED BY ******
RMAN> RESTORE DATABASE;

双模式加密

# 同时使用 TDE 和密码(任一即可解密)
RMAN> SET ENCRYPTION ON IDENTIFIED BY ******
RMAN> BACKUP DATABASE;

9. Recovery Catalog 恢复目录

作用:独立数据库存储多个目标库的备份元数据[3]。

优点

  1. 控制文件丢失时仍能恢复
  2. 集中管理多个库的备份
  3. 存储脚本
  4. 跟踪 resetlogs 前的备份
  5. 保留更长时间的历史

搭建步骤

-- 1. 在 catalog 库创建表空间
SQL> CREATE TABLESPACE rman_ts
     DATAFILE '/u01/oradata/rman_ts01.dbf' SIZE 1G;

-- 2. 创建 rman 用户
SQL> CREATE USER rman IDENTIFIED BY ******
     DEFAULT TABLESPACE rman_ts
     QUOTA UNLIMITED ON rman_ts;

-- 3. 授权
SQL> GRANT RECOVERY_CATALOG_OWNER TO rman;

-- 4. 创建 catalog
$ rman catalog rman/rman_pwd@catdb
RMAN> CREATE CATALOG;

-- 5. 注册目标库
$ rman target / catalog rman/rman_pwd@catdb
RMAN> REGISTER DATABASE;

-- 6. 同步控制文件
RMAN> RESYNC CATALOG;

存储脚本

RMAN> CREATE SCRIPT full_backup {
    BACKUP DATABASE PLUS ARCHIVELOG;
    DELETE OBSOLETE;
}

RMAN> RUN { EXECUTE SCRIPT full_backup; }

10. 备份验证与监控

10.1 验证备份可恢复性

# 验证整个备份集
RMAN> VALIDATE BACKUPSET 123;

# 验证数据库备份(不实际还原)
RMAN> RESTORE DATABASE VALIDATE;

# 验证数据文件
RMAN> RESTORE DATAFILE 5 VALIDATE;

# 验证控制文件
RMAN> RESTORE CONTROLFILE VALIDATE;

# 验证归档日志
RMAN> RESTORE ARCHIVELOG ALL VALIDATE;

# 物理与逻辑校验(检查坏块)
RMAN> VALIDATE DATABASE;
RMAN> VALIDATE CHECK LOGICAL DATABASE;

# 验证特定表
RMAN> VALIDATE TABLE scott.emp;

10.2 查看备份信息

-- 备份概要
RMAN> LIST BACKUP SUMMARY;

-- 详细信息
RMAN> LIST BACKUP;

-- 按文件查看
RMAN> LIST BACKUP BY FILE;

-- 查看过时备份
RMAN> REPORT OBSOLETE;

-- 查看需要的备份
RMAN> REPORT NEED BACKUP;

-- 查看不可恢复的数据文件
RMAN> REPORT UNRECOVERABLE;

-- 查看数据库 incarnation
RMAN> LIST INCARNATION;

10.3 监控视图

-- 备份作业历史
SELECT session_key, start_time, end_time, status, output_bytes/1024/1024/1024 AS "GB"
FROM v$rman_backup_job_details
ORDER BY start_time DESC;

-- 单个备份进程
SELECT sid, serial#, opname, context, sofar, totalwork, time_remaining
FROM v$session_longops
WHERE opname LIKE 'RMAN%'
ORDER BY sid;

-- 备份集信息
SELECT bs_key, type, device_type, completion_time, bytes/1024/1024/1024 AS "GB"
FROM v$backup_set_details
ORDER BY completion_time DESC;

11. 生产备份策略模板

11.1 周备份策略(典型 OLTP)

周日周一周二周三周四周五周六
Level 0Level 1 差异Level 1 差异Level 1 差异Level 1 差异Level 1 差异Level 1 累积

crontab 配置

# 周日 02:00 全备(Level 0)
0 2 * * 0 /u01/scripts/rman_level0.sh

# 周一至周五 02:00 差异增量(Level 1)
0 2 * * 1-5 /u01/scripts/rman_level1_diff.sh

# 周六 02:00 累积增量(Level 1)
0 2 * * 6 /u01/scripts/rman_level1_cum.sh

# 每小时归档日志备份
0 * * * * /u01/scripts/rman_archive.sh

11.2 增量更新备份(Merge Incremental)

将增量备份合并到 Level 0 镜像副本,使镜像副本始终接近最新状态:

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

优势

  • 恢复时直接用镜像副本,跳过 restore
  • 恢复速度接近瞬时

11.3 异地备份

# 备份后上传到 S3/OSS
aws s3 sync /u01/backup/rman/ s3://my-bucket/oracle-backup/$(date +%Y%m%d)/

# 或备份到磁带
RMAN> BACKUP DEVICE TYPE SBT DATABASE;

12. 常见坑与排错

坑 1:归档目录满导致数据库 hang

现象:alert log 报 ORA-00257: archiver error,所有 DML 阻塞。

解决

# 1. 检查归档目录空间
df -h /archivelog

# 2. 紧急清理已备份的归档
rman target /
RMAN> CROSSCHECK ARCHIVELOG ALL;
RMAN> DELETE NOPROMPT EXPIRED ARCHIVELOG ALL;
RMAN> DELETE NOPROMPT ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-3';

# 3. 增加 ARCH 进程数
SQL> ALTER SYSTEM SET log_archive_max_processes = 8;

坑 2:备份失败但未删除旧备份

现象:FRA 空间满,新备份无法执行。

解决

# 1. 查看占用 FRA 的内容
SELECT file_type, percent_space_used, percent_space_reclaimable
FROM v$flash_recovery_area_usage;

# 2. 删除过时备份
RMAN> DELETE NOPROMPT OBSOLETE;

# 3. 增大 FRA
SQL> ALTER SYSTEM SET db_recovery_file_dest_size = 200G;

坑 3:resetlogs 后旧备份失效

现象:resetlogs 后想用旧备份恢复,报错。

解决

# 1. 列出 incarnation
RMAN> LIST INCARNATION;

# 2. 重置到旧 incarnation
RMAN> RESET DATABASE TO INCARNATION 1;

# 3. 在旧 incarnation 中恢复
RMAN> SHUTDOWN IMMEDIATE;
RMAN> STARTUP MOUNT;
RMAN> RESTORE DATABASE;
RMAN> RECOVER DATABASE;
RMAN> ALTER DATABASE OPEN RESETLOGS;

坑 4:备份片损坏

现象:恢复时报 ORA-19608: backup piece not found

解决

# 1. Crosscheck 标记为 expired
RMAN> CROSSCHECK BACKUP;
RMAN> DELETE NOPROMPT EXPIRED BACKUP;

# 2. 使用其他备份
RMAN> RESTORE DATABASE;

坑 5:控制文件丢失且无自动备份

现象:所有控制文件丢失,未启用 CONTROLFILE AUTOBACKUP

解决(最后手段):

# 1. 用 CREATE CONTROLFILE 重建
SQL> STARTUP NOMOUNT;

CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
    GROUP 1 '/u01/oradata/redo01.log' SIZE 200M,
    GROUP 2 '/u01/oradata/redo02.log' SIZE 200M,
    GROUP 3 '/u01/oradata/redo03.log' SIZE 200M
DATAFILE
    '/u01/oradata/system01.dbf',
    '/u01/oradata/sysaux01.dbf',
    '/u01/oradata/undotbs01.dbf',
    '/u01/oradata/users01.dbf'
CHARACTER SET AL32UTF8;

# 2. 恢复数据库
RMAN> RECOVER DATABASE;
RMAN> ALTER DATABASE OPEN;

最佳实践总结

  1. 生产环境必须启用归档模式
  2. 启用 CONTROLFILE AUTOBACKUP ON
  3. 启用 Block Change Tracking,加速增量备份
  4. 使用 Recovery Catalog,避免控制文件丢失导致备份信息丢失
  5. 定期验证备份VALIDATE DATABASE),别等恢复时才发现备份坏
  6. 定期演练恢复,至少每季度一次
  7. 备份到多种介质(磁盘 + 磁带 / 对象存储)
  8. 保留策略:恢复窗口 7 天 + 异地保留 90 天
  9. 压缩 + 加密:减小体积 + 保护敏感数据
  10. 监控备份作业:通过 OEM 或自定义脚本,失败立即告警

13. 参考资料

[1] Oracle Database Backup and Recovery User’s Guide 19c: https://docs.oracle.com/en/database/oracle/oracle-database/19/bradv/

[2] Oracle Database 19c RMAN Reference: https://docs.oracle.com/en/database/oracle/oracle-database/19/rcmrf/

[3] yingyifeng306,《Oracle RMAN 备份恢复实战——增量备份、块恢复与验证体系》: https://blog.itpub.net/23732248/viewspace-3117097/

[4] JiekeXu,《Oracle 19c 每天定时备份方案:RMAN + 数据泵》,墨天轮: https://www.modb.pro/db/2046534041642557440

[5] 杨磊,《Oracle 之 rman 备份和恢复的相关命令备记》,墨天轮: https://www.modb.pro/doc/143767

[6] Oracle Support Doc ID 243760.1,《RMAN: RAC Backup, Restore and Recovery using RMAN》: https://support.oracle.com/knowledge/Oracle%20Database%20Products/243760_1.html

[7] Oracle Cloud 文档,使用 RMAN 创建源数据库备份: https://docs.oracle.com/zh-cn/solutions/migrate-database-with-rman/create-backup-source-database1.html


相关文章