Oracle RMAN备份和恢复基本操作指南

 更新时间:2026年08月31日 09:48:49   作者:数据库路上  
本文详细总结了RMAN的配置、全库备份、增量备份、加密备份以及各种故障恢复场景,从单文件丢失到全库崩溃都能应对,助你快速掌握RMAN核心操作,保障数据安全,需要的朋友可以参考下

前提说明:

1)一般情况下,rman备份,数据库必须开启归档模式

2)rman备份文件始终写入目标库服务器端,而不是执行 RMAN 命令的客户端机器上。(用机器B rman 机器A,备份文件也能存储在机器A上的,不会再机器B上)

一、RMAN 基本配置与备份操作

0.rman登录

#只能sysdba权限用户登录
#操作系统认证登录
rman target /
#用户名密码和连接串方式
rman target sys/oracle@orcl

1.查看当前所有 RMAN 配置

show all

作用:显示目标数据库当前所有的 RMAN 配置参数(如保留策略、并行度、备份优化等)。

2. 清除某个配置(恢复默认值)

CONFIGURE RETENTION POLICY CLEAR;

作用:将保留策略恢复为默认值(默认是 REDUNDANCY 1)。

3. 列出备份信息

list backup summary;   # 概要列表
list backup;           # 详细列表
report schema;         # 报告当前数据库的表空间和数据文件结构
RESTORE DATABASE PREVIEW SUMMARY;   # 预览恢复数据库所需备份集,不实际执行

作用:查看现有备份的概况/详细信息;report schema 显示数据文件布局;RESTORE ... PREVIEW 用于估算恢复所需的空间和时间。

4. 执行备份

backup database plus archivelog;     # 备份全库并包括归档日志(定制选项丰富)

作用:生成全库备份,并在备份前自动归档当前在线日志,备份完成后删除已备份的归档日志(取决于配置)。

5. 带 SECTION SIZE 的备份(并行片备份)

backup section size 50m tablespace pdbprod1:sysaux keep forever 
format '/u01/app/oracle/flash_recovery_area/PRODCDB/%d_%t_%U.bak';

作用

  • section size 50m:将表空间 sysaux(属于PDB pdbprod1)分成多个 50MB 的片,实现多通道并行备份,加快大文件备份速度。
  • keep forever:将备份标记为永久保留(不受保留策略影响)。
  • format:指定备份片名称格式,%d 为数据库名,%t 为备份时间戳,%U 为唯一标识符。

6. 配置磁盘并行度

CONFIGURE DEVICE TYPE DISK PARALLELISM 4 BACKUP TYPE TO BACKUPSET;

作用:设置磁盘设备的并行度为 4,即最多同时启动 4 个通道来执行备份,备份类型为备份集(BACKUPSET)。
备注:并行度不等于通道数,但会影响通道分配。

7. 备份数据库并包含归档日志,使用片大小

backup section size 500m database plus archivelog;

作用:将全库分成 500MB 的片并行备份,并同时备份归档日志。

8. 备份优化配置

CONFIGURE BACKUP OPTIMIZATION OFF;   # 改为 ON 开启
CONFIGURE ARCHIVELOG DELETION POLICY TO applied on all standby;   # 归档删除策略:应用于所有备库后才可删除
CONFIGURE ARCHIVELOG DELETION POLICY TO shipped to all standby;   # 归档删除策略:传输到所有备库后才可删除

作用

  • 当开启备份优化后,RMAN 在执行备份时会跳过那些已经备份过且自上次备份以来没有发生任何更改的文件,避免重复备份相同内容。例如重复的归档文件不会多次备份
  • 归档删除策略:控制归档日志何时允许被自动删除(备库已应用或已传输)。 两次设置归档删除策略(appliedshipped),后者会覆盖前者,最终生效的是最后一条。

9. 创建带标签的备份并永久保留

backup as backupset database tag "test";
change backup tag "test" keep forever;

作用

  • 对全库创建备份集并打上标签 test
  • 使用 CHANGE ... KEEP FOREVER 将该标签对应的备份标记为永久保留,不受保留策略影响。

10. 删除过期、过时的备份

REPORT OBSOLETE;   # 报告所有过时的备份(根据保留策略)
DELETE OBSOLETE;   # 删除所有过时的备份

REPORT OBSOLETE RECOVERY WINDOW OF 7 DAYS;   # 报告在 7 天恢复窗口内不再需要的备份
DELETE OBSOLETE RECOVERY WINDOW OF 7 DAYS;   # 删除那些备份

REPORT OBSOLETE REDUNDANCY = 2 DEVICE TYPE DISK;   # 报告磁盘上冗余度大于 2 的过时备份(即多余副本)
DELETE OBSOLETE REDUNDANCY = 2 DEVICE TYPE DISK;   # 删除冗余度大于 2 的磁盘备份

REPORT UNRECOVERABLE DATABASE;   # 报告数据库中哪些数据文件无法恢复(缺少备份或归档)
REPORT UNRECOVERABLE TABLESPACE 'USERS';   # 报告指定表空间是否不可恢复
REPORT NEED BACKUP;   # 报告需要备份的数据文件(基于备份策略,如增量阈值)

作用:删除所有已过期的备份(根据保留策略判定),noprompt 表示不询问确认。

11.常用rman语句

crosscheck backup;
交叉核对(校验)所有备份集。RMAN 会检查控制文件或恢复目录中记录的备份信息,并与磁盘或磁带上的实际物理文件进行比对。如果物理文件存在,状态保持为 AVAILABLE;如果物理文件丢失或被外部命令(如 rm)删除,RMAN 会将其状态标记为 EXPIRED(过期/无效)。此命令本身不会删除任何文件

delete noprompt  expired backup;
它不会删除实际的物理文件,而是清理 RMAN 资料库(控制文件或恢复目录)中那些因为物理文件丢失而被标记为 EXPIRED 的元数据记录。noprompt 参数的作用是抑制交互确认提示,使命令直接执行

CONFIGURE RETENTION POLICY TO REDUNDANCY 2;
告诉 RMAN 必须为每个数据文件保留至少 2 份可用的备份。当备份份数超过 2 份时,最旧的备份将被 RMAN 判定为“过时(Obsolete)”,可以被安全清理

report obsolete;
根据当前配置的保留策略(如上面的 REDUNDANCY 2),列出所有不再需要用于恢复的备份集、数据文件副本和归档日志。这是一个只读操作,仅用于预览,不会删除任何文件

delete noprompt obsolete;
根据当前的保留策略,删除那些被判定为不再需要的备份物理文件,同时更新控制文件或恢复目录中的记录。配合 noprompt 参数,常用于自动化备份脚本中

delete archivelog all;
RMAN 会尝试删除当前资料库中记录的所有归档日志物理文件,并在删除前弹出交互提示,要求用户手动输入 YES 或 NO 进行确认。

delete noprompt archivelog all;
与上一条命令功能相同,但增加了 noprompt 参数,跳过了交互确认步骤,直接执行删除。

delete noprompt  archivelog all completed before 'sysdate-3';
根据归档日志的完成时间(completion_time)进行过滤,仅删除 3 天前的归档日志。需要注意的是,如果当前环境配置了 Data Guard(备库),且备库尚未应用这些归档日志,或者存在保留策略的限制,该命令可能会受到限制而无法删除

delete noprompt FORCE archivelog all completed before 'sysdate-3';
在上一条命令的基础上增加了 FORCE 关键字。即使当前的归档删除策略(Archivelog Deletion Policy)或 Data Guard 环境限制了这些日志的删除(例如备库尚未应用),RMAN 也会强制忽略这些限制并执行删除操作,使用 FORCE 参数需要非常谨慎。如果强制删除了尚未被备库应用(Applied)或尚未被备份的归档日志,可能会导致数据库无法进行完整的时间点恢复(Point-in-Time Recovery),或者导致主备库同步断裂

12.RMAN备份作业检查语句

--通过查询v$rman_backup_job_details视图,查询最近7天的rman备份作业执行情况
set linesize 200 pagesize 999
col input_bytes_display format a10
col output_bytes_display format a10
col time_taken_display format a10
select to_char(start_time,'yyyymmdd hh24:mi:ss') time,trunc(elapsed_seconds/60) duration_min,input_type,status,input_bytes_display,output_bytes_display,time_taken_display  
from v$rman_backup_job_details
where start_time>trunc(sysdate)-7 
order by time; 

二、块跟踪(Block Change Tracking)

1. 启用块跟踪

alter database enable block change tracking using file '/u01/app/oracle/aa.trc';

作用:在 CDB 级别启用块跟踪,跟踪自上次备份以来更改的数据块,用于加速增量备份。

2. 禁用块跟踪

alter database disable block change tracking;

作用:关闭块跟踪功能。

3. 查看块跟踪状态

select * from v$block_change_tracking;

作用:查询块跟踪文件的位置、状态等信息。

4. 错误示例(在 PDB 中执行失败)

SQL> alter database enable block change tracking ... 
ERROR at line 1:
ORA-65040: operation not allowed from within a pluggable database

说明:块跟踪只能在 CDB 根容器(CDB$ROOT)中启用,不能在 PDB 内执行。

三、增量备份、压缩备份、加密备份与删除

1. 增量备份(级别 0,1,2)

backup incremental level 0 database;
backup incremental level 1 database;
backup incremental level 2 database;

作用

  • level 0:全量备份,作为增量基础。
  • level 1:差异增量(默认),备份自上次 level 0 或 level 1 以来更改的块。
  • level 2:累积增量(需额外指定)或差异增量,实际使用中较少。

2. 压缩备份

backup as compressed backupset database plus archivelog;

作用:以压缩格式创建备份集,节省存储空间,但会增加 CPU 开销。

3. 创建加密备份

set encryption on identified by 'oracle' only;

作用:在当前 RMAN 会话中开启加密,密码为 oracleonly 表示仅使用密码加密(不依赖钱包)。

4. 解密备份(恢复时)

set decryption identified by 'oracle';

作用:在还原加密备份时,提供解密密码。

四、故障诊断与修复(使用 RMAN 的 Failure 框架)

1. 启动数据库时遇到数据文件缺失

SQL> startup
ORA-01157: cannot identify/lock data file 1 - see DBWR trace file
ORA-01110: data file 1: '/u01/app/oracle/oradata/PRODCDB/system01.dbf'

现象:SYSTEM 表空间的数据文件缺失,数据库无法打开。

2. 使用 RMAN 列出故障

rman target=sys/oracle@prodcdb catalog=rc_admin/oracle@emrep
list failure;

作用:显示数据库检测到的故障列表(如文件丢失、损坏等),包括故障 ID、优先级、状态和摘要。

3. 诊断与修复故障

advise failure;   # 给出修复建议
repair failure;   # 执行修复(根据建议)

作用advise 输出修复脚本(如还原数据文件等);repair 执行修复操作。通常需要先执行 advise 生成的脚本或手动执行。

4. 校验数据库物理结构

validate database;

作用:检查数据库所有数据文件和归档日志的物理完整性,检测坏块,及时发现潜在问题。之后可再次使用 list failure 查看校验发现的故障。

五、数据文件丢失(仅 SYSTEM 文件丢失)恢复示例

关键步骤:

  • 启动到 mount 状态(若控制文件存在)或 nomount(若控制文件也丢失)。
  • 使用 RMAN 还原丢失的数据文件:restore datafile 1;
  • 恢复并应用归档日志:recover datafile 1;
  • 打开数据库:alter database open;

六、完全恢复(所有文件丢失:参数、控制、数据、日志)

场景描述

数据库所有文件被删除(控制文件、数据文件、在线日志、参数文件均丢失),仅剩归档日志和备份(包括自动备份)。

步骤一:创建简易初始化参数文件启动实例

cd $ORACLE_HOME/dbs
vi initPRODCDB.ora
内容:db_name='PRODCDB'

作用:创建一个仅包含 db_name 的文本参数文件(PFILE),以便将实例启动到 NOMOUNT 状态,从而能够连接 RMAN 并恢复 spfile

步骤二:启动实例到 NOMOUNT

sqlplus "/as sysdba"
startup nomount;

作用:读取 PFILE 启动实例,不加载控制文件,不打开数据库。

步骤三:恢复 spfile(从自动备份中)

rman target /
restore spfile from '/u01/app/oracle/flash_recovery_area/PRODCDB/autobackup/2023_12_18/o1_mf_s_1155925484_lr07hf6o_.bkp';

作用:从指定的自动备份文件(AUTOBACKUP)中还原 spfile 到默认位置($ORACLE_HOME/dbs/spfilePRODCDB.ora)。
备注:若实例由 spfile 启动,则不能直接还原覆盖当前 spfile,需要使用 restore spfile to pfile '...' from '...' 方式。

步骤四:关闭实例并用还原的 spfile 重新启动到 NOMOUNT

shutdown immediate; 
startup nomount;

步骤五:恢复控制文件

rman target /
restore controlfile from '/u01/app/oracle/flash_recovery_area/PRODCDB/autobackup/2023_12_18/o1_mf_s_1155925484_lr07hf6o_.bkp';

作用:从自动备份中还原控制文件到默认位置($ORACLE_HOME/oradata/PRODCDB/control01.ctl 等)。

步骤六:挂载数据库

alter database mount;

作用:加载控制文件,使 RMAN 能够访问数据文件和归档日志信息。

步骤七:确定恢复终点(最后一个归档日志序列号)

select max(SEQUENCE#) from v$archived_log;
-- 结果为 34

作用:查询已归档的最大日志序列号,用于设置 UNTIL SEQUENCE。若需完全恢复至最新,应使用 UNTIL SEQUENCE 35(即恢复到序列号 35 之前)。

步骤八:设置解密并执行还原恢复

rman target /
set decryption identified by 'oracle';
run {
  set until sequence 35 thread 1;
  restore database;
  recover database;
  alter database open resetlogs;
}

作用

  • set decryption:提供密码解密之前加密的备份。
  • set until sequence:指定恢复终点为序列号 35(即应用日志到序列号 34 为止)。
  • restore database:还原所有数据文件。
  • recover database:应用归档日志将数据库恢复到指定时间点。
  • alter database open resetlogs:以重置日志方式打开数据库,因为进行了不完全恢复。

七、另一种恢复方式(使用 Catalog 中的 DBID)

步骤一:从 Catalog 获取目标数据库的 DBID

sqlplus rc_admin/oracle@emrep
select dbid from rc_database;
-- 结果为 3153543990

作用:在 Catalog 的 rc_database 表中查询目标数据库的唯一标识符。

步骤二:设置 DBID 并恢复 spfile

rman target /
set dbid 3153543990;
restore spfile from autobackup;

作用set dbid 告诉 RMAN 要恢复哪个数据库的自动备份,因为自动备份文件名不包含 DBID,需要指定以匹配正确的备份。

步骤三:重启实例到 NOMOUNT(如果已启动)

startup nomount force;

作用:强制重启实例至 NOMOUNT 状态,使刚恢复的 spfile 生效。

步骤四:恢复控制文件

restore controlfile from autobackup;

作用:从自动备份中还原控制文件(RMAN 会自动查找最近的自动备份)。

步骤五:恢复数据库并打开 resetlogs

set decryption identified by 'oracle';
run {
  set until sequence 35 thread 1;   # 根据实际需要调整序列号
  restore database;
  recover database;
  alter database open resetlogs;
}

作用:与前面的恢复过程相同,但这里未显式执行 mount,因为 restore controlfile 后 RMAN 会自动挂载(或需手动 alter database mount)。文档省略了挂载步骤,但逻辑上需要。

八、无备份数据文件但有归档日志的恢复

场景

某个数据文件(例如编号 13)丢失,但没有该文件的备份,只有后续的归档日志。恢复步骤如下:

1. 将数据文件脱机

alter database datafile 13 offline;

作用:使该数据文件脱机,允许数据库其余部分继续打开。

2. 新建一个空数据文件(创建占位)

alter database create datafile '/u01/app/oracle/oradata/PRODCDB/PDBPROD1/test01.dbf';

作用:在文件丢失位置创建一个新的空数据文件(仅结构),元数据从控制文件获取。

3. 从归档日志恢复数据

recover datafile 13;

作用:扫描归档日志,将自上次备份以来的所有更改应用到新数据文件上,使其恢复到当前一致性状态。

4. 使数据文件联机

alter database datafile 13 online;

作用:将数据文件重新联机,恢复正常访问。

5. 校验

validate database;

作用:检查整个数据库的物理完整性,确认恢复成功。

九、临时表空间重建

场景:临时表空间损坏或缺失

1. 创建新的临时表空间

create temporary tablespace temp2
tempfile '/u01/app/oracle/oradata/PRODCDB/temp02.dbf'
size 100m autoextend on;

作用:新建一个名为 temp2 的临时表空间,数据文件为 temp02.dbf,初始 100MB,自动扩展。

2. 切换到新临时表空间作为默认

alter database default temporary tablespace temp2;

作用:将数据库的默认临时表空间改为 temp2,所有用户将使用该临时表空间。

3. 删除旧的临时表空间

drop tablespace temp;

作用:删除已损坏或不需要的旧临时表空间(仅当其中无活动会话使用时)。

以上就是Oracle RMAN备份和恢复基本操作指南的详细内容,更多关于Oracle RMAN备份和恢复操作的资料请关注脚本之家其它相关文章!

相关文章

最新评论