Oracle恢复数据库时有几个常用但非常相似的命令,整理下它们各自的作用及适用场景。
命令 | 控制文件旧于数据文件? | 完全恢复? | 备注 |
recover database | 不可以 | 是 | |
recover database until cancel | 不可以 | 否 | 常用于current/active redo丢失时 |
recover database using backup controlfile | 可以 | 是 | |
recover database using backup controlfile until cancel | 可以 | 否 | 相当于执行recover database using backup controlfile,然后选择AUTO应用所有归档,但不输入redo文件进行应用 |
recover database until cancel using backup controlfile | 可以 | 否 | 当于以旧的redo中的scn为恢复终点,不应用归档日志,会丢失所有数据。 |
在普通的recover database或者recover tablespace,recover datafile时,Oracle会以当前controlfile记录的SCN为准,利用archive log和redo log,把相关datafile的block恢复到“当前controlfile记录的SCN”。
使用场景:既然恢复是以控制文件中的SCN为目标,当然要求控制文件不能比数据文件旧(控制文件SCN>=数据文件SCN)。所以使用场景要么是控制文件完好数据文件是从备份中恢复的,要么控制文件和数据文件都是从备份中恢复的。
也要求控制文件不能比数据文件旧,在丢失current/active redo时手动指定恢复终点,用于不完全恢复。这个命令只能在 SQL命令行进行,通过提示归档日志文件的建议名称进行主动恢复,应用到哪个归档由你自己把控。在归档和联机日志都完整的情况下,你甚至可以通过不完全恢复的语句来实现数据的完全恢复。
recover database until cancel 命令输入AUTO选项时只会应用归档日志,而不会自动应用redo日志,这是和recover database的区别,后者自动应用所有归档和在线日志进行前滚操作。
SQL> recover database until cancel; ORA-00279: change 2255708 generated at 06/13/2019 10:47:31 needed for thread 1 ORA-00289: suggestion: /u02/oradata/CDB1/archivelog/2019_06_13/o1_mf_1_1_gj3go3on_.arc <-- 1 2255708 oracle建议应用的日志 ora-00280: change for thread is in sequence #1 specify log: {=suggested | filename | AUTO | CANCEL} /u02/oradata/CDB1/archivelog/2019_06_13/o1_mf_1_1_gj3go3on_.arc <--- 1 13 2019 2255918 输入日志名 ora-00279: change generated at 06 10:53:23 needed for thread ora-00289: suggestion: u02 oradata cdb1 archivelog 2019_06_13 o1_mf_1_2_gj3gpf1h_.arc <-- oracle建议下一个应用的日志 ora-00280: is in sequence #2 ora-00278: log file ' o1_mf_1_1_gj3go3on_.arc' no longer this recovery o1_mf_1_1_gj3go3on_.arc已应用完,不再需要 specify log: {=suggested | filename | AUTO | CANCEL} <-- 再次要求输入选项 cancel <-- 选择cancel media recovery cancelled. 应用结束 sql> alter database open resetlogs; Database altered.
如果数据文件完好,而全部控制文件丢失,需要从备份中还原,此时控制文件就比数据文件旧(控制文件SCN<数据文件scn),只使用recover database恢复db到还原出来的控制文件scn是打不开数据库的。这时就需要用到第二个命令。< p>
recover database using backup controlfile告诉oracle,不要以还原出来的控制文件作为恢复的终点,而要恢复到比它更靠后的位置,恢复时可以看到提示 Specify log: {=suggested | filename | AUTO | CANCEL}。通常选择AUTO应用所有归档,但注意AUTO不会应用redo日志,需要手动输入redo文件进行应用。然后通过alter database open resetlogs;命令打开DB。
如果数据文件完好,全部控制文件丢失,并且current/active redo都丢失。执行这个命令相当于执行recover database using backup controlfile,然后选择AUTO应用所有归档,但不输入redo文件进行应用(因为已经丢了),明显这也是一种不完全恢复,current/active redo中的数据会丢失。
如果数据文件完好,全部控制文件丢失,并且current/active redo都丢失。执行这个命令相当于以旧的redo中的scn为恢复终点,不应用归档日志,会丢失所有数据。
参考
https://blog.csdn.net/zftang/article/details/6582032
https://www.cnblogs.com/askscuti/p/10996101.html