log switch checkpoint

| No Comments

有同事问我----"当发生log switch的时候,这时候oracle是会做full checkpoint还是incremental checkpoint?"

 

这个问题由来已久,itpub上也有朋友讨论过这个问题,有说是full checkpoint的,也有说是incremental checkpoint的,晶晶也曾撰文指出在log switch的时候,发生的是incremental checkpoint

 

其实如果你深入了解full checkpointincremental checkpoint的区别,当是能回答出上述问题。

 

我们说:

8i以前,log switch的时候oracle确实是会做full checkpoint;但从8i开始,oraclelog switch的时候做的是"incremental checkpoint",之所以这里要带上引号,是因为这里从严格意义上来说并不能完全算是incremental checkpoint(因为在log switch的时候,不仅会像incremental checkpoint那样更新control file,还会更新datafile header)。

 

实际上,在log switch的时候,发生的是oracle中的7checkpoint类型之一的"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      0x2a122556

   ub2 kcvcpthr                             @152      0x0001

   union u, 12 bytes                        @156    

      struct kcvcprba, 12 bytes             @156    

         ub4 kcrbaseq                       @156      0x00000004

         ub4 kcrbabno                       @160      0x0000000f

         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.dbfdatafile headercheckpoint scnbase0xbb6aaade

 

现在我执行一次switch logfile,再来观察system01.dbfdatafile headercheckpoint 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      0x2a122556

   ub2 kcvcpthr                             @152      0x0001

   union u, 12 bytes                        @156    

      struct kcvcprba, 12 bytes             @156    

         ub4 kcrbaseq                       @156      0x00000004

         ub4 kcrbabno                       @160      0x0000000f

         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.dbfdatafile headercheckpoint scnbase还是0xbb6aaade,也就是说oracleswitch 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      0x2a1229b6

   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.dbfdatafile headercheckpoint scnbase已经变成了0xbb6aac6e,也就是说----在log switch的时候,发生的不是严格意义上的incremental checkpoint,因为其不仅更新了control file,还更新了datafile header

 

最后,我们来说一下oraclecheckpoint的种类。oracle中的checkpoint一共有7种,它们分别是:

1Full Checkpoint

2Thread Checkpoint

3File Checkpoint

4Object Checkpoint

5Parallel Query Checkpoint

6Incremental Checkpoint

7Log Switch Checkpoint

Leave a comment