X$KCCCP——[K]ernel [C]ache [C]ontrolfile management [c]heckpoint [p]rogress
SQL> DESC X$KCCCP;
名称 是否为空? 类型
----------------------------------------------------- -------- --------------
ADDR RAW(4)
INDX NUMBER
-----通常只需要关心indx=0
INST_ID NUMBER
CPTNO NUMBER
CPSTA NUMBER
CPFLG NUMBER
CPDRT NUMBER
----select count(*) from v$bh where dirty='Y';检查点队列中的脏块数
CPRDB NUMBER
CPLRBA_SEQ NUMBER
----最后一次增量检查点中LOW RBA中的序列号
CPLRBA_BNO NUMBER
----最后一次增量检查点在LOW RBA中的块数
CPLRBA_BOF NUMBER
----最后一次增量检查点在LOW RBA中的偏移量
CPODR_SEQ NUMBER
----已写入日志文件的最后一个RBA的序列号=current日志$log.sequence#
CPODR_BNO NUMBER
----已写入日志文件最后一个RBA的块数
CPODR_BOF NUMBER
----已写入日志文件最后一个RBA的偏移量
CPODS VARCHAR2(16)
---- on disk rba 的 scn
CPODT VARCHAR2(20)
---- on disk rba 的时间
CPODT_I NUMBER
CPHBT NUMBER
-----心跳,每三秒钟加一
CPRLS VARCHAR2(16)
CPRLC NUMBER
CPMID NUMBER
CPSDR_SEQ NUMBER
CPSDR_BNO NUMBER
CPSDR_ADB NUMBE
检查点队列中的脏块数
SQL> select cpdrt dirty,cpods on_disk_scn,cpodt on_disk_time,cphbt from x$kcccp where indx=0;
DIRTY ON_DISK_SCN ON_DISK_TIME CPHBT
---------- ---------------- -------------------- ----------
38 2346941 12/27/2009 23:17:56 706789519
SQL> select count(*) from v$bh where dirty='Y';
COUNT(*)
----------
38
当前日志序列号
SQL> select cpodr_seq,cpodr_bno from x$kcccp where indx=0;
CPODR_SEQ CPODR_BNO
---------- ----------
33 30160
SQL> select sequence# from v$log where status='CURRENT';
SEQUENCE#
----------
33
完全检查点
SQL> select CPLRBA_SEQ as cur_seq#,
2 CPLRBA_BNO as cur_blk#,
3 CPODR_SEQ as stop_seq#,
4 CPODR_BNO as stop_blk#
5 from x$kcccp
6 where CPODR_SEQ>0;
CUR_SEQ# CUR_BLK# STOP_SEQ# STOP_BLK#
---------- ---------- ---------- ----------
37 97550 37 97778
SQL> select count(*) from v$bh where dirty='Y';
COUNT(*)
----------
63
SQL> alter system checkpoint;
系统已更改。
SQL> select count(*) from v$bh where dirty='Y';
COUNT(*)
----------
0
很明显,发出该命令以后,内存里所有脏块都被写入了数据文件,于是内存里就没有脏块了。
打开跟踪文件,可以看到:
Beginning global checkpoint up to RBA [0x25.17df2.10], SCN: 662364
Completed checkpoint up to RBA [0x25.17df2.10], SCN: 662364
SQL> select to_number('25','xx') from dual;
TO_NUMBER('25','XX')
--------------------
37
SQL> select to_number('17df2','xxxxxxxx') from dual;
TO_NUMBER('17DF2','XXXXXXXX')
-----------------------------
97778
将其与x$kcccp的查询结果比较一下,也可以看到,在完全检查点中,截至写入数据文件的脏块所对应的redo entry对应到STOP_SEQ#和STOP_BLK#所指明的redo entry为止。