Oracle RMAN 备份恢复全流程
Oracle RMAN 备份恢复全流程
适用版本:Oracle Database 19c / 23ai 阅读基础:了解归档模式、控制文件、redo log 文档版本:v1.0 / 2026-07
目录
- 1. 概述:为什么 RMAN 是 Oracle 备份的事实标准
- 2. RMAN 核心概念与组件
- 3. RMAN 备份类型
- 4. RMAN 配置与最佳实践
- 5. RMAN 备份完整流程
- 6. RMAN 恢复完整流程
- 7. Block Change Tracking 加速增量备份
- 8. 备份压缩与加密
- 9. Recovery Catalog 恢复目录
- 10. 备份验证与监控
- 11. 生产备份策略模板
- 12. 常见坑与排错
- 13. 参考资料
1. 概述:为什么 RMAN 是 Oracle 备份的事实标准
Recovery Manager(RMAN)是 Oracle 提供的备份恢复工具,自 Oracle 8i 引入,已成为 Oracle 数据库备份恢复的事实标准[1]。
RMAN 相对传统备份方式的优势:
| 特性 | RMAN | OS 拷贝 / 用户管理备份 |
|---|---|---|
| 备份粒度 | 数据块级别 | 文件级别 |
| 增量备份 | 支持块级增量 | 不支持 |
| 备份验证 | 内置 VALIDATE | 需额外脚本 |
| 损坏块检测 | 自动跳过损坏块 | 可能备份到损坏块 |
| Oracle 集成 | 深度集成 | 有限 |
| 恢复速度 | 通常更快 | 较慢 |
| 压缩加密 | 多种算法 | 依赖外部工具 |
| 在线备份 | 完全支持 | 需 begin backup 模式 |
| 备份元数据 | 控制文件 + Catalog | 手动维护 |
RMAN 的核心价值:
- 块级增量:只备份自上次备份以来变更的数据块,大幅减少备份量
- WAL 协同:自动与 redo log / 归档日志配合,支持时间点恢复
- 损坏检测:备份时自动跳过损坏块,避免”备份了不可用的数据”
- 集中管理:通过 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 | 被备份的数据库 |
| Channel | RMAN 与存储设备的 I/O 通道,可以是 DISK 或 SBT_TAPE |
| Backup Set | 备份集,逻辑单元,包含一个或多个数据文件 |
| Backup Piece | 备份片,备份集的物理文件 |
| Image Copy | 镜像副本,与原文件 1:1 的拷贝 |
| Incarnation | 数据库的”化身”,每次 resetlogs 后产生新 incarnation |
| Snapshot Control File | RMAN 备份时的控制文件快照 |
| 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 Set | Image 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 | 日期 YYYYMMDD | 20260721 |
%U | 唯一 ID | 07so2v2k_1_1 |
%F | 控制文件自动备份格式 c-DBID-YYYYMMDD-SEQ | c-1234567890-20260721-0 |
%s | 备份集号 | 123 |
%p | 备份片号 | 1 |
%t | 时间戳 | 1234567890 |
%e | 归档日志 sequence | 1234 |
4.3 启用控制文件自动备份
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/u01/backup/cf_%F';
为什么必须启用:
- 控制文件丢失时,可从自动备份恢复
- 自动备份包含 SPFILE,可一起恢复
- 文件名格式固定(
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 小时 |
| BLOCKRECOVER | 8 分钟 |
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 占用 | 速度 |
|---|---|---|---|
| BASIC | 3-4x | 中 | 中 |
| LOW | 2-3x | 低 | 快 |
| MEDIUM | 4-5x | 中 | 中(推荐) |
| HIGH | 6-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]。
优点:
- 控制文件丢失时仍能恢复
- 集中管理多个库的备份
- 存储脚本
- 跟踪 resetlogs 前的备份
- 保留更长时间的历史
搭建步骤:
-- 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 0 | Level 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;
最佳实践总结
- 生产环境必须启用归档模式
- 启用
CONTROLFILE AUTOBACKUP ON - 启用 Block Change Tracking,加速增量备份
- 使用 Recovery Catalog,避免控制文件丢失导致备份信息丢失
- 定期验证备份(
VALIDATE DATABASE),别等恢复时才发现备份坏 - 定期演练恢复,至少每季度一次
- 备份到多种介质(磁盘 + 磁带 / 对象存储)
- 保留策略:恢复窗口 7 天 + 异地保留 90 天
- 压缩 + 加密:减小体积 + 保护敏感数据
- 监控备份作业:通过 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
相关文章