有同事问我----"当发生log switch的时候,这时候oracle是会做full checkpoint还是incremental checkpoint?"
这个问题由来已久,itpub上也有朋友讨论过这个问题,有说是full checkpoint的,也有说是incremental checkpoint的,晶晶也曾撰文指出在log switch的时候,发生的是incremental checkpoint。
其实如果你深入了解full checkpoint和incremental checkpoint的区别,当是能回答出上述问题。
我们说:
在8i以前,log switch的时候oracle确实是会做full checkpoint;但从8i开始,oracle在log switch的时候做的是"incremental checkpoint",之所以这里要带上引号,是因为这里从严格意义上来说并不能完全算是incremental checkpoint(因为在log switch的时候,不仅会像incremental checkpoint那样更新control file,还会更新datafile header)。
实际上,在log switch的时候,发生的是oracle中的7种checkpoint类型之一的"Log Switch Checkpoint"。
我们来看一个实例,在这个例子里,我们证明了在log switch的时候,发生的既不是full checkpoint,也不是严格意义上的incremental checkpoint。
我们首先来证明在log switch的时候,发生的不是full checkpoint:
SQL> select group#,status from v$log;
GROUP# STATUS
---------- ----------------
1 INACTIVE
2 CURRENT
3 INACTIVE
SQL> alter system switch logfile;
System altered
执行完上述switch logfile操作后等待1分钟,然后再次执行上述查询语句:
SQL> select group#,status from v$log;
GROUP# STATUS
---------- ----------------
1 INACTIVE
2 ACTIVE
3 CURRENT
从结果里我们可以看到现在redo log group 2还是处于active状态,上述数据库只有我一个人用,很闲,如果switch logfile的时候发生的是full checkpoint,则当我等待1分钟后再次查询v$log的时候redo log group 2必然是处于inactive状态:
SQL> set time on
8:33:51 SQL> select group#,status from v$log;
GROUP# STATUS
---------- ----------------
1 INACTIVE
2 ACTIVE
3 CURRENT
8:33:57 SQL> alter system checkpoint;
System altered
8:34:08 SQL> select group#,status from v$log;
GROUP# STATUS
---------- ----------------
1 INACTIVE
2 INACTIVE
3 CURRENT
即现在我们已经证明了在log switch的时候,发生的不是full checkpoint。
现在我们来证明在log switch的时候,发生的不是严格意义上的incremental checkpoint。我们知道,incremental checkpoint只会更新control file,不会更新datafile header,我们证明的思路就来源于此:
BBED> set file 1
FILE# 1
BBED> set block 1
BLOCK# 1
BBED> p kcvfhckp
struct kcvfhckp, 160 bytes @140
struct kcvcpscn, 8 bytes @140
ub4 kscnbas @140 0xbb6aaade
ub2 kscnwrp @144 0x0008
ub4 kcvcptim @148 0x
ub2 kcvcpthr @152 0x0001
union u, 12 bytes @156
struct kcvcprba, 12 bytes @156
ub4 kcrbaseq @156 0x00000004
ub4 kcrbabno @160 0x
ub2 kcrbabof @164 0x0010
struct kcvcptr, 12 bytes @156
struct kcrtrscn, 8 bytes @156
ub4 kscnbas @156 0x00000004
ub2 kscnwrp @160 0x0000
ub4 kcrtrtim @164 0x001000ff
ub1 kcvcpetb[0] @168 0x02
......省略显示部分内容
ub1 kcvcpetb[128] @296 0x00
即现在的system01.dbf的datafile header的checkpoint scn的base是0xbb6aaade。
现在我执行一次switch logfile,再来观察system01.dbf的datafile header的checkpoint scn:
SQL> alter system switch logfile;
System altered
BBED> p kcvfhckp
struct kcvfhckp, 160 bytes @140
struct kcvcpscn, 8 bytes @140
ub4 kscnbas @140 0xbb6aaade
ub2 kscnwrp @144 0x0008
ub4 kcvcptim @148 0x
ub2 kcvcpthr @152 0x0001
union u, 12 bytes @156
struct kcvcprba, 12 bytes @156
ub4 kcrbaseq @156 0x00000004
ub4 kcrbabno @160 0x
ub2 kcrbabof @164 0x0010
struct kcvcptr, 12 bytes @156
struct kcrtrscn, 8 bytes @156
ub4 kscnbas @156 0x00000004
ub2 kscnwrp @160 0x0000
ub4 kcrtrtim @164 0x001000ff
ub1 kcvcpetb[0] @168 0x02
......省略显示部分内容
ub1 kcvcpetb[128] @296 0x00
我们发现现在的system01.dbf的datafile header的checkpoint scn的base还是0xbb6aaade,也就是说oracle在switch logfile的时候的checkpoint并不是马上发生,oracle在等待一个发生的时机。
我们现在强制让log switch checkpoint马上发生:
SQL> alter system switch logfile;
System altered
SQL> alter system switch logfile;
System altered
SQL> alter system switch logfile;
System altered
BBED> p kcvfhckp
struct kcvfhckp, 160 bytes @140
struct kcvcpscn, 8 bytes @140
ub4 kscnbas @140 0xbb6aac6e
ub2 kscnwrp @144 0x0008
ub4 kcvcptim @148 0x
ub2 kcvcpthr @152 0x0001
union u, 12 bytes @156
struct kcvcprba, 12 bytes @156
ub4 kcrbaseq @156 0x00000006
ub4 kcrbabno @160 0x00000002
ub2 kcrbabof @164 0x0010
struct kcvcptr, 12 bytes @156
struct kcrtrscn, 8 bytes @156
ub4 kscnbas @156 0x00000006
ub2 kscnwrp @160 0x0000
ub4 kcrtrtim @164 0x00100000
ub1 kcvcpetb[0] @168 0x02
......省略显示部分内容
ub1 kcvcpetb[128] @296 0x0
看到了吗?现在system01.dbf的datafile header的checkpoint scn的base已经变成了0xbb6aac6e,也就是说----在log switch的时候,发生的不是严格意义上的incremental checkpoint,因为其不仅更新了control file,还更新了datafile header。
最后,我们来说一下oracle中checkpoint的种类。oracle中的checkpoint一共有7种,它们分别是:
1、Full Checkpoint
2、Thread Checkpoint
3、File Checkpoint
4、Object Checkpoint
5、Parallel Query Checkpoint
6、Incremental Checkpoint
7、Log Switch Checkpoint
Leave a comment