最近用到oracle11g的命令想把数据通过不完全恢复方式恢复到之前的某个时间状态,使用很简单,细节和问题确实非常多。搜遍全网才总结了做恢复时的问题和原理。

1.recover database until cancel的原理和使用

我们先来看做不完全恢复的方法。想做的的内容很简单,把比如有张表,里面有三条数据

id

value

11

test1

22

test2

33

test3

现在需求是把数据恢复到只插入一条数据的状态。前提我们再插入每条数据时都做了一次归档如下语句

alter system switch logfile

当前有三个归档文件。然后执行不完全恢复

SQL> recover database until cancel;
完成介质恢复。

执行后提示恢复完成。但此时如果我们把所有归档文件包括所有redo文件全部删除,再执行此语句后系统仍然提示恢复完整。

注意:无论是在归档模式,还是在非归档模式,直接执行这条命令后,系统都会提示恢复完整。

原理:直接执行recover database until cancel操作,系统不会也不能根据数据文件的起始状态应用归档或在线日志。这里oracle实际什么也没做。如果想正确执行此操作,必须在次之前执行restore database操作。也可以把之前手工拷贝的数据文件覆盖当前数据文件。

正确使用方法:把已知还原的数据文件为基础,再用recover方式应用日志文件恢复数据。

2.recover database的原理和使用

再看看recover database。同样的例子,前提依然是数据库处于归档模式,所有redo文件和归档日志全部删除。如果直接执行了这个操作,系统提示如下

SQL> recover database;

ORA-00283: 恢复会话因错误而取消 ORA-00264:

不要求恢复

说明没有最近的备份数据为依据,根本就不能执行恢复操作,无法应用日志文件。

我们可以做一个简单的例子,先把某个数据文件如users.dbf备份,然后删除一行数据,切换日志,最后把数据库启动到mount状态。只要把users.dbf备份覆盖当前的users.dbf。再执行recover database或recover database until cancel。oracle都会发现变更的数据文件,并根据相应数据文件的数据应用日志。

这里我们把备份覆盖当前文件后做如下操作


SQL> recover database;
完成介质恢复。

原理:说明recover database一样需要先执行数据还原操作,以变化的数据和时间点为基础,再应用日志恢复数据

3 两个操作的区别

recover database until cancel 根据指定的归档名应用归档日志,直到输入cancel取消恢复过程。此操作是不完全恢复操纵,不论数据是否能完全恢复,都需要用resetlogs方式打开数据库。

SQL> recover store;
SQL> recover database until cancel;
SQL> alter database open resetlogs;

这个操作的正确使用方式:执行命令后,首先人工输入需要恢复的归档日志文件路径和文件名,从最早归档日志名到大选择输入,如果归档日志号为1,2,3,4,5,6,输入1号归档日志名,oracle会应用1号归档日志,再输入2号归档日志名,oracle再应用恢复2号归档日志,如果3号日志不需要再应用,则输入cancel取消恢复过程。这样便可以通过人机交互方式,一个一个归档日志恢复,且最终恢复几个归档日志可以通过cancel来决定。另外每次输入的日志名,可以输入归档日志名,也可以输入在线redo日志名。操作过程如下

SQL> recover database until cancel;

ORA-00279: 更改 2553131 (在 05/08/2023 15:28:55 生成) 对于线程 1 是必需的 ORA-00289:

建议: C:\APP\86180\ORADATA\WSDC\ARCHIVELOG\LOG_1_7_1136295738.ARC

ORA-00280: 更改 2553131 (用于线程 1) 在序列 #7 中



指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

C:\app\86180\oradata\WSDC\archivelog\LOG_1_7_1136295738.ARC

ORA-00279: 更改 2553140 (在 05/08/2023 15:29:15 生成) 对于线程 1 是必需的 ORA-00289:

建议: C:\APP\86180\ORADATA\WSDC\ARCHIVELOG\LOG_1_8_1136295738.ARC

ORA-00280: 更改 2553140 (用于线程 1) 在序列 #8 中 ORA-00278:

此恢复不再需要日志文件

--这里不会退出,需要再手工指定要恢复的归档日志/redo日志,或输入cancel退出
cancel --这里需要手动输入

recover database 是应用所有归档日志和在线redo日志。此操作是完全恢复操作,启动数据库需要直接使用open方式打开,而无需resetlogs方式。

SQL> recover store;
SQL> recover database;
SQL> alter database open;

这个操作使用比较简单,使用时,oracle会自动应用所有归档日志和redo日志