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为止。