当数据库实例失败,在下次重新启动时会执行实例恢复。通常实例失败是由于Instance异常关闭或执行了shutdown abort 、startup force命令导致,实例恢复的工作由SMON进程自动完成,并不需要人工干预。
实例恢复主要经历三个阶段: cache recovery、open database、transaction recovery
数据在写出到数据文件之前,会保存在Buffer cache 中,这些记录的改变会同时记录在在线重做日志(redo log file)中。
那么就存在这种情况,
- 我们知道数据库写数据并不是离散写的。即,当用户发出commit命令时,只是将重做信息写出到日志文件,可能并没有将数据写出。
-
当buffer cache没有足够的空间,会将数据写出到数据文件,注意,此时事务可能并没有提交。
第一种情况,如果此时数据库异常关闭,因为我们已经有了redo信息,所以我们按照redo信息,重新构造在数据库崩溃前的buffer cache .这个过程称为 cache recovery ,即前滚。
第二种情况,当事务对数据进行修改时,会首先将修改数据的前镜像保存到回滚段,以便当事物回滚时恢复原来的数据。回滚段不会删除未提交的事物。如果 此时数据库异常关闭,那么我们可以应用回滚段的数据进行恢复,这个过程称为transaction recovery,即回滚。
这里可能还有一个疑问,在数据库崩溃的时候,如果回滚段的数据没有及时写出。我们依然会丢失数据。这个我们不必担心,因为在任何数据修改之前都会在回滚段构造一份之前的拷贝,而这个过程也是需要写入日志的。即,在修改数据之前,回滚段的相关修改已经写入了日志。
总结一下实例恢复的过程:首先将提交的事物前滚,将数据库恢复到实例失败时的状态。然后打开数据库,重新执行提交以及回滚的操作(即,该提交的提交,该回滚的回滚)。