第十九讲--实例崩溃恢复原理剖析

来源:互联网 发布:淘宝账号回收 编辑:程序博客网 时间:2024/04/29 07:01

核心内容是检查点队列的作用。

Oracle运行期间可能出现以下情况:

Buffer cache里有很多脏buffer还没来得及写回磁盘,服务器突然掉电,buffer cache里的数据全部丢失。

丢失的脏buffer分为两种:1.未提交的事务所修改的数据块可以丢失;2.已提交事务的数据块不能丢失。Oracle提交的时候只是日志写过来了(见日志核心意义-快速提交)。故oracle崩溃以后,已提交事务的脏buffer需要通过日志找回来。

对于log buffer和redo log而言,脏块对应的日志也分两种情况:1.脏块所对应的日志已经写到磁盘上(已经写到redo log);2.脏块所对应的日志还在log buffer里面。如果脏块对应的日志还在log buffer里,那说明日志对应的事务还没有提交,那这个脏块可以丢失。而对于写到磁盘上的日志(redo log),我们可以通过日志把脏块恢复出来。

Oracle下次启动的时候自动会发现数据库非正常关闭,oracle自己就会做实例崩溃恢复。实例崩溃恢复的核心就是使用redo log把oracle崩溃瞬间的脏块全部构造出来。

到底使用redo log的哪些日志呢,肯定不是全部使用。首先确定需要使用的日志的终点:current日志文件的最后一条记录。

需要使用的日志的起点就是检查点队列的第一个脏块所对应的日志记录(由CKPT进程写到控制文件上)。记录4,5,6写在log buffer里,说明4,5,6没有提交事务,故4,5,6日志对应的脏块可以丢失,而1,2,3在redo log里说明事务已提交。1以下的日志所对应的脏块已经写到磁盘上(dbf文件)了。


这里有一点需要注意:oracle实例恢复时肯定能把已提交的脏块恢复出来,同时未提交的脏块也会被部分恢复出来。假如1,3已经提交但是2没有提交,为了恢复3,把2也构造出来了。对于恢复出来的未提交事务,oracle都会回滚(undo)。


Oracle实例崩溃恢复:

1.      找需要恢复的redo log起点(从控制文件中找)和终点(current日志的最后一条记录);

2.      跑日志,跑日志的过程叫前滚,把脏块构造出来;

3.      有些脏块被构造出来,但是其事务没有提交,oracle此后会慢慢的去回滚;


0 0