实验环境:
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
参考资料:https://www.askmac.cn/archives/drop-user-object-checkpoint.html
