RMAN恢复(RECOVER)
两个重要的恢复命令:
RESTORE:按照RMAN存储库的条目从备份文件恢复需要的文件。
RECOVER:使用数据文件和REDO文件进行完全的或者时间点的数据库媒体恢复。
RMAN恢复概要:
1、 首先要确定需要恢复哪些文件,控制文件、参数文件、归档日志文件和数据文件。
2、 选择正确的恢复方式。例如恢复一个单独的表空间或者数据文件,可以在数据库OPEN状态下把需要恢复的表空间或者数据文件OFFLINE,如果需要恢复所有的数据文件,必须关闭数据库然后在数据库MOUNT状态执行RESTORE。
3、 用RESTORE命令从备份恢复丢失的数据库文件的时候,可以把备份数据库文件恢复原始位置或者恢复到一个新的位置(例如原始磁盘损坏),例如我们想把控制文件恢复到新的位置,则必须要修改SPFILE;如果想把数据文件或者REDO文件恢复到其他位置,则必须修改CONTROLFILE。
4、 如果从备份中恢复了数据文件,必须执行RECOVER来执行数据库恢复。
恢复的最终结果就是要让我们可以再次使用数据库。例如丢失了控制文件而从备份执行恢复我们需要RESTART数据库;如果恢复了个别的表空间或者数据文件我们最终需要把恢复的表空间或者数据文件ONLINE。
总之,执行数据库恢复是要根据具体情况来决定我们到底概要执行什么样的操作的。例如仅仅恢复了SPFILE的话,我们不必执行媒体恢复RECOVER操作。如果我们丢失了部分CONTROLFILE,数据库会自动SHUTDOWN,我们可以从有效的CONTROLFILE拷贝覆盖已经损坏的CONTROLFILE,或者修改参数文件中的CONTROL_FILES参数,把已经损坏的控制文件去掉,这样我么就可以再次启动我们的数据库了;如果我们从备份中恢复了CONTROLFILE,尽管我们没有恢复数据文件,我们也必须要执行媒体恢复并且用带有OPEN RESETLOGS参数的方式来OPEN数据库。
数据库的状态和数据文件的位置决定了什么时候该执行恢复,该如何恢复,我们可以按照如下方式来检查是否有数据库文件需要执行媒体恢复。
检查数据库的状态:
SQL>SELECT STATUS FROM V$INSTANCE;
如果数据库处在OPEN状态,我们可以检查哪些数据库文件处于需要恢的的状态:
SQL>COL FILE# FORMAT 999
SQL>COL STATUS FORMAT A7
SQL>COL ERROR FORMAT A10
SQL>COL TABLESPACE_NAME FORMAT A10
SQL>COL NAME FORMAT A30
SQL>SELECT FILE#, STATUS, ERROR, RECOVER, TABLESPACE_NAME, NAME
SQL>FROM V$DATAFILE_HEADER
SQL>WHERE RECOVER = 'YES' OR (RECOVER IS NULL AND ERROR IS NOT NULL);

如果ERROR列不为NULL或者RECOVER列不等于’NO’,检查硬件和操作系统问题;
如果不是以上问题则需要对结果数据进行RESTORE。
如果ERROR列为NULL并且RECOVER列为’YES’,则该文件可以进行恢复。如果我们是做全库恢复,我们只要把结果集中的数据文件进行恢复就可以,如果我们想做基于时间点的恢复,则必须恢复所有的数据文件或者Flashback Database。
我们可以按照以下SQL来查询需要恢复的数据文件和错误:
SELECT FILE#, ERROR, ONLINE, ONLINE_STATUS, CHANGE#, TIME
FROM V$RECOVER_FILE;

我们可以关联V$DATAFILE and V$TABLESPACE两个视图来得到表空间和数据文件的名字:
SELECT r.FILE# AS df#, d.NAME AS df_name, t.NAME AS tbsp_name,
d.STATUS, r.ERROR, r.CHANGE#, r.TIME
FROM V$RECOVER_FILE r, V$DATAFILE d, V$TABLESPACE t
WHERE t.TS# = d.TS#
AND d.FILE# = r.FILE#;

预恢复操作
RESTORE命令支持预操作。我们在执行RESTORE操作之前可以执行RESTORE…PREVIEW来检验一下备份文件是否有效,如下给出几个示例:
RESTORE DATABASE PREVIEW;
RESTORE TABLESPACE users PREVIEW;
RESTORE DATAFILE 3 PREVIEW;
RESTORE ARCHIVELOG FROM LOGSEQ 200 PREVIEW;
RESTORE ARCHIVELOG FROM TIME 'SYSDATE-7' PREVIEW;
RESTORE ARCHIVELOG FROM SCN 234546 PREVIEW;
我们可以利用CHANGE命令来修改给分集的状态,例如:
RMAN> restore datafile 5 preview;
启动 restore 于 19-1月 -07
使用通道 ORA_DISK_1
备份集列表
===================
BS 关键字 类型 LV 大小 设备类型 经过时间 完成时间
------- ---- -- ---------- ----------- ------------ ----------
92 Full 9.09M DISK 00:00:01 19-1月 -07
BP 关键字: 87 状态: AVAILABLE 已压缩: NO 标记: TAG20070119T100745
段名:D:\TEST.BAK
备份集 92 中的数据文件列表
文件 LV 类型 Ckp SCN Ckp 时间 名称
---- -- ---- ---------- ---------- ----
5 Full 963842 19-1月 -07 E:\ORACLE\ORADATA\ROME\TEST.DBF
在资料档案库中未找到 SCN 963842 后生成的归档日志
介质恢复启动 SCN 是 963842
恢复范围必须超出 SCN 963842 才能清除数据文件模糊性
完成 restore 于 19-1月 -07
RMAN> change backupset 92 unavailable;
不能使用更改的备份段
备份段 handle=D:\TEST.BAK recid=87 stamp=612266866
1 对象已更改为 UNAVAILABLE 状态
RMAN> restore datafile 5 preview;
启动 restore 于 19-1月 -07
使用通道 ORA_DISK_1
备份集列表
===================
BS 关键字 类型 LV 大小 设备类型 经过时间 完成时间
------- ---- -- ---------- ----------- ------------ ----------
90 Full 257.89M DISK 00:00:31 16-1月 -07
BP 关键字: 85 状态: AVAILABLE 已压缩: NO 标记: TAG20070116T093035
段名:D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ROME\BACKUPSET\2007_01_16\O1_M
F_NNNDF_TAG20070116T093035_2TRBP0F5_.BKP
备份集 90 中的数据文件列表
文件 LV 类型 Ckp SCN Ckp 时间 名称
---- -- ---- ---------- ---------- ----
5 Full 833817 16-1月 -07 E:\ORACLE\ORADATA\ROME\TEST.DBF
已存档的日志副本列表
关键字 Thrd Seq S 短时间 名称
------- ---- ------- - ---------- ----
28 1 17 A 15-1月 -07 D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\R
OME\ARCHIVELOG\2007_01_17\O1_MF_1_17_2TWBZJX9_.ARC
29 1 18 A 17-1月 -07 D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\R
OME\ARCHIVELOG\2007_01_18\O1_MF_1_18_2TY5T8F5_.ARC
30 1 19 A 18-1月 -07 D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\R
OME\ARCHIVELOG\2007_01_18\O1_MF_1_19_2TY5XNL2_.ARC
31 1 20 A 18-1月 -07 D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\R
OME\ARCHIVELOG\2007_01_18\O1_MF_1_20_2TY61NDP_.ARC
32 1 21 A 18-1月 -07 D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\R
OME\ARCHIVELOG\2007_01_18\O1_MF_1_21_2TY62DNJ_.ARC
33 1 22 A 18-1月 -07 D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\R
OME\ARCHIVELOG\2007_01_18\O1_MF_1_22_2TZ4C43X_.ARC
介质恢复启动 SCN 是 833817
恢复范围必须超出 SCN 833817 才能清除数据文件模糊性
完成 restore 于 19-1月 -07
RMAN> restore datafile 5 preview;
启动 restore 于 19-1月 -07
使用通道 ORA_DISK_1
备份集列表
===================
BS 关键字 类型 LV 大小 设备类型 经过时间 完成时间
------- ---- -- ---------- ----------- ------------ ----------
92 Full 9.09M DISK 00:00:01 19-1月 -07
BP 关键字: 87 状态: AVAILABLE 已压缩: NO 标记: TAG20070119T100745
段名:D:\TEST.BAK
备份集 92 中的数据文件列表
文件 LV 类型 Ckp SCN Ckp 时间 名称
---- -- ---- ---------- ---------- ----
5 Full 963842 19-1月 -07 E:\ORACLE\ORADATA\ROME\TEST.DBF
在资料档案库中未找到 SCN 963842 后生成的归档日志
介质恢复启动 SCN 是 963842
恢复范围必须超出 SCN 963842 才能清除数据文件模糊性
完成 restore 于 19-1月 -07

我们可以用RESTORE... PREVIEW SUMMARY命令来预览恢复的汇总信息。
RESTORE DATABASE PREVIEW SUMMARY;
RESTORE TABLESPACE users PREVIEW SUMMARY;
RESTORE DATAFILE 3 PREVIEW SUMMARY;
RESTORE ARCHIVELOG FROM LOGSEQ 200 PREVIEW SUMMARY;
RESTORE ARCHIVELOG FROM TIME 'SYSDATE-7' PREVIEW SUMMARY;
RESTORE ARCHIVELOG FROM SCN 234546 PREVIEW SUMMARY;
RMAN> restore datafile 5 preview summary;
启动 restore 于 19-1月 -07
使用通道 ORA_DISK_1
备份列表
===============
关键字 TY LV S 设备类型 完成时间 段数 副本数 压缩标记
------- -- -- - ----------- ---------- ------- ------- ---------- ---
92 B F A DISK 19-1月 -07 1 1 NO TAG20070119T10
0745
在资料档案库中未找到 SCN 963842 后生成的归档日志
介质恢复启动 SCN 是 963842
恢复范围必须超出 SCN 963842 才能清除数据文件模糊性
完成 restore 于 19-1月 -07
RMAN> change backupset 92 unavailable;
不能使用更改的备份段
备份段 handle=D:\TEST.BAK recid=87 stamp=612266866
1 对象已更改为 UNAVAILABLE 状态
RMAN> restore datafile 5 preview summary;
启动 restore 于 19-1月 -07
使用通道 ORA_DISK_1
备份列表
===============
关键字 TY LV S 设备类型 完成时间 段数 副本数 压缩标记
------- -- -- - ----------- ---------- ------- ------- ---------- ---
90 B F A DISK 16-1月 -07 1 1 NO TAG20070116T09
3035
已存档的日志副本列表
关键字 Thrd Seq S 短时间 名称
------- ---- ------- - ---------- ----
28 1 17 A 15-1月 -07 D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\R
OME\ARCHIVELOG\2007_01_17\O1_MF_1_17_2TWBZJX9_.ARC
29 1 18 A 17-1月 -07 D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\R
OME\ARCHIVELOG\2007_01_18\O1_MF_1_18_2TY5T8F5_.ARC
30 1 19 A 18-1月 -07 D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\R
OME\ARCHIVELOG\2007_01_18\O1_MF_1_19_2TY5XNL2_.ARC
31 1 20 A 18-1月 -07 D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\R
OME\ARCHIVELOG\2007_01_18\O1_MF_1_20_2TY61NDP_.ARC
32 1 21 A 18-1月 -07 D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\R
OME\ARCHIVELOG\2007_01_18\O1_MF_1_21_2TY62DNJ_.ARC
33 1 22 A 18-1月 -07 D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\R
OME\ARCHIVELOG\2007_01_18\O1_MF_1_22_2TZ4C43X_.ARC
介质恢复启动 SCN 是 833817
恢复范围必须超出 SCN 833817 才能清除数据文件模糊性
完成 restore 于 19-1月 -07

RESTORE ... VALIDATE 和 VALIDATE BACKUPSET 一样可以检测备份文件有效性,是否可以进行恢复。
RESTORE ... VALIDATE #tests whether RMAN can restore a specific object from a backup.
RMAN chooses which backups to use.
VALIDATE BACKUPSET #tests the validity of a backup set that you specify
RESTORE CONTROLFILE VALIDATE;
RESTORE TABLESPACE SYSTEM VALIDATE;
RESTORE ARCHIVELOG ALL VALIDATE;
VALIDATE BACKUPSET 1121,1122;
