您的位置:首页 > 其它

检查点队列浅析

2015-12-06 23:15 393 查看
这篇文章算不上原创,顶多算上是伪原创,大部分资料是收集来的自己又更改了部分内容。

oracle日志原理
redo(重做日志)
rba(重做字节地址由4部分组成:日志线程号,日志序列号,日志文件块编号和日志文件字节偏移量,长度为10个字节。
ckpt equeue: 1,每三秒检查ckpt equeue头的RBA,把检查队列头RBA写到控制文件)
作用:

统计脏数据块
RBA按顺序排序,刷数据到磁盘就按照这个顺序
每个RBA除指向下一个RBA,还指向脏数据块地址

检查点队列(检查点只是一个数据库事件,它存在的根本意义在于减少崩溃恢复事件),在BH中有一个CKPTQ项,双向链表。

只有脏块才会在检查点队列中,非脏块的CKPTQ为空。
当块首次被更改时,块会立即被加进检查点队列。如果检查点队列中的脏块再次被修改,并不会改变在检查点队列中的位置。
检查点队列中脏块的排序顺序:根据第2点,所有脏块按照首次被更改的时间顺序排列。更准确的说:按照块的1rba排列。

什么是RBA,LRBA,HRBA,ON DISK RBA

RBA: redo block address(修改数据块会产生日志,这就是日志的地址,在checkpoint
queue队列相应的块中记下RBA)
LRBA: 块第一次被脏的那个日志地址。
HRBA: 块最近一次脏的地址。
on disk rba:磁盘中重做日志文件的最后一条重做记录的rba,是最高的重做值。

参与检查点的进程主要包括LGWR,DBWn,和CKPT,分为两大类:完全检查点和增量检查点
完全检查点主要包括以下步骤:

首先在日志缓冲中确定当前的(也就是最新的)重做记录,提取其RBA和SCN作为检查点目标
LGWR清空日志缓存,将重做记录写入在线日志
DBWn进程将检查点目标(RBA和SCN)产生的及检查点目标之前产生的脏数据块,按RBA的顺序写入数据文件
最后,CKPT进程将检查点目标(RBA和SCN)写入数据文件的头部和控制文件

发生时会触发DBWn将所有脏块写到磁盘上。触发完全检查点条件

执行shutdown immediate 命令
执行alter system checkpoint命令
LGER切换在线日志,不论是因为日志写满还是执行alter system switch logfile命令
执行部分表空间维护命令:alter tablespace ... offline|online|begin backup|end backup|read only|read write

增量检查点并不会去更新数据文件头,而只是每3秒由CKPT进程去更新控制文件中的LRBA和SCN, 发生时会检查检查点队列如果发现队列上脏块太多,并且发现io不是很忙,那么将上边的部分写到磁盘中,触发DBWn写。
增量检查点主要包含以下步骤

CKPT每3秒一次记录检查点位置的工作(更新控制文件)
CKPT定期触发DBWR

增量检查点的意义有以下两个:

减少发生完全检查点时DBWn进程的工作负担
提高实例恢复速度
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: