检查点队列


oracle025

检查点队列

buffer cache中的链:
CBC,LRU(冷热程度)、LRUW(冷热程度)、
检查点队列链:链着是脏块,是通过第一次脏的时间来串联起来

RBA:redo log 日志地址
数据块
LRBA:第一次被脏的日志地址(最先一次)
HRBA:第五次被脏的日志地址(最近一次)
由LRBA--HRBA这两个点就可以知道这个数据块整个脏的日志范围(日志写入是按照时间的)
ON DISK RBA 最近一条写书redo log中的日志

ckpt:检查点进程:
完全监察点发生的时候,触发DBWR写所有脏块到数据库(数据库关闭)

增量监察点发生的时候, check point 将检查点的队列的第一个块(最早脏的快)
所对应的日志地址(LRBA)写入控制文件中(每隔三秒钟发生一次);假如检查点队列比较长,而且
IO不忙的时候,也会触发DBWR写最早脏的块写入数据库


DBWR:三种情况下写脏块:1. LRUW脏块队列来写数据到数据库,
3.
2.检查点队列比较长,而且IO不忙的时候,也会触发DBWR写最早脏的块写入数据库
检查点队列_第1张图片 检查点队列_第2张图片


oracle脏块丢失的处理情况:

oracle针对于未提交的数据的事务所对应的数据块可以丢失,
已提交的数据的事务对应的数据块不能丢失

日志在数据库实例崩溃的时候存在两个地方:log buffer中:这些日志肯定是事务没有提交的脏块日志信息
redo log中:而这些日志是事务已经提交的脏块数据信息

已提交的事务所对应的日志一定写入了磁盘上了,而没有提交的事务对应的日志不一定写入磁盘上
对于写入磁盘的日志所对应的脏块就可以恢复


oracle的实例崩溃后,oracle就可以使用redo log 给构造出来
构造出来的有已经提交的,和未提交的事务构造出来;oracle会把未提交的事务回滚


oracle发现实例崩溃需要构造数据出来
oracle需要从控制文件中找到检查点队列的LRBA地址,通过LRBA找到日志的起点,到redo log的最后一条日志构造出脏数据
oracle会通过UNDO把未提交的数据,但可以构造出来的数据进行回滚


检查点队列_第3张图片

1、检查点队列 checkpoint queue
rba
lrba
hrba
on disk rba
2、ckpt进程
每隔3秒钟触发一次
记录检查点信息
触发DBWR进程

3、增量检查点并不会去更新数据文件头,以及控制文件中数据库SCN以及数据文件条目的SCN信息,而只是每3秒由CKPT进程去更新控制文件中的low cache rba信息,也就是检查点的位置。

select CPDRT,CPLRBA_SEQ||'.'||CPLRBA_BNO||'.'||CPLRBA_BOF "Low
RBA",CPODR_SEQ||'.'||CPODR_BNO||'.'||CPODR_BOF "On disk RBA",CPODS,CPODT,CPHBT from x$kcccp;

CPDRT列是检查点队列中的脏块数目.
CPODS列是on disk rba的scn
CPODT列是on disk rba的时间戳
CPHBT列是心跳

如果发生了实例崩溃,只需要在日志文件中找到检查点位置(low cache rba),从此处开始应用所有的重做日志文件,就完成了前滚操作。实例崩溃后,再次启动数据库,oracle会到控制文件中读取low cache rba,这就是检查点位置。从此处开始应用重做日志,应用到on disk rba的位置。on disk rba是磁盘中重做日志文件的最后一条重做记录的rba。

相关操作

select checkpoint_change# from v$database

alter system checkpoint

alter system switch logfile

select name,checkpoint_change# from v$datafile


select name,checkpoint_change# from v$datafile_header

select * from v$log;

begin
for i in 1..10000 loop
insert into t2 values(1,'xkj');
commit;
end loop;
end;
select * from t2

alter system flush buffer_cache

你可能感兴趣的:(队列)