ORACLE資料庫檢視ACQ(ACTIVE CHECKPOINT QUEUE)資訊

badguy001djh發表於2022-03-27

實驗環境:

11.2.0.4單機Oracle資料庫,Oracle Linux 6.5,X86_64,資料庫名ORCL

ACQ(ACTIVE CHECKPOINT QUEUE),活動檢查點佇列。當出發checkpoint請求後,系統會記錄一個的SCN跟RBA,稱為checkpoint SCN,checkpoint RBA。checkpoint SCN,checkpoint RBA會作為一個活動檢查點被放入ACQ裡面。然後DBWR程式會把髒塊中LRBA小於等於此checkpoint RBA的髒塊寫入儲存,當全部髒塊寫完後,CKPT程式將checkpoint SCN寫入到資料檔案頭以及控制檔案中。最後此活動檢查點從ACQ中去除。

下面介紹3種方法檢視ORACLE資料庫ACQ資訊

1.  x$activeckpt系統檢視

X$ACTIVECKPT代表活躍的檢查點佇列,ckpt_type代表了不同型別的檢查點,其中7代表Incremental checkpoint,3代表Full checkpoint,0代表沒有記錄活動檢查點資訊。此檢視中NXT_ACT_ENT,PRV_ACT_ENT分別指向了下一個活動檢查點的記憶體地址,前一個活動檢查點的記憶體地址。第一個活動檢查點記錄指向的前一個活動檢查點與最後一個活動檢查點記錄指向的後一個活動檢查點稱為queuehead,queuehead沒有包括實際的檢查點資訊,是用作表示ACQ的入口,並指向前一個活動檢查點及後一個活動檢查點。

x$activeckpt系統檢視結構:

ADDR                ,
INDX                ,
INST_ID             ,   --例項id
NXT_ACT_ENT         ,   --下一個活動檢查點條目的記憶體地址
PRV_ACT_ENT         ,   --上一個活動檢查點條目的記憶體地址
NXT_CHLD_ENT        ,
PRV_CHLD_ENT        ,
CKPT_SCN_BAS        ,   --活動檢查點SCN BASE
CKPT_SCN_WRP        ,   --活動檢查點SCN WARP
CKPT_TIM            ,   --1987/5/14 到發出檢查點的時刻之間的秒數
CKPT_ALLOC_THR      ,   --活動檢查點rba中redo thread
CKPT_RBA_SEQ        ,   --活動檢查點rba中redo SEQUENCE
CKPT_RBA_BNO        ,   --活動檢查點rba中redo block
CKPT_RBA_BOF        ,   --活動檢查點rba中redo block, offset
CKPT_EN_THR_BITVEC  ,   
RCV_SO              ,
CKPT_ID             ,
TSN#                ,
OBJ_ID              ,
CKPT_ABS_FIL_NUM    ,
CKPT_NUM_FILES_EXPTD,
CKPT_ENQUEUE        ,
PARENT_ENT          ,
CKPT_FILES_TOTAL    ,
CKPT_WAITER         ,
CKPT_BUFFER_CNT     ,
CKPT_TYPE           ,   --檢查點型別,7:Incremental checkpoint,3:Full checkpoint,10:object reuse/truncate checkpoint,11:object checkpoint
CKPT_PRIORITY       ,   --檢查點優先順序
CKPT_FLAGS              --檢查點標誌

      2.  10347 EVENT

10347 跟蹤事件,列印出ACTIVE CHECKPOINT QUEUE資訊以及快取塊頭資訊。使用oradebug關聯到CKPT程式(oradebug setorapname ckpt;),然後使用oradebug設定事件(oradebug SESSION_EVENT 10347 trace name context;),最後執行alter system checkpoint;,在CKPT程式的trace檔案中便會有對應的記錄。設定此事件後只能出發一次,如果想要再次觸發10347事件需要重新設定10347事件。

--session 1
SQL> oradebug setorapname ckpt
Oracle pid: 12, Unix process pid: 7435, image: oracle@rac1 (CKPT)
SQL> oradebug SESSION_EVENT 10347 trace name context;
Statement processed.
--session 2
SQL> alter system checkpoint;
--session 1
SQL> oradebug tracefile_name;
/u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ckpt_7435.trc
SQL> !tail -n 500 /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ckpt_7435.trc
……
 
*** 2022-03-27 16:23:22.576
Active Checkpoint Queue dump
Queuehead: 0x6001ce90      --佇列頭記憶體地址
hd_kcbkacq: [0xc1662b88,0xbf7f5870]    --下一活動檢查點條目記憶體地址,上一活動檢查點條目記憶體地址,X$ACTIVECKPT. NXT_ACT_ENT,X$ACTIVECKPT. PRV_ACT_ENT
fl_kcbkacq: 0xc2dd9898
flg_kcbkacq: 0x0
pc_kcbkach[0]: 0
pc_kcbkach[1]: 1
pc_kcbkach[2]: 1
pc_kcbkach[3]: 0
tc_kcbkach[0]: 0
tc_kcbkach[1]: 0
tc_kcbkach[2]: 0
tc_kcbkach[3]: 1
tc_kcbkach[4]: 0
tc_kcbkach[5]: 0
tc_kcbkach[6]: 0
tc_kcbkach[7]: 0
tc_kcbkach[8]: 0
tc_kcbkach[9]: 0
tc_kcbkach[10]: 0
tc_kcbkach[11]: 0
tc_kcbkach[12]: 0
  Queue Entries for queuehead 0x6001ce90.
    Entry: 0xc1662b88      --第一個活動檢查點條目記憶體地址
    lk_kcbkace: [0xbf7f7c48,0x6001ce90] ch_kcbkace: [0xc1662b98,0xc1662b98]   -- lk_->link,雙向連結串列,下一活動檢查點條目記憶體地址,上一活動檢查點條目記憶體地址,X$ACTIVECKPT.NXT_ACT_ENT,X$ACTIVECKPT.PRV_ACT_ENT
    scn_kcbkace: scn: 0x0000.000fa6a5 rba_kcbkace: [0x5.4ce5.10]    --活動檢查點SCN,活動檢查點RBA,X$ACTIVECKPT.CKPT_SCN_XXX,X$ACTIVECKPT.CKPT_RBA_XXX
    rq_kcbkace: 0x0, ckid_kcbkace: 0x0 tsn_kcbkace: 0x4, obj_kcbkace: 0x9d607ec
    afn_kcbkace: 0x0, pa_kcbkace: 0x0
    fcnt_kcbkace: 0x0, wa_kcbkace: 0x0
    ctyp_kcbkace: Thread Checkpoint pr_kcbkace: Med     --檢查點型別,檢查點優先順序,X$ACTIVECKPT.CKPT_TYPE,X$ACTIVECKPT.CKPT_PRIORITY
    flg_kcbkace: Cross instance call.     --檢查點標誌,X$ACTIVECKPT.CKPT_FLAGS
    nf_kcbkace: 0, eq_kcbkace =0x0
===============
    Entry: 0xbf7f7c48   --第二個活動檢查點條目記憶體地址
    lk_kcbkace: [0xbf7f6c20,0xc1662b88] ch_kcbkace: [0xbf7f7c58,0xbf7f7c58]
    scn_kcbkace: scn: 0xffff.ffffffff rba_kcbkace: [0xffffffff.ffffffff.ffff]
    rq_kcbkace: 0x0, ckid_kcbkace: 0x0 tsn_kcbkace: 0x4, obj_kcbkace: 0x9d607ec
    afn_kcbkace: 0x0, pa_kcbkace: 0x0
    fcnt_kcbkace: 0x0, wa_kcbkace: 0x0
    ctyp_kcbkace: Incremental Checkpoint pr_kcbkace: Low
    flg_kcbkace: Being serviced by dbwr 0
Incremental Checkpoint.
nf_kcbkace: 0, eq_kcbkace =0x0
……

      3.       dump記憶體

--用oradebug dump fixed sga,使用關鍵詞acq_找到ACQ佇列頭地址
SQL> oradebug setmypid
Statement processed.
SQL> oradebug unlimit;
Statement processed.
SQL> oradebug dumpsga 2253784;
Statement processed.
SQL> oradebug tracefile_name
/u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_10004.trc
SQL> !grep acq_ /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_10004.trc
struct kcbkach kcbkacq_ [06001CE90, 06001CF28) = BF7F7C48 00000000 BF7F5870 ...
--使用gdb dump記憶體檢視資料
[oracle@rac1 ~]$ ps -ef | grep smon
oracle    7437     1  0 11:10 ?        00:00:00 ora_smon_orcl
oracle   10037  6717  0 17:05 pts/1    00:00:00 grep smon
[oracle@rac1 ~]$ gdb $ORACLE_HOME/bin/oracle -p 7437
--dump出ACQ佇列頭的資料
(gdb) x/19xg 0x06001CE90
0x6001ce90:     0x00000000c1662b88      0x00000000bf7f5870   --下一個活動檢查點條目的記憶體地址,上一活動檢查點條目記憶體地址,X$ACTIVECKPT.NXT_ACT_ENT,X$ACTIVECKPT.PRV_ACT_ENT
0x6001cea0:     0x00000000c2dd9898      0x0000000100000001
0x6001ceb0:     0x0000000000000000      0x0000000000000000
0x6001cec0:     0x0000000100000000      0x0000000000000000
0x6001ced0:     0x0000000000000000      0x0000000000000000
0x6001cee0:     0x0000000000000000      0x0000000000000000
0x6001cef0:     0x00000000c1662b88      0x0000000000000000
0x6001cf00:     0x0000000300000000      0x0000000000000000
0x6001cf10:     0x0000000000000000      0x0000000000000000
0x6001cf20:     0x00000000bf7f5870
--dump出第一個活動檢查點條目資料
(gdb) x/2xg 0x00000000c1662b88
0xc1662b88:     0x00000000bf7f7c48      0x000000006001ce90   --下一個活動檢查點條目的記憶體地址,上一活動檢查點條目記憶體地址,X$ACTIVECKPT.NXT_ACT_ENT,X$ACTIVECKPT.PRV_ACT_ENT
(gdb) x/2xg 0x00000000c1662b88+16*2
0xc1662ba8:     0x096d0000000fac43      0x0096000141979293   --0-3 BYTES:SCN BASE, X$ACTIVECKPT. CKPT_SCN_BAS;4-5 BYTES:SCN WRAP, X$ACTIVECKPT.CKPT_SCN_WRP;8-11 BYTES:X$ACTIVECKPT.CKPT_TIM
(gdb) x/2xg 0x00000000c1662b88+16*3
0xc1662bb8:     0x0000000200000006      0x0000000200000010   --0-3 BYTES: X$ACTIVECKPT.CKPT_RBA_SEQ;4-7 BYTES:X$ACTIVECKPT.CKPT_RBA_BNO;8-9 BYTES:X$ACTIVECKPT.CKPT_RBA_BOF
(gdb) x/2xg 0x00000000c1662b88+16*26
0xc1662d28:     0x0000000300000000      0x0000000000000000   --4-7 BYTES:X$ACTIVECKPT.CKPT_TYPE,8-11 BYTES:X$ACTIVECKPT.CKPT_PRIORITY;12-15 BYTES:X$ACTIVECKPT.CKPT_FLAGS


 參考資料:


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

相關文章