最近用到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日志