前往顾页
以后地位: 主页 > 收集编程 > Jsp实例教程 >

RedoLog Checkpoint 和 SCN关系概述

时候:2011-06-07 23:38来源:知行网www.zhixing123.cn 编辑:麦田守望者

一. Redo log 感化
数据库异常关机(比如俄然断电,shutdown abort: 它会当即封闭数据库,同即是断电)以后,这时候已commit的事件已记录到online redo log中,下次启动数据库时,Oracle进行规复操纵,将online redo log中的事件操纵调入内存中,进行呼应操纵后将数据记入到数据文件中,数据操纵完成。对没有commit罢了经写入数据文件或回退段的数据,也要进行回滚操纵,将数据规复到rollback的状况,使数据文件和节制文件规复到崩溃前的分歧性状况。总之,数据库下次翻开时会占用比一般封闭更长的时候。
重视:其实不是所有异常关机后,下次启动时都可以规复到一般状况,异常关机容易导致坏块的产生,这类环境下数据库是不克不及一般启动的,如果措置不当,将会导致年夜量数据的丧失。

Rolling Forward(前滚)
Oracle启动实例并加载数据库,然后经由过程Online Redologs中的重做日记,重实际例崩溃前对数据库的点窜操纵。在规复过程中对已提交的事件,但还没有写入数据文件的那部分数据全数写入数据文件.

Rolling Back(回滚)
Rolling Forward以后,固然已提交的点窜操纵变动的数据都已被写入数据文件,但在实例崩溃时,部分未提交的事件操纵的数据也被写入到数据文件,这些事件必须被撤消.
触发LGWR过程的前提有:
1. 用户提交
2. 有1/3重做日记缓冲区未被写入磁盘
3. 丰年夜于1M的重做日记缓冲区未被写入磁盘
4. 3秒超时
5. DBWR 需求写入的数据的SCN年夜于LGWR记录的SCN,DBWR 触发LGWR写入。

二. Checkpint(查抄点)

2.1 查抄点定义
年夜多数关系型数据库都采取"在提交时其实不逼迫针对数据块的点窜完成"而是"提交时包管点窜记录(以重做日记的情势)写入日记文件"的机制,来获得机能的上风。
这句话的别的一种描述是:
当用户提交事件,写数据文件是"异步"的,写日记文件是"同步"的。
这便可能导致数据库实例崩溃时,内存中的DB_Buffer 中的修改过的数据,可能没有写入到数据块中。数据库在从头翻开时,需求进行规复,来规复DB Buffer 中的数据状况,并确保已提交的数据被写入到数据块中。查抄点是这个过程中的首要机制,经由过程它来肯定,规复时哪些重做日记应当被扫描并利用于规复。

要体味这个查抄点,起首要晓得checkpoint queue观点,查抄点产生后,触发DBWn,CKPT获得产生查抄点时对应的SCN,告诉DBWn要写到这个SCN为止, DBWR写dirty buffer 是按照 buffer 在被初次 modify的时候的时候的依次写出,也就是 buffer被modify 的时候会进入一个queue (checkpoint queue),DBWr 就按照queue今后中批量地写到数据文件。 因为这里有一个依次的关系,所以 dbwr的写的进度就是可衡量的,写到哪个buffer的时候该buffer的初次转变时候的scn就是以后所有数据文件block的最新scn,但是因为无法适时的将dbwr的进度记录上去,所以oracle 挑选了一些战略。 此中就包含ckpt过程的查抄点和心跳。

查抄点产生今后,CKPT过程查抄checkpoint queue(也就是脏块链表)是不是太长,如果是,则触发DBWn,将一部分脏块写入数据文件,从而收缩checkpoint queue。
checkpoint 产生时,一方面告诉dbwr进行下一批写操纵,(dbwr 写入的时候,一次写的块数是有一个批量写的埋没参数节制的); 另外一方面,oracle 采取了一个心跳的观点,以3秒的频次将dbwr 写的进度反应到节制文件中,也就是把dbwr以后刚写完的dirty buffer对应的scn 写入数据文件头和节制文件,这就是查抄点scn。
这个3秒和增量查抄点不是一个观点,3秒只是在节制文件中,ckpt 过程去更新以后 dbwr写到那里了,这个对 ckpt 过程来讲叫 heartbeat ,heartbeat是3秒一次,3秒可以看作不断的查抄并记录查抄点履行环境(DBWR的写进度)。

查抄点产生以后数据库的数据文件、节制文件处于分歧状况的含义是不需求进行 介质规复,只表示数据文件头分歧,但是其实不表示数据文件内容分歧,因为数据文件内容可能在没有产生查抄点的别的环境下的dbwr写数据文件,如许数据文件内容就不分歧,若失落电需求进行崩溃规复。
触发DBWR过程的前提有:
1. DBWR超时,年夜约3秒
2. 体系中没有多余的空缓冲区来存放数据
3. CKPT 过程触发DBWR
2.2 Checkpoint 触发前提

oracle8今后推出了incremental checkpoint(增量查抄点)的机制,在之前的版本里每checkpoint时都会做一个full thread checkpoint(完整查抄点),如许的话所有脏数据会被写到磁盘,巨年夜的i/o对体系机能带来很年夜影响。为体味决这个问题,oracle引入了checkpoint queue机制,每个脏块会被移到查抄点队列内里去,遵循low rdb(第一次对此块点窜对应的redo block address)来摆列,靠近查抄点队列尾端的数据块的low rba值是最小的,并且如果这些赃块被再次点窜后它在查抄点队列里的依次也不会改变,如许就包管了越早点窜的块越早写入磁盘。每隔3秒钟ckpt会去更新节制文件和数据文件,记录checkpoint履行的环境。
触发CheckPoint(查抄点) 前提有很多,比如:
1. 经由过程一般事件措置或当即选项封闭例程时(shutdown immediate或Shutdown normal),
2. 当经由过程设置初始化参数:

LOG_CHECKPOINT_INTERVAL,
LOG_CHECKPOINT_TIMEOUT ,
FAST_START_IO_TARGET 强迫时;
3. 当数据库办理员手动请求时:
ALter system checkpoint;
alter tablespace ... offline;

4. 每第二天志切换时;
alter system switch logfile

重视:
1. alter system switch logfile也将触发完整查抄点的产生。
2. alter database datafile ... offline 不会触发查抄点过程。
如果是纯真的offline datafile,那么将不会触发文件查抄点,只需针对offline tablespace的时候才会触发文件查抄点,这也是为甚么online datafile需求media recovery而online tablespace不需求。
对表空间的offline后再online这类环境,最好做个强迫的checkpoint比较好。
关于offline datafile 和tablespace 的辨别也能够参考我的blog:
ALTER DATABASE 与 ALTER TABLESPACE OFFLINE的辨别
http://blog.csdn.net/tianlesoftware/archive/2009/11/30/4898800.aspx
以上的触发前提将触发完整查抄点,促使DBWR 将查抄点时刻前所有的脏数据写入数据文件。别的,一般一般运行期间的数据库不会产生完整查抄点。
下面很多事件将导致增量查抄点,比如:
1. 在联机热备份数据文件前,请求该数据文件中被点窜的块从DB_Buffer 写入数据文件中。所以,发出如许的号令:
ALTER TABLESPACE tablespace_name BIGEN BACKUP & end backup; 也将触发和该表空间的数据文件有关的部分查抄点;
2. 别的,
ALTER TABLESPACE tablespace_name READ ONLY;
ALTER TABLESPACE tablespace_name OFFLINE NORMAL;
等号令都会触发增量查抄点。
2.3 关于查抄点的一点详细利用会商

2.3.1. Commit成功后,数据还会丧失吗?

对Oracle来讲,用户所做的DML操纵一旦被提交,则先是在database buffer cache 中进行点窜,同时在点窜之前会将数据的前镜像保存在回滚段中,然后将点窜之前和点窜以后的数据都写入到redo log buffer中,当领遭到commit号令以后,则redo log buffer开端写redo log file ,并且记录此时的scn,当redo log file 写完了以后,表示此次事件提交操纵已确认被数据库记录了,只需当redo log file 写成功了,才会给用户 Commit completed 的成功字样。而对Database buffer cache中的dirty buffer则会等候触发DBWn才写入,但是如果此时断电,则数据已被记录到了redo log file中,体系在从头启动的时候,会主动进行嵌滚和回滚来包管数据的分歧。所以,只如果commit成功的了,数据不会丧失!
2.3.2. 数据库产生一次DBWn,是不是将所有buffer cache 中的dirty buffer 都写入,还是先将脏队列中的数据写入?
这话看起来有事理,但实际上,dbwr在写的时候又不竭地在产生dirty buffer ,所以说查抄点产生的时候是希冀把该时候点之前的所有脏缓冲区写入数据文件。
所有的buffer,不在LRU list上就在dirty list上, dbwr写入的时候,一次写的块数是有一个批量写的埋没参数节制的。
所以说如果 dbwr将 dirty list也好, lru list上的也好,要实现全数写入,都是一个实际体系中很难存在的征象。dirty 老是在不竭的产生,dbwr老是在不竭地写,增量查抄点产生的时候也其实不料味着必然要更新数据文件头,查抄点开端的时候只表示该次查抄点结束的时候要更新数据文件头的话数据文件头具有该时候点的分歧性。

2.3.3. 关于查抄点等候事件:

有些事件的产生必须等候查抄点的完成,才气开端数据库的别的操纵:日记文件切换就是此中一个事件,日记切换必须等候查抄点完成。

log file switch (checkpoint incomplete) 这个等候事件本身也申明,日记切换时产生的查抄点是需求等候的,这个日记文件所对应脏块全数写完后,查抄点过程更新节制文件和数据头,然后这个查抄点才气算完成。
也就是说日记切换必须等候查抄点完成,而查抄点在等候DBWn完成。

这类等候DBWn完成的查抄点,最后一步写入节制文件和数据文件头的SCN,必定是DBWn完成的最后一块的SCN。

顶一下
(1)
100%
踩一下
(0)
0%
------分开线----------------------------
标签(Tag):数据库 Oracle
------分开线----------------------------
颁发评论
请自发遵循互联网相关的政策法规,严禁公布色情、暴力、革命的谈吐。
评价:
神色:
考证码:点击我更换图片
猜你感兴趣