[20190312]關於增量檢查點的疑問(補充).txt

lfree發表於2019-03-12

[20190312]關於增量檢查點的疑問(補充).txt


--//有人問我以前寫一個帖子的問題,關於增量檢查點的問題,連結如下:http://blog.itpub.net/267265/viewspace-2136817/

--//實際上我自己看以前寫的帖子一下子有點蒙,主要出現low_rba16=0xffffffff.ffffffff.ffff,為什麼恢復的起點是on_disk_rba16.

--//先簡單說明一下:

--//oracle現在寫髒塊基本採用增量檢查點,即使日誌切換,實際上執行也是增量檢查點,除非執行alter system checkpoint,或者

--//shutdown immediate(normal)正常關閉資料庫,如果異常關閉資料庫,啟動時執行崩潰恢復(crash recovery),恢復起點從low_rba.

--//先驗證這樣的情況:


1.環境:

SCOTT@book> @ ver1

PORT_STRING         VERSION        BANNER

------------------- -------------- ----------------------------------------------------------------------------

x86_64/Linux 2.4.xx 11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production


--//寫一個指令碼check.sql,以前寫的太複雜,簡單一點:

--// x$kccrt 記錄全檢查點

--// x$kcccp 記錄增量檢查點


$ cat check.sql

column "full checkpoint_rba" format a21

column low_rba format a20

column low_rba16 format a20

column on_disk_rba format a20

column on_disk_rba16 format a20

column rtckp_rba format a20

column diff_date format 9999999.99

rem column CPOSD_ono_disk_rba_scn format 99999999999999999999999999999999

column cpdrt heading "檢查點佇列|髒塊數量|CPDRT"

column cpodt_on_disk_rba heading "檢查點佇列|on disk rba|時間戳|CPODT"

column cpods heading "檢查點佇列|on disk rba scn|CPODS"

column cphbt heading "檢查點心跳|CPHBT"

column current_sysdate heading "當前時間|SYSDATE"

set num 12


SELECT b.cplrba_seq || '.' || b.cplrba_bno || '.' || b.cplrba_bof "low_rba"

      ,b.cpodr_seq || '.' || b.cpodr_bno || '.' || b.cpodr_bof "on_disk_rba"

      ,b.CPODS "on_disk_rba_scn(CPODS)"

      ,TO_DATE (b.CPODT, 'MM-DD-YYYY HH24:MI:SS') "on_disk_rba_time(CPODT)"

      ,a.rtckp_rba_seq || '.' || a.rtckp_rba_bno || '.' || a.rtckp_rba_bof

          "full checkpoint_rba"

      ,a.rtckp_scn "full_checkpoint(rtckp_scn)"

      ,TO_DATE (a.rtckp_tim, 'MM-DD-YYYY HH24:MI:SS')

          "full_checkpoint_time_rtckp_tim"

      ,b.CPODS - a.rtckp_scn "diff_scn(on_disk_rdb-ch_scn)"

      ,a.rtcln "current_group"

      ,sysdate current_sysdate

      ,CPDRT

  FROM x$kccrt a, x$kcccp b

 WHERE a.rtnum = b.cptno AND A.INST_ID = b.inst_id;


2.測試:

SYS@book> shutdown  abort ;

ORACLE instance shut down.


SYS@book> startup mount

ORACLE instance started.

Total System Global Area    643084288 bytes

Fixed Size                    2255872 bytes

Variable Size               205521920 bytes

Database Buffers            427819008 bytes

Redo Buffers                  7487488 bytes

Database mounted.


SYS@book> archive log list

Database log mode              Archive Mode

Automatic archival             Enabled

Archive destination            /u01/app/oracle/archivelog/book/

Oldest online log sequence     787

Next log sequence to archive   789

Current log sequence           789


SYS@book> @ check

                                                                                                                                                                                         檢查點佇列

                                                                                                                                                                   當前時間                髒塊數量

low_rba     on_disk_rba on_disk_rba_scn( on_disk_rba_time(CP full checkpoint_rba   full_checkpoint( full_checkpoint_tim diff_scn(on_disk_rdb-ch_scn) current_group SYSDATE                    CPDRT

----------- ----------- ---------------- ------------------- --------------------- ---------------- ------------------- ---------------------------- ------------- ------------------- ------------

789.5775.0  789.5955.0  13278979623      2019-03-12 11:20:53 789.1890.16           13278977341      2019-03-12 10:52:50                         2282             2 2019-03-12 11:21:42           12


--//看看日誌應用的起點是否從low_rba開始.


SYS@book> alter database open ;

Database altered.


--//檢視alert.log日誌:

Beginning crash recovery of 1 threads

 parallel recovery started with 23 processes

Started redo scan

Completed redo scan

 read 90 KB redo, 12 data blocks need recovery

Started redo application at

 Thread 1: logseq 789, block 5775

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~=>起點對應low_rba=789.5775.0

Recovery of Online Redo Log: Thread 1 Group 2 Seq 789 Reading mem 0

  Mem# 0: /mnt/ramdisk/book/redo02.log

Completed redo application of 0.00MB

Completed crash recovery at

 Thread 1: logseq 789, block 5956, scn 13278999624

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~=>結束對應on_disk_rba=789.5955.0加1個塊(512位元組redo),scn號對應on_disk_rba_scn+1.

 12 data blocks read, 12 data blocks written, 90 redo k-bytes read

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

--//5955-5775 = 180,應用日誌180塊,日誌檔案每塊512位元組.

--//180*512/1024 = 90k,這些正好對上.

Tue Mar 12 11:23:26 2019

LGWR: STARTING ARCH PROCESSES

Tue Mar 12 11:23:26 2019

ARC0 started with pid=45, OS id=56804

ARC0: Archival started

LGWR: STARTING ARCH PROCESSES COMPLETE

ARC0: STARTING ARCH PROCESSES

Thread 1 advanced to log sequence 790 (thread open)

Thread 1 opened at log sequence 790

--//日誌切換使用新日誌.

  Current log# 3 seq# 790 mem# 0: /mnt/ramdisk/book/redo03.log

Successful open of redo thread 1

MTTR advisory is disabled because FAST_START_MTTR_TARGET is not set

Tue Mar 12 11:23:27 2019

SMON: enabling cache recovery


--//也就是異常關閉後,crash recovery的起點從low_rba到on_disk_rba,完成後scn號+1,日誌塊號加1.日誌切換使用新日誌.


3.如果low_rba16=0xffffffff.ffffffff.ffff呢?


SYS@book> alter system checkpoint ;

System altered.


SYS@book> @ check

                                                                                                                                                                                                           檢查點佇列

                                                                                                                                                                                     當前時間                髒塊數量

low_rba              on_disk_rba          on_disk_rba_scn( on_disk_rba_time(CP full checkpoint_rba   full_checkpoint( full_checkpoint_tim diff_scn(on_disk_rdb-ch_scn) current_group SYSDATE                    CPDRT

-------------------- -------------------- ---------------- ------------------- --------------------- ---------------- ------------------- ---------------------------- ------------- ------------------- ------------

4294967295.429496729 790.659.0            13279000486      2019-03-12 11:32:34 790.658.16            13279000485      2019-03-12 11:32:33                            1             3 2019-03-12 11:32:35            0

5.65535


--//等一會執行:

SYS@book> @ check

                                                                                                                                                                                                           檢查點佇列

                                                                                                                                                                                     當前時間                髒塊數量

low_rba              on_disk_rba          on_disk_rba_scn( on_disk_rba_time(CP full checkpoint_rba   full_checkpoint( full_checkpoint_tim diff_scn(on_disk_rdb-ch_scn) current_group SYSDATE                    CPDRT

-------------------- -------------------- ---------------- ------------------- --------------------- ---------------- ------------------- ---------------------------- ------------- ------------------- ------------

4294967295.429496729 790.678.0            13279000505      2019-03-12 11:32:53 790.658.16            13279000485      2019-03-12 11:32:33                           20             3 2019-03-12 11:32:54            0

5.65535



--//你可以發現alter system checkpoint 後,如果沒有事務low_rba16=0xffffffff.ffffffff.ffff,而on_disk_rba一直在增加.而CPDRT=0.

--//似乎11g不知道為什麼在"空轉"(沒有事務產生的情況下)的情況,日誌也在不斷增加,不知道為什麼?


SYS@book> shutdown  abort ;

ORACLE instance shut down.


SYS@book> startup mount

ORACLE instance started.

Total System Global Area    643084288 bytes

Fixed Size                    2255872 bytes

Variable Size               205521920 bytes

Database Buffers            427819008 bytes

Redo Buffers                  7487488 bytes

Database mounted.


SYS@book> @ check

                                                                                                                                                                                                           檢查點佇列

                                                                                                                                                                                     當前時間                髒塊數量

low_rba              on_disk_rba          on_disk_rba_scn( on_disk_rba_time(CP full checkpoint_rba   full_checkpoint( full_checkpoint_tim diff_scn(on_disk_rdb-ch_scn) current_group SYSDATE                    CPDRT

-------------------- -------------------- ---------------- ------------------- --------------------- ---------------- ------------------- ---------------------------- ------------- ------------------- ------------

4294967295.429496729 790.705.0            13279000532      2019-03-12 11:33:20 790.658.16            13279000485      2019-03-12 11:32:33                           47             3 2019-03-12 11:36:09            0

5.65535


--//可以發現這個時候low_rba16=0xffffffff.ffffffff.ffff,這個時候恢復的起點從那裡開始,實際上從on_disk_rba開始,或者講根本沒

--//有恢復,CPDRT=0也是佐證,雖然當時on_disk_rba還在不斷增加.


SYS@book> alter database open ;

Database altered.


--//檢視alert.log:

Beginning crash recovery of 1 threads

 parallel recovery started with 23 processes

Started redo scan

Completed redo scan

 read 0 KB redo, 0 data blocks need recovery

Started redo application at

 Thread 1: logseq 790, block 705, scn 13279000532

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~=>起點對應on_disk_rba=790.705.0

Recovery of Online Redo Log: Thread 1 Group 3 Seq 790 Reading mem 0

  Mem# 0: /mnt/ramdisk/book/redo03.log

Completed redo application of 0.00MB

Completed crash recovery at

 Thread 1: logseq 790, block 706, scn 13279020533

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~=>結束對應on_disk_rba=790.705.0加1個塊(512位元組redo),scn號對應on_disk_rba_scn+1. 

 0 data blocks read, 0 data blocks written, 0 redo k-bytes read

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~=> 日誌應用0K.

Tue Mar 12 11:39:33 2019

LGWR: STARTING ARCH PROCESSES

Tue Mar 12 11:39:33 2019

ARC0 started with pid=45, OS id=56980

ARC0: Archival started

LGWR: STARTING ARCH PROCESSES COMPLETE

ARC0: STARTING ARCH PROCESSES

Thread 1 advanced to log sequence 791 (thread open)

Thread 1 opened at log sequence 791

--//日誌切換使用新日誌.

  Current log# 1 seq# 791 mem# 0: /mnt/ramdisk/book/redo01.log

Successful open of redo thread 1

MTTR advisory is disabled because FAST_START_MTTR_TARGET is not set

Tue Mar 12 11:39:34 2019

SMON: enabling cache recovery


4.我在原連結寫一個指令碼:

SCOTT@book> create table t1 as select * from all_objects ;

Table created.


$ cat a.sql 

alter system checkpoint; 

alter system checkpoint; 

alter system checkpoint; 

@ check

update scott.t1 set object_name=object_name where rownum=1 ; 

commit; 

host sleep 3 

@ check



SYS@book> @ a.sql

System altered.

System altered.

System altered.

                                                                                                                                                                                                           檢查點佇列

                                                                                                                                                                                     當前時間                髒塊數量

low_rba              on_disk_rba          on_disk_rba_scn( on_disk_rba_time(CP full checkpoint_rba   full_checkpoint( full_checkpoint_tim diff_scn(on_disk_rdb-ch_scn) current_group SYSDATE                    CPDRT

-------------------- -------------------- ---------------- ------------------- --------------------- ---------------- ------------------- ---------------------------- ------------- ------------------- ------------

4294967295.429496729 791.21362.0          13279021797      2019-03-12 11:52:59 791.21362.16          13279021800      2019-03-12 11:53:00                           -3             1 2019-03-12 11:53:01            0

5.65535

1 row updated.

Commit complete.

                                                                                                                                                                                                           檢查點佇列

                                                                                                                                                                                     當前時間                髒塊數量

low_rba              on_disk_rba          on_disk_rba_scn( on_disk_rba_time(CP full checkpoint_rba   full_checkpoint( full_checkpoint_tim diff_scn(on_disk_rdb-ch_scn) current_group SYSDATE                    CPDRT

-------------------- -------------------- ---------------- ------------------- --------------------- ---------------- ------------------- ---------------------------- ------------- ------------------- ------------

791.21363.0          791.21366.0          13279021805      2019-03-12 11:53:02 791.21362.16          13279021800      2019-03-12 11:53:00                            5             1 2019-03-12 11:53:04            3


--//注意看發生事務前後的low_rba,on_disk_rba.不好描述,自己看.^_^.

--//一旦有事務產生,你可以發現low_rba不再是4294967295.4294967295.65535.

--//很奇怪不知道為什麼11g下在沒有事務的情況下會"空轉",這樣11g的日誌即使是很空閒的資料庫日誌增加也會比10g大.


5.看看10g的情況:

SYS@192.168.100.33:1521/test> @ ver1


PORT_STRING                    VERSION        BANNER

------------------------------ -------------- ----------------------------------------------------------------

x86_64/Linux 2.4.xx            10.2.0.4.0     Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi


SYS@192.168.100.33:1521/test> alter system checkpoint ;

System altered.


SYS@192.168.100.33:1521/test> @ check

                                                                                                                                                                                                           檢查點佇列

                                                                                                                                                                                     當前時間                髒塊數量

low_rba              on_disk_rba          on_disk_rba_scn( on_disk_rba_time(CP full checkpoint_rba   full_checkpoint( full_checkpoint_tim diff_scn(on_disk_rdb-ch_scn) current_group SYSDATE                    CPDRT

-------------------- -------------------- ---------------- ------------------- --------------------- ---------------- ------------------- ---------------------------- ------------- ------------------- ------------

4294967295.429496729 1497.42866.0         14987614992      2019-03-12 11:55:37 1497.42866.16         14987615031      2019-03-12 11:57:34                          -39             3 2019-03-12 11:57:35            0

5.65535



SYS@192.168.100.33:1521/test> @ check

                                                                                                                                                                                                           檢查點佇列

                                                                                                                                                                                     當前時間                髒塊數量

low_rba              on_disk_rba          on_disk_rba_scn( on_disk_rba_time(CP full checkpoint_rba   full_checkpoint( full_checkpoint_tim diff_scn(on_disk_rdb-ch_scn) current_group SYSDATE                    CPDRT

-------------------- -------------------- ---------------- ------------------- --------------------- ---------------- ------------------- ---------------------------- ------------- ------------------- ------------

4294967295.429496729 1497.42866.0         14987614992      2019-03-12 11:55:37 1497.42866.16         14987615031      2019-03-12 11:57:34                          -39             3 2019-03-12 11:58:29            0

5.65535


--//注意看執行時間2019-03-12 11:57:35 -2019-03-12 11:58:29 之間,沒有任何事務產生,on_disk_rba根本不變化.這樣10g日誌產生量

--//明顯比11g小.


6.我改上面的指令碼check.sql:

--//最後加入host sleep 1.執行如下:


$ rlsql -s -l sys/oracle as sysdba <<EOF

> $(seq 100| xargs -I{} cat /home/oracle/sqllaji/check.sql)

> EOF


                                                                                                                                                                                                           檢查點佇列

                                                                                                                                                                                     當前時間                髒塊數量

low_rba              on_disk_rba          on_disk_rba_scn( on_disk_rba_time(CP full checkpoint_rba   full_checkpoint( full_checkpoint_tim diff_scn(on_disk_rdb-ch_scn) current_group SYSDATE                    CPDRT

-------------------- -------------------- ---------------- ------------------- --------------------- ---------------- ------------------- ---------------------------- ------------- ------------------- ------------

791.24582.0          791.24711.0          13279023352      2019-03-12 12:11:39 791.21362.16          13279021800      2019-03-12 11:53:00                         1552             1 2019-03-12 12:11:41            8



                                                                                                                                                                                                           檢查點佇列

                                                                                                                                                                                     當前時間                髒塊數量

low_rba              on_disk_rba          on_disk_rba_scn( on_disk_rba_time(CP full checkpoint_rba   full_checkpoint( full_checkpoint_tim diff_scn(on_disk_rdb-ch_scn) current_group SYSDATE                    CPDRT

-------------------- -------------------- ---------------- ------------------- --------------------- ---------------- ------------------- ---------------------------- ------------- ------------------- ------------

791.24582.0          791.24712.0          13279023353      2019-03-12 12:11:40 791.21362.16          13279021800      2019-03-12 11:53:00                         1553             1 2019-03-12 12:11:42            8



                                                                                                                                                                                                           檢查點佇列

                                                                                                                                                                                     當前時間                髒塊數量

low_rba              on_disk_rba          on_disk_rba_scn( on_disk_rba_time(CP full checkpoint_rba   full_checkpoint( full_checkpoint_tim diff_scn(on_disk_rdb-ch_scn) current_group SYSDATE                    CPDRT

-------------------- -------------------- ---------------- ------------------- --------------------- ---------------- ------------------- ---------------------------- ------------- ------------------- ------------

791.24582.0          791.24713.0          13279023354      2019-03-12 12:11:41 791.21362.16          13279021800      2019-03-12 11:53:00                         1554             1 2019-03-12 12:11:43            8


--//在沒有事務的情況下.每秒scn增加1,日誌塊增加1,是否更我訪問這些記憶體"表"有關,換1個方式測試,取消check.sql後面的host sleep 1,建立指令碼b.sql:

$ cat b.sql

@ check.sql

host sleep 30

@ check.sql



SYS@book> @ b.sql


                                                                                                                                                                                                           檢查點佇列

                                                                                                                                                                                     當前時間                髒塊數量

low_rba              on_disk_rba          on_disk_rba_scn( on_disk_rba_time(CP full checkpoint_rba   full_checkpoint( full_checkpoint_tim diff_scn(on_disk_rdb-ch_scn) current_group SYSDATE                    CPDRT

-------------------- -------------------- ---------------- ------------------- --------------------- ---------------- ------------------- ---------------------------- ------------- ------------------- ------------

791.24582.0          791.24852.0          13279023481      2019-03-12 12:13:41 791.21362.16          13279021800      2019-03-12 11:53:00                         1681             1 2019-03-12 12:13:43           19



                                                                                                                                                                                                           檢查點佇列

                                                                                                                                                                                     當前時間                髒塊數量

low_rba              on_disk_rba          on_disk_rba_scn( on_disk_rba_time(CP full checkpoint_rba   full_checkpoint( full_checkpoint_tim diff_scn(on_disk_rdb-ch_scn) current_group SYSDATE                    CPDRT

-------------------- -------------------- ---------------- ------------------- --------------------- ---------------- ------------------- ---------------------------- ------------- ------------------- ------------

791.24582.0          791.24882.0          13279023511      2019-03-12 12:14:11 791.21362.16          13279021800      2019-03-12 11:53:00                         1711             1 2019-03-12 12:14:13           19


--//確實每秒scn增加1,on_disk_rba也是增加每秒1塊.


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2638170/,如需轉載,請註明出處,否則將追究法律責任。

相關文章