前述
数据库实例有buffercache,buffercache中有很多buffer
buffercache里面单独有一块内存区域用来记录,有很多链是chain
LRU链:least recent use最近最少使用,LRU上链的是干净块
LRUW链:least recently used write,也叫做dirty list,是脏数据块链表
LRU链是将干净和可用的块串起来,当从buffercache里面找到可用块时就找LRU链
LRUW是将脏块链起来,将来DBWR要将脏块写到磁盘上时就访问LRUW这个链,我们之所以把块链起来,就是为了组织和管理这些块。
总之,不同的链有不同的功能!!
检查点队列链
Oracle buffercache里面有一种链叫检查点队列链----checkpoint query链
首先来讲他是一个链,链接的是buffer,链的是块
检查点队列也连接脏块
脏块链接在LRUW上,是通过块的使用频率(冷/热)来链接的,经常访问的在热端,不经常访问的在冷端,而在冷端的块会先将数据写入磁盘,之后就可以被重复使用。
但是检查点队列连接脏块,是通过块第一次脏的时间点连接起来。
注意:1.检查点队列里对应的块是脏块
2.按照脏块第一次脏的时间点进行连接
检查点队列连接方式的意义
RBA RedoBlockAddress 日志块地址 对块进行修改后会产生日志,RBA就是日志块的地址
块中有两个地址
LRBA 块第一次被脏的日志地址
HRBA 块最近一次脏的日志地址
注意:检查点队列是按照LRBA将脏块连接在一起
最早脏的块对应的日志以下存放的是除最早块外其他脏块对应的日志
日志按照时间的顺序记录着块的修改
CKPT进程----检查点进程有两种工作的方式
1.完全检查点:当完全检查点发生后,CKPT进程会触发DBWR,将所有的脏块写到磁盘上;
2.增量检查点:当增量的检查点发生后,CKPT进程会将检查点队列的第一个脏块的对应的LRBA日志地址记录到控制文件中。
什么时候发生完全检查点?
------数据库正常运行时,只有在正常关闭数据库时才会发生完全检查点
什么时候发生增量检查点?
-------数据库在正常运行时是几乎不会发生完全检查点,但会发生增量检查点,Oracle每个3秒钟发生增量检查点。
那么在增量检查点发生时,CKPT进程将检查队列的最早脏的数据块对应的LRBA地址记录到控制文件中。
记住:增量检查点是每隔3秒钟发生一次!!!
增量检查点 主要做的两件事情:记录检查点队列链上最早脏的块的LRBA地址
on disk rba----current中记录的最新的日志地址
select CPDRT,CPLRBA_SEQ||'.'||CPLRBA_BNO||'.'||CPLRBA_BOF "Low RBA",CPODR_SEQ||'.'||CPODR_BNO||'.'||'.'CPODR_BOF "On disk RBA",CPODS,CPODT,CPGBT from x$kcccp;
alter system flush buffer_cache;---将所有的脏块写到磁盘上