检查点队列浅析

来源:互联网 发布:s7200编程电缆驱动 编辑:程序博客网 时间:2024/06/02 05:04
这篇文章算不上原创,顶多算上是伪原创,大部分资料是收集来的自己又更改了部分内容。

oracle日志原理
redo(重做日志)
rba(重做字节地址由4部分组成:日志线程号,日志序列号,日志文件块编号和日志文件字节偏移量,长度为10个字节。
ckpt equeue: 1,每三秒检查ckpt equeue头的RBA,把检查队列头RBA写到控制文件)
 作用:
  1. 统计脏数据块
  2. RBA按顺序排序,刷数据到磁盘就按照这个顺序
  3. 每个RBA除指向下一个RBA,还指向脏数据块地址

检查点队列(检查点只是一个数据库事件,它存在的根本意义在于减少崩溃恢复事件),在BH中有一个CKPTQ项,双向链表。
  1. 只有脏块才会在检查点队列中,非脏块的CKPTQ为空。
  2. 当块首次被更改时,块会立即被加进检查点队列。如果检查点队列中的脏块再次被修改,并不会改变在检查点队列中的位置。
  3. 检查点队列中脏块的排序顺序:根据第2点,所有脏块按照首次被更改的时间顺序排列。更准确的说:按照块的1rba排列。

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

参与检查点的进程主要包括LGWR,DBWn,和CKPT,分为两大类:完全检查点和增量检查点
完全检查点主要包括以下步骤:
  1. 首先在日志缓冲中确定当前的(也就是最新的)重做记录,提取其RBA和SCN作为检查点目标
  2. LGWR清空日志缓存,将重做记录写入在线日志
  3. DBWn进程将检查点目标(RBA和SCN)产生的及检查点目标之前产生的脏数据块,按RBA的顺序写入数据文件
  4. 最后,CKPT进程将检查点目标(RBA和SCN)写入数据文件的头部和控制文件

发生时会触发DBWn将所有脏块写到磁盘上。触发完全检查点条件
  1. 执行shutdown immediate 命令
  2. 执行alter system checkpoint命令
  3. LGER切换在线日志,不论是因为日志写满还是执行alter system switch logfile命令
  4. 执行部分表空间维护命令:alter tablespace ... offline|online|begin backup|end backup|read only|read write

增量检查点并不会去更新数据文件头,而只是每3秒由CKPT进程去更新控制文件中的LRBA和SCN, 发生时会检查检查点队列如果发现队列上脏块太多,并且发现io不是很忙,那么将上边的部分写到磁盘中,触发DBWn写。
增量检查点主要包含以下步骤
  1. CKPT每3秒一次记录检查点位置的工作(更新控制文件)
  2. CKPT定期触发DBWR
增量检查点的意义有以下两个:
  1. 减少发生完全检查点时DBWn进程的工作负担
  2. 提高实例恢复速度
0 0
原创粉丝点击