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