DBAtlas · 数据库运维图谱

使用 RMAN 进行还原和恢复

Oracle难度: 高级耗时: 30 分钟 – 数小时(取决于数据库大小)

故障发生时逐步引导完成正确的 RMAN 恢复:19 个场景——数据文件、SYSTEM/UNDO、临时文件、坏块、联机重做日志、控制文件和 spfile 丢失;完全还原、还原到其他目录/ASM 以及还原到其他服务器;时间点恢复(CDB 或 PDB PITR)、Flashback Database、表空间 PITR、单表恢复(RECOVER TABLE)、已删除的 PDB;通过 Data Guard 经网络还原(FROM SERVICE)、仅还原归档日志、登记已移动的备份(CATALOG)以及不写入数据的演练(PREVIEW/VALIDATE)。每个场景按 诊断 → 安全网 → 执行 → 验证 → 新备份 的顺序进行;为单实例、Oracle Restart 和 RAC(以 CLUSTER_DATABASE=FALSE 在单实例上恢复)分别给出步骤。本指南讲恢复而非备份;备份方案见“Oracle 备份策略”指南。

架构: 1 台服务器(单实例或 Oracle Restart)或 RAC;新主机场景需要源 + 目标

场景

  • 演练:RESTORE … PREVIEW / VALIDATE(不做任何更改) — 没有任何损坏;您想在不写入数据的情况下确认备份确实足以完成恢复(数据库保持打开)。这也是每月还原演练以及不确定该选哪个场景时的第一步。
  • 备份已移到其他目录 / RMAN 找不到备份(CATALOG) — 备份片存在,但 RMAN 不知道(已移动、NFS 已更改、来自其他服务器):出现 RMAN-06023/06025。数据库保持打开。
  • 仅还原归档日志(RESTORE ARCHIVELOG) — LogMiner、备库间隔或手动恢复需要把特定序列号范围的归档日志放回磁盘;数据库保持打开,不覆盖任何文件。
  • 单个数据文件或表空间丢失/损坏(数据库保持打开) — 数据库已打开,只有一个数据文件或表空间无法读取(ORA-01157/01110/01116);其他一切正常。如果文件属于 SYSTEM/UNDO,选择“SYSTEM 或 UNDO”卡片;如果是临时文件,选择“临时文件”卡片;如果文件能打开但有几个块损坏(ORA-01578),选择“坏块”卡片。
  • 存在坏块(ORA-01578,块介质恢复) — 查询报 ORA-01578/ORA-26040,备份因 ORA-19566 中止,或 VALIDATE 发现了坏块;文件其余部分完好。数据库保持打开,只修复坏块(Enterprise Edition;SE2 上需还原整个文件)。如果整个文件都无法打开(ORA-01157),选择“单个数据文件”卡片。
  • SYSTEM 或 UNDO 数据文件丢失(数据库无法打开) — 丢失或损坏的文件属于 SYSTEM 或 UNDO 表空间:无法脱机,数据库(如果是 PDB 的文件则仅该 PDB)需关闭并在 MOUNT 状态下还原。不会丢失数据。如果是其他表空间的文件,“单个数据文件”卡片可在不关闭数据库的情况下解决。
  • 临时文件丢失或损坏(TEMP 表空间) — 排序/哈希操作报 ORA-01157/ORA-01187/ORA-25153,且该文件是临时文件(错误消息中的编号大于 db_files 值,例如 data file 201)。无需还原;添加新的临时文件即可,数据库保持打开。
  • 联机重做日志丢失或损坏 — 告警日志中出现 ORA-00313/00312(无法打开)或 ORA-00327/00366/00367(损坏)。如果只丢失一个成员或该组为 INACTIVE,数据库保持打开;如果丢失的是 CURRENT 组,则需要还原 + RESETLOGS,最近的事务会丢失。诊断步骤会显示组的状态;据此做出选择。
  • 所有控制文件副本均丢失 — 实例在 MOUNT 阶段找不到或无法读取控制文件(ORA-00205/00202/00210);数据文件和重做日志完好。如果有一个副本完好则无需还原(诊断步骤会显示);如果全部丢失,则从 autobackup 还原并以 RESETLOGS 打开,由于联机重做日志完好,不会丢失数据。
  • spfile 丢失 — spfile 被删除或损坏;实例无法启动(ORA-01078/LRM-00109),或实例已打开但文件不存在。不涉及数据文件,不会丢失数据;如果实例仍在运行,也不会停机。
  • 完全还原,同一服务器(数据文件丢失;控制文件和重做日志完好) — 全部或大部分数据文件丢失,控制文件和联机重做日志完好;数据库需关闭,不会丢失数据。如果文件原来所在的磁盘/目录已不可用,选择“其他目录”卡片;如果控制文件也丢失,先选择“控制文件”卡片;如果服务器完全不可用,选择“还原到其他服务器”卡片。
  • 磁盘损坏:将数据库还原到其他目录 / ASM(SET NEWNAME) — 数据文件所在的磁盘或磁盘组不可用;控制文件和重做日志完好。文件还原到新目录或 ASM 磁盘组,数据库需关闭,不会丢失数据。
  • 恢复到某个时间 / SCN(PITR,RESETLOGS) — 错误的 DELETE/UPDATE/TRUNCATE 或有问题的应用版本:将数据库(或仅 PDB)恢复到过去的某个时刻;该时刻之后的所有更改都会丢失(RESETLOGS)。先考虑范围更小的方法:单表 → “单表恢复”,单个表空间 → TSPITR,已开启闪回 → “Flashback Database”(不需要还原,快得多)。
  • 使用 Flashback Database 回退(还原点 / SCN / 时间) — 已开启闪回或存在担保还原点,且没有丢失任何文件:无需还原,几分钟内即可回退(Enterprise Edition)。需要 RESETLOGS。检查是否开启:SELECT flashback_on FROM v$database; → YES,或 v$restore_point 中有 GUARANTEE_FLASHBACK_DATABASE = YES 的行。
  • 将一个表空间恢复到过去的某个时刻(TSPITR) — 错误操作只影响了一个表空间中的对象;数据库其余部分必须保持在当前时刻(Enterprise Edition)。操作期间该表空间处于脱机状态,其中所有对象都回到目标时刻;如果只影响了一两张表,“单表恢复”回退的内容更少。
  • 单表恢复(RECOVER TABLE,12c+ Enterprise Edition) — 某张表被误删或损坏;数据库其余部分必须保持原样(12c+ Enterprise Edition)。如果是 DROP 且未 PURGE,先查看回收站:FLASHBACK TABLE … TO BEFORE DROP 只需几秒(诊断步骤会显示)。
  • 恢复已删除的 PDB(DROP PLUGGABLE DATABASE) — 某个 PDB 被 DROP PLUGGABLE DATABASE 删除。如果文件仍在,则用 XML 重新插入;如果文件已删除,则从备份恢复(21c+ 一条命令,19c 通过临时 CDB)。CDB 保持打开。
  • 还原到其他服务器(新主机,从控制文件 autobackup) — 服务器完全不可用,或要搭建副本/测试环境:将备份还原到另一台服务器(仅限单实例、文件系统)。恢复到最后一个已备份的归档日志,之后的内容会丢失;副本以 RESETLOGS 打开。
  • Data Guard:通过网络从备库/主库获取文件(FROM SERVICE) — 已部署 Data Guard:无需备份片,即可从备库获取主库上丢失的数据文件,或从主库前滚落后的备库、获取丢失的备库控制文件(12c+)。

开始之前

  • 事件已记录并已通知应用团队:何时、发生了什么、哪条错误消息。开始恢复前,如果可以,已对当前状态做了副本(服务器/磁盘快照,或至少复制剩余的数据文件、控制文件和联机重做日志);错误的步骤可能让情况更糟。
  • 备份可访问:…… 以及存放归档日志的 FRA …… 已挂载且可读。如果备份在磁带/MML 上,SBT 通道和软件代理正在运行。
  • 已知 DBID(…)。如果不知道:旧 RMAN 日志中的 connected to target database: … (DBID=…) 行…,或 autobackup 文件名(…_cf_c-<DBID>-<YYYYMMDD>-<nn>)…。
  • auxiliary 目录 … 已存在,空闲空间不少于 SYSTEM + SYSAUX + UNDO + 该表所在表空间;服务器上有约 2 GB 空闲内存供临时实例使用。
  • …RECOVER TABLE(“Recovering tables and table partitions from RMAN backups”)是 Enterprise Edition 功能。…Standard Edition 2 没有 RECOVER TABLE:不按下面的步骤,而是将备份还原到另一台服务器(“还原到其他服务器” + PITR),再用 Data Pump 导出该表。…
  • 目标服务器上已仅安装软件,Oracle 版本和 RU 级别相同(两端 opatch lspatches 一致),oracle 用户/组和目录结构与源端相同,磁盘空间充足。目标上没有同名的运行中数据库。
  • 维护/停机窗口已批准…(此场景中数据库保持打开;只影响相关对象)…。备份调度(cron/systemd/scheduler)已停止,直到恢复结束;否则备份或 DELETE OBSOLETE 可能在操作进行到一半时运行。
  • 已了解 Clusterware 中的注册信息:spfile 和口令文件的位置、…实例和节点…数据库的状态…(srvctl config database -db …)。恢复前保存此输出。
  • …Block media recovery…Tablespace point-in-time recovery…Flashback Database… 是 Enterprise Edition 功能;在 Standard Edition 2 上命令无法运行。此场景的 SE2 路径在步骤中单独给出。
  • …………… 目录中有足够容纳临时(auxiliary)实例 SYSTEM + SYSAUX + UNDO… + …… + PDB… 的空闲空间,服务器上的空闲内存至少等于目标库的 sga_target(RMAN 默认给临时实例分配相同的 SGA)。
  • Data Guard 已就绪:两端的口令文件相同(SYS 或 SYSBACKUP 口令相同),本服务器的 tnsnames.ora 中有 … 和 … 条目,COMPATIBLE ≥ 12.0。FROM SERVICE 不支持操作系统认证(rman target /);RMAN 需用口令连接。
  • 已为 Flashback Database 配置 FRA,并且已开启闪回日志(FLASHBACK_ON = YES)或目标时刻是一个担保还原点。没有任何数据文件丢失/损坏(闪回无法找回丢失的文件),目标时刻之后没有收缩(shrink)数据文件,也没有重建控制文件。

指南阶段

  • 状态诊断 — 诊断状态 · 诊断状态 · 检查回收站(如果是 DROP,可能不需要备份) · 确定目标时刻
  • 所需备份是否存在? — 以 MOUNT 模式启动实例 · 以 MOUNT 模式启动实例(srvctl) · 列出备份 · 查找 autobackup 文件 · 预览恢复(PREVIEW) · 读取并验证备份片(VALIDATE) …
  • 数据文件 / 表空间恢复(联机) — 将 … 脱机 · 还原并恢复 … · 将 … 联机
  • 完全还原(同一服务器) — 还原、恢复并打开数据库 · …恢复集群模式并通过 Clusterware 启动数据库…通过 Clusterware(Oracle Restart)重启数据库…
  • 恢复到某个时间 / SCN(PITR) — 恢复前备份当前状态 · 将数据库以单实例 MOUNT(srvctl) · 将… PDB …数据库…恢复到目标时刻 · …恢复集群模式并通过 Clusterware 启动数据库…通过 Clusterware(Oracle Restart)重启数据库…
  • 单表恢复(RECOVER TABLE) — 准备 auxiliary 目录 · 从目标时刻恢复表 · 比对恢复出来的数据
  • 控制文件恢复 — 检查是否还有完好的控制文件副本 · 检查是否还有完好的控制文件副本(ASM) · 以 NOMOUNT 启动实例(srvctl) · 从 autobackup 还原控制文件并打开数据库 · …恢复集群模式并通过 Clusterware 启动数据库…通过 Clusterware(Oracle Restart)重启数据库…
  • spfile 恢复 — 根据内存中的参数重写 spfile · 根据内存中的参数将 spfile 写入 ASM · 从 autobackup 还原 spfile · 从 autobackup 将 spfile 还原到 ASM · 验证实例是否使用 spfile 启动
  • 源服务器:收集信息并传输备份 — 做一次最新备份 · 记录 DBID、autobackup 和目录列表 · 将备份和口令文件复制到目标
  • 目标服务器:还原和恢复 — 创建目录 · 添加 oratab 条目 · 还原 spfile 和控制文件,并 MOUNT · 登记备份片(CATALOG) · 还原,恢复到最后一个归档日志并打开 · 将副本与源库分离(可选)
  • 诊断:RMAN 为什么找不到备份? — 查看备份片的新位置 · 列出 RMAN 已知的备份和缺失项
  • 安全网 — 复制控制文件的当前状态
  • 向 RMAN 登记备份 — 登记新目录中的备份片(CATALOG START WITH) · 清理旧位置的记录
  • 验证:现在能找到备份了吗? — 重新预览恢复 · 按新位置修改备份脚本
  • 诊断:需要哪些归档日志,备份中有没有? — 检查归档日志是否在磁盘上 · 查找归档日志的备份并预览
  • 安全网:目标目录和空间 — 准备还原目录
  • 还原归档日志 — 还原归档日志(RESTORE ARCHIVELOG)
  • 验证与清理 — 列出还原的归档日志 · 完成后删除还原的归档日志
  • 诊断:是坏块吗? — 扫描文件(VALIDATE) · 列出坏块及其所属对象
  • 安全网:是否有完好副本和归档链? — 预览文件的备份和恢复链
  • 修复坏块 — 从备份修复坏块(RECOVER CORRUPTION LIST) · Standard Edition 2:还原数据文件 · 修复 NOLOGGING 块(如有)
  • 验证:块完好了吗? — 重新扫描文件 · 查找根本原因:磁盘和存储错误
  • 诊断:文件是 SYSTEM 还是 UNDO? — 以 MOUNT 模式启动实例 · 以 MOUNT 模式启动实例(srvctl) · 确认文件属于 SYSTEM 或 UNDO · 预览并验证所需备份
  • 安全网 — 复制控制文件的当前状态
  • 还原 SYSTEM / UNDO 数据文件 — 关闭 PDB · 还原、恢复并打开数据文件 · …恢复集群模式并通过 Clusterware 启动数据库…通过 Clusterware(Oracle Restart)重启数据库…
  • 诊断:丢失的文件是临时文件吗? — 查看临时文件及其状态 · 检查文件和告警日志
  • 安全网:空间检查 — 检查新临时文件的空间是否足够
  • 添加新临时文件,删除丢失的临时文件 — 添加新临时文件并删除丢失的临时文件
  • 验证 — 验证临时表空间
  • 诊断:哪个组,处于什么状态? — 查看重做日志组的状态
按您的环境打开分步计划 →