如果需要将数据库恢复到引入错误之前的某个状态时,DBA就可以执行不完全恢复。完全恢复ARCHIVELOG模式的数据库时,对于还没有更新到数据文件和控制文件的任何事务,RMAN会将归档日志或联机日志全部应用到数据库。而在不完全恢复数据库的过程中,DBA决定了整个更新过程的终止时刻。RMAN执行的不完全恢复通常分为基于时间的不完全恢复和基于更改(SCN号)的不完全恢复。
(1)基于时间的不完全恢复
对于基于时间的不完全恢复,由DBA指定存在问题的事务时间。这也就意味着如果知道存在问题的事务的确切发生时间,执行基于时间的不完全恢复是非常适合的。例如假设用户在上午10:05将大量的数据库加载到一个错误的表中,如果没有一种合适的方法从表中删除这些数据,那么DBA可以执行基于时间的恢复,即将数据库恢复到上午10:04时的状态。当然,这基于用户知道将事务提交到数据库的确切时间。
基于时间的不完全恢复有许多不确定因素。例如根据将数据库加载到表中所使用的方法,可能会涉及多个事务,而用户只注意到了最后一个事务的提交时间。此外,事务的提交时间是由Oracle服务器上的时间决定的,而不是由单个用户的计算机时间决定的。这些因素都可能会导致数据库恢复不到正确的加载数据之前的状态。
在对数据库执行不完全恢复后,必须使用RESETLOGS选项打开数据库,这将导致以前的任何重做日志文件都变得无效。如果恢复不成功,那么将不能再次尝试恢复,因为重做日志文件是无效的。这就需要在不完全恢复之前从备份中恢复控制文件、数据文件以及重做日志文件,以便再次尝试恢复过程。
在RMAN中执行基于时间的不完全恢复的命令为SET UNTIL TIME。对于用户管理的基于时间的恢复,时间参数作为RECOVER命令的一部分被指定,但是在RMAN中执行恢复时,对于恢复时间的指定则在RECOVER命令之前进行设置。下面通过一个实例来演示基于时间的不完全恢复。
【例8.12】 实现基于时间的不完全恢复,代码和操作步骤如下。
①启动RMAN,并连接到目标数据库。
②关闭数据库,并重新启动数据库到MOUNT状态。
③在RMAN中输入如下命令,创建数据库的一个备份,代码如下。
④在数据库完成备份后,打开数据库。
⑤接下来就需要模拟一个错误,以便确认不完全恢复。首先启动SQL∗Plus,查看Oracle服务器的当前时间,代码及运行结果如下。
⑥在SQL∗Plus中向HR.EMPLOYEES表添加几行数据,代码如下。
说明:现在假设上述操作是错误操作,DBA需要执行基于时间的不完全恢复,将数据库恢复到发生错误之前的状态。
⑦在RMAN中关闭目标数据库。
⑧使用操作系统创建数据库的一个脱机备份,包括控制文件的所有副本、数据文件和归档的重做日志文件,以防止不完全恢复失败。
⑨启动数据库到MOUNT状态。(www.daowen.com)
⑩在RMAN中输入如下命令,执行基于时间的不完全恢复,代码如下。
[11]在SQL∗Plus环境中查询HR.EMPLOYEES表,用于确认该表中不再包含错误的记录。
(2)基于更改的不完全恢复
对于基于更改的不完全恢复,则用存在问题的事务的SCN号来终止恢复过程。在恢复数据库之后,将包含低于指定SCN号的所有事务。在RMAN中执行基于更改的不完全恢复时,可以使用SET UNTIL SCN命令来指定恢复过程的终止SCN号。其他的操作步骤与执行基于时间的不完全恢复完全相同。执行基于更改的不完全恢复时,DBA唯一需要考虑的是确定适当的SCN号。LogMiner是确认事务SCN号的常用工具,下面来看一个例子。
【例8.13】 假设某个用户不小心删除了hr.employees表中的所有记录,DBA需要查看删除数据的事务SCN号,以执行基于更改的不完全恢复,恢复被用户误删除的数据。
①在SQL∗Plus中连接到数据库,并删除hr.employees表中的所有数据。
②使用dbms_logmnr_d.duild()过程提取数据字典信息,代码如下。
③使用dbms_logmnr.add_log file()过程添加分析的日志文件。如果不能确定哪一个日志文件包含了删除hr.employees表中数据的事务,则必须对每一个重做日志文件进行分析,代码如下。
④启动LogMiner开始分析日志,代码如下。
⑤查询v$logmnr_contents图,查看为delete hr.employees语句分配的SCN号。为了减少搜索范围,可以限制只返回那些引用了名为EMP的段的记录,代码如下。
⑥结束LogMiner会话并释放为其分配的所有资源,代码如下。
⑦关闭数据库,并创建数据库的脱机备份以防止不完全恢复失败。
⑧使用RMAN连接到目标数据库。
⑨在RMAN中启动数据库到MOUNT状态。
⑩输入如下命令恢复数据库。
恢复数据库之后,可以通过SQL∗Plus查看HR.EMPLOYEES表的内容,确认是否成功地恢复了数据库。在恢复数据库后,应该立即创建数据库的一个备份,以防止随后出现错误。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。