001
实例恢复不仅可以重新构成在崩溃时未被保存至数据文件的任何已提交事务,而且可以回滚已被写至数据文件的任何未提交事务。这种恢复是完全自动的,我们无法随意停止实例恢复过程。如果实例恢复失败,那么唯一的可能是在实例失败的同时还存在介质失败,此时只有在使用介质恢复技术还原和恢复受损文件后才能打开数据库。介质恢复的最后一个步骤是自动的实例恢复。
002 实例恢复机制
大体上,实例恢复只不过是使用联机日志文件的内容将数据库缓冲区缓存重新构建至崩溃之前的状态。这个重构过程将重演从崩溃时未被写至磁盘的数据块的相关重做日志中提取出的所有变更。完成上述操作之后,就能够打开数据库。此时,数据库仍然受到损坏,但是由于用户看到的实例已被修复,因此允许用户进行连接。实例恢复的这个阶段称为前滚,该阶段将恢复所有变更(也就是针对已提交和未提交事务的数据块变更与撤销块变更)。每条重做记录都具有重新构造一个变更所需的最少信息:数据块的地址以及新值。在前滚期间,会读取每条重做记录,相应的数据块从数据文件载入数据库缓冲区缓存,并且应用相应的变更。随后,数据块会被写回磁盘。
向前回滚结束后,崩溃看上去似乎从未发生过。不过此时数据库中还存在未提交的事务,这些事务必须被回滚,Oracle将在实例恢复的回滚阶段自动完成未提交事务的回滚操作。然而,上述操作则发生在数据库已被打开且使用之后。如果用户在连接时遇到某些需要回滚但是尚未回滚的数据,那么不存在任何问题。由于前滚阶段会填充保护未提交事务的撤销段,因此服务器能够以正常的方式回滚变更,从而实现读一致性。
实例恢复是自动的、不可避免的,那么怎样才能调用实例恢复呢?答案是使用startup命令。首先,在数据库过渡到加载模式时,SMON进程会读取控制文件。随后,在数据库过渡到open模式时,SMON进程会查看所有数据文件和联机重做日志文件的文件头。此时,如果已经出现了实例失败,由于文件头没有全部同步,因此SMON进程会发现实例失败,从而进入实例恢复进程,而数据库只能在前滚阶段结束后才能被真正地打开。
提示:如果执行了startup命令,那么绝对不会丢失任何数据。在发生任何崩溃之后,都应当执行startup命令并查看崩溃的程度。这个命令可以解决所有问题。