ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 关于redo的理解

关于redo的理解

原创 Linux操作系统 作者:ggnanqi 时间:2012-03-08 16:46:25 0 删除 编辑

上次面试被问到redo,当时理解的很肤浅,再次看编程艺术,感觉书上讲解的依然很模糊。今天网上搜了一些文章,再次总结一下。


前台进程的操作,并不是直接写到数据文件中,为了提高性能,直接对sga中的db buffer操作。当commit时,在写到文件中,但是由于数据文件中数据分布在不同数据块,随即读写效率很低,引入redo buffer和redo log文件。

所有的DML,现在db buffer中查找,如果不存在则从数据文件中读取到db buffer,如果已经存在,判断是否直接读取还是一致读consistent read,从undo中读取。修改时现在undo中保存修改前的数据,再修改db buffer,还要生成db buffer 和undo的redo信息,commit时,只把redo buffer信息写到redo log。这样比将db buffer写到数据文件效率会高。

但是由于db buffer还保存在内存中,当发生故障时,数据文件中的数据和实际数据不一致,需要实例恢复或者介质恢复。
实例恢复是数据库启动后自动实现的,首先找到最后一次检查点,然后根据redolog重新把操作执行一遍,让数据文件恢复到故障发生时状态,由于数据文件中可能包含未提交数据,所有还要根据undo数据文件,恢复到最后一个事务时的状态。

redo文件:记录所有操作,用于恢复(redo records all the database transaction used for recovery
undo文件:记录所有的前印象,用于回滚(undo is used to store uncommited data infor used for rollback

前台的操作涉及到内存中redo buffer,db buffer,undo也包含在db buffer中。再由后台进程lgwn 和dbwn将内存数据写到文件。
LGWn的触发条件:
1.每次commit提交都会触发,直到LGWn把本次事务的redo信息写到redo文件,并记录当前scn,才返回事务成功
但是如果事务比较大,或者持续时间较长,为了保证redo buffer不被用尽,还要引入一下其他策略
2.距离上次LGWn写入操作超过三秒;
3.Redo Buffer数据超过1/3或者超过1M大小;
4.DBWn启动,将Buffer Cache中的脏数据写入到文件中,在这之前会触发LGWn,将log buffer中的日志写入online redolog中。
所以LGWn是很频繁的,持续的把redo信息写到磁盘。当redolog文件满了,就需要进行日志切换,使用其他组的日志文件,此时触发CHPT事件

DBWn的触发条件:
1.当dirty list达到一定数量(阀值25%)
2.当查找LRU List 超过一个阈值没能找到足够的free buffer(阈值40%)
2.CKPT进程启动会促使DBWn进程进行数据写入以及检查点的建立。

CKPT的触发条件:
1.当发生日志组切换的时候
2.当符合LOG_CHECKPOINT_TIMEOUT,LOG_CHECKPOINT_INTERVAL,FAST_START_IO_TARGET, FAST_START_MTTR_TARGET参数设置的时候
3.当运行ALTER SYSTEM SWITCH LOGFILE
4.当运行ALTER SYSTEM CHECKPOINT
5.当运行alter tablespace XXX begin backup,end backup
6.当运行alter tablespace ,datafile offline

检查点时将数据从内存中写到文件,并记录当前scn,保证各个文件(数据、控制、日志等)是一致的,作为故障恢复时数据库一致状态的标记。

日志文件上,可以有三个类型的事务事件:
 
1、事务结束,已经被commit,之后打过checkpoint检查点。这种事务记录在Log File上,但是变化信息已经被DBWn写入进数据文件;
 
2、事务结束,已经被commit,之后没有打入checkpint检查点。这种情况下,Log File已经写入了日志项目,数据文件可能包括脏数据,也可能没有写入脏数据;
 
3、事务未结束,没有commit。这种时候,数据块Dirty Block上面是有事务槽信息,表示未结束事务,是不会将数据写入到数据文件中。但是,日志Log Buffer可能将部分未提交的DML操作项目写入到Log File中;
 
当实例失败后,SMON首先找到最后SCN记录的Redo Log File,寻找最后一个打入的Checkpoint。Oracle会从这个checkpoint position处开始应用日志文件进行“前滚”来重演整个操作过程直到实例失败的那一刻,而后假如数据库发现有些事务没有进行提交,则会从Undo表空间中寻找到旧版本SCN的数据块信息,来进行SGA中Buffer Cache数据块恢复。“回滚”未提交的事务。


转一篇网上关于redo的理解,很长。
http://space.itpub.net/9399028/viewspace-687535
老白的理解REDO LOG

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8742393/viewspace-718089/,如需转载,请注明出处,否则将追究法律责任。

上一篇: rman不完全恢复
请登录后发表评论 登录
全部评论

注册时间:2012-02-21

  • 博文量
    8
  • 访问量
    6358