admin 管理员组

文章数量: 1184232


2024年4月28日发(作者:sap中abap什么意思)

关于low cache rba与on disk rba的理解:

简单说:low cache rba就是CKPT记录的DBWR写的进度。

on disk rba就是LGWR的写进度。

如果数据库carsh,low cache rba是恢复的起点,on disk rba是恢复的终点。

阐述一下:dbwr成功写完后并不把此刻scn信息写到控制文件中,只有CKPT才更

新控制文件和数据文件头,dbwr只要成功将dirty data写入数据文件就是成功, CKPT

只要能将最新DBWR写完的SCN更新到控制文件和数据文件头就算成功。但是由于CKPT

进程不是实时更新dbwr写完的scn到控制文件中,而是采用每3妙更新一次的策略,因

此最后有ckpt进程写进控制文件的scn信息有可能不是当前dbwr刚刚写完的scn值。

这点应该注意,也就是说dbwr写的进度与ckpt进程更新控制文件的进度是不同的。

关于检查点的一点具体应用讨论:

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

成功的了,数据不会丢失!

数据库发生一次DBWn,是否将所有buffer cache 中的dirty buffer 都写入,还是

先将脏队列中的数据写入?

这话看起来有道理,但实际上,dbwr在写的时候又不断地在产生dirty buffer ,所以

说检查点发生的时候是期望把该时间点之前的所有脏缓冲区写入数据文件。

所有的buffer,不在LRU list上就在dirty list上, dbwr写入的时候,一次写的块数

是有一个批量写的隐藏参数控制的。

所以说要是 dbwr将 dirty list也好, lru list上的也好,要实现全部写入,都是一个

现实系统中很难存在的现象。dirty 总是在不断的产生,dbwr总是在不断地写,增量检查点

发生的时候也并不意味着一定要更新数据文件头,检查点开始的时候只表示该次检查点结

束的时候要更新数据文件头的话数据文件头具有该时间点的一致性。

data block里面不是也有SCN吗?和文件头里面的SCN有什么关系?什么时候被更

新?代表的是是什么含义?

data block 里面的SCN是当 block 被更改的时候的 SCN

而数据文件有那么多 block,自然不同的 block有不同的 SCN

block中存在 block SCN 和 ITL 中的commit SCN


本文标签: 时候 数据文件 数据 控制 文件