这里讨论单实例下的实例恢复,对于RAC以后补充,有错请指正。
1、实例恢复的定义
crash recover
当实例企图打开一个处于不一致状态的数据库时会进行实例恢复,不一致状态的判定则为系统中的SCN的比较。
当数据库正常关闭时,位于数据文件头的Start SCN,控制文件中记录的数据文件SCN即datafileSCN,系统SCN,StopSCN会是一个一致的数字
在你干净的关闭数据库时shutdown immediate或者使用alter system checkpoint都会把SCN的值写入4个位置,其中有3个位于controlfile内,还有1个位于datafile header内
controlfile里面的三个SCN分别是:1、system checkpoint SCN 2、datafile checkpoint SCN 3、stop SCN
---system checkpoint SCN 查询
SQL>select checkpoint_change# from v$database;
---datafile checkpoint SCN查询
SQL>select name,checkpoint_change# from v$datafile where name like '%user%';
---stop SCN查询
SQL>select name,last_change# from from v$datafile where name like '%user%';
其中这个stop SCN在数据库正常使用的时候是NUll值
datafile header里面的SCN是:start SCN
---start SCN 查询
SQL>select name,checkpoint_change# from v$datafile_header were name like '%user%';
当打开数据库时
如果这两处比较任意一个不相等都会进行实例恢复
2、实例恢复的阶段
Sql startup nomount 读取参数文件的时候 没有实例恢复
Sql mount database 读取控制文件的时候 没有实例恢复
Sql alter database open 检查控制文件 数据文件 这时发生实例恢复(open阶段)
3、实例恢复的目的(作用)
保证数据库在实例出现意外挂掉之后仍然能回到一个一致性的状态,由于Oracle数据库对数据文件的管理方式,数据库的文件可以处于一个不一致的状态。比如LGWR将重做记录和事务SCN更新到重做日志文件中,但是DBWR这时并没有写入到数据文件中还在等待下一个写入的时机,此时如果发生断电之类的情况,那么未提交的更改可能会暂时存在于数据文件中,同样,已提交的更改还不在数据文件中。
4、实例恢复的过程
总的来说:前滚-检查-回滚
前滚,应用redo日志文件进行实例关闭前的动作重演直到redo应用完毕,起点为最后一个检查点。将已修改已提交和已修改未提交的数据重演,目的是保证数据不丢失。
检查,检查具有已修改未提交并且写入到数据文件中的脏数据,这种数据让数据库处于不一致性状态。
回滚,应用undo产生的前镜像将上一步检查出来的导致数据库不一致状态的脏数据回滚,即撤销,作用是使数据库的数据始终保持一致性。
总结就是先前滚,应用redo恢复buffer cache里的数据到数据文件然后把未提交的数据进行脏块重现,然后SMON进程打开数据库进行回滚,再应用undo将buffer里的所有未提交的数据进行回滚。
对于实例恢复可以进行shutdown abort进行实验。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31557302/viewspace-2564343/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/31557302/viewspace-2564343/