[20150910]關于對象級檢查點.txt
--oracle從8i以後基本使用增量檢查點取代原來的檢查點模式,但是如果一個對象表被drop,truncate時也要将這些髒塊寫檔案.
--這個叫Object level Checkpoint,如何驗證這個過程,實際上很簡單僅僅需要檢查v$bh或者x$bh視圖,或者轉儲髒塊看看裡面
--的内容是否存在變化,來驗證這個過程,還是通過例子來說明:
--我個人喜歡使用bbed觀察,效果與塊轉儲一直。
1.建立測試環境:
SCOTT@test> @ver1
PORT_STRING VERSION BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx 11.2.0.3.0 Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
SCOTT@test> show parameter alert
NAME TYPE VALUE
------------------------- -------- --------
log_checkpoints_to_alert boolean TRUE
--設定log_checkpoints_to_alert=true,主要是為了測試需要,如果存在full checkpoint以及增量檢查會寫alert日志檔案。
create table t1 as select 1 id1 ,cast('aaaa' as varchar2(20)) name from dual ;
create table t2 as select 2 id1 ,cast('bbbb' as varchar2(20)) name from dual ;
SCOTT@test> select rowid,t1.* from t1;
ROWID ID1 NAME
------------------ ---------- --------------------
AABMuyAAEAAAACjAAA 1 aaaa
SCOTT@test> @rowid AABMuyAAEAAAACjAAA
OBJECT FILE BLOCK ROW DBA TEXT
---------- ---------- ---------- ---------- -------------------- ----------------------------------------
314290 4 163 0 4,163 alter system dump datafile 4 block 163 ;
SCOTT@test> select rowid,t2.* from t2;
AABMuzAAEAAAAITAAA 2 bbbb
SCOTT@test> @rowid AABMuzAAEAAAAITAAA
314291 4 531 0 4,531 alter system dump datafile 4 block 531 ;
alter system checkpoint;
--檢視alert日志:
Fri Sep 11 09:26:47 2015
Beginning global checkpoint up to RBA [0xe09.dcac.10], SCN: 13200870007
Completed checkpoint up to RBA [0xe09.dcac.10], SCN: 13200870007
2.測試:
SCOTT@test> @bh 4 163
HLADDR DBARFIL DBABLK CLASS CLASS_TYPE STATE TCH CR_SCN_BAS CR_SCN_WRP CR_UBA_FIL CR_UBA_BLK CR_UBA_SEQ BA OBJECT_NAME
---------------- ------- ----------- ----- ------------------ ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------------- --------------------
00000000BC91E120 4 163 1 data block xcur 1 0 0 0 0 0 000000008FD54000 T1
00000000BC91E120 4 163 1 data block free 0 0 0 0 0 0 0000000093ED4000
SCOTT@test> @bh 4 531
00000000BC78AD68 4 531 1 data block xcur 1 0 0 0 0 0 0000000090D20000 T2
update t1 set name=upper(name) where id1=1;
update t2 set name=upper(name) where id1=2;
00000000BC91E120 4 163 1 data block xcur 1 0 0 0 0 0 0000000094B60000 T1
00000000BC91E120 4 163 1 data block cr 1 315968373 3 0 0 0 000000008FD54000 T1
00000000BC78AD68 4 531 1 data block xcur 1 0 0 0 0 0 00000000925AA000 T2
00000000BC78AD68 4 531 1 data block cr 1 315968377 3 0 0 0 0000000090D20000 T2
--如果仔細看可以發現BA位址(0000000090D20000)的state,在修改後從XCUR變成了CR。
truncate table t2;
SCOTT@test> truncate table t2;
Table truncated.
00000000BC78AD68 4 531 1 data block cr 1 315968377 3 0 0 0 0000000090D20000
--表T2的state僅僅存在CR。
--觀察alert日志:
--并沒有寫增量檢查點。
3.通過bbed觀察:
BBED> set dba 4,163
DBA 0x010000a3 (16777379 4,163)
BBED> p *kdbr[0]
rowdata[0]
----------
ub1 rowdata[0] @8177 0x2c
BBED> x /rncn
rowdata[0] @8177
flag@8177: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@8178: 0x00
cols@8179: 2
col 0[2] @8180: 1
col 1[4] @8183: aaaa
BBED> set dba 4,531
DBA 0x01000213 (16777747 4,531)
lock@8178: 0x02
col 0[2] @8180: 2
col 1[4] @8183: BBBB
--注意看資料塊的内容可以發現dba=4,531的塊的資訊已經寫盤(name内容變成了大寫),而dba=4,163的塊資訊依舊name内容是小寫。
--說明T2相關的塊資訊已經寫入資料檔案。
SCOTT@test> @spid
SID SERIAL# SPID C50
---------- ---------- ------ --------------------------------------------------
399 1781 21284 alter system kill session '399,1781' immediate;
SCOTT@test> select * from V$SESSION_EVENT where sid=399;
SID EVENT TOTAL_WAITS TOTAL_TIMEOUTS TIME_WAITED AVERAGE_WAIT MAX_WAIT TIME_WAITED_MICRO EVENT_ID WAIT_CLASS_ID WAIT_CLASS# WAIT_CLASS
---------- ---------------------------------------- ----------- -------------- ----------- ------------ ---------- ----------------- ---------- ------------- ----------- --------------------
399 Disk file operations I/O 8 0 0 .03 0 2314 166678035 1740759767 8 User I/O
399 direct path sync 1 0 2 2.41 2 24055 2093619153 1740759767 8 User I/O
399 control file sequential read 14 0 0 0 0 163 3213517201 4108307767 9 System I/O
399 local write wait 3 0 4 1.38 2 41252 1570123276 1740759767 8 User I/O
399 enq: RO - fast object reuse 2 0 5 2.51 5 50110 143262751 4217450380 1 Application
399 log file sync 6 0 5 .89 2 53564 1328744198 3386400367 5 Commit
399 db file sequential read 30 0 15 .52 5 154818 2652584166 1740759767 8 User I/O
399 SQL*Net message to client 52 0 0 0 0 139 2067390145 2000153315 7 Network
399 SQL*Net message from client 51 0 276079 5413.3 185635 2760785228 1421975091 2723168908 6 Idle
399 SQL*Net break/reset to client 5 0 0 0 0 226 1963888671 4217450380 1 Application
399 events in waitclass Other 6 3 37 6.14 37 368495 1736664284 1893977003 0 Other
11 rows selected.
--你可以看到event='enq: RO - fast object reuse',這個就是truncate table t2的緣故。
4.繼續測試drop的情況:
--因為測試的時間問題,主要是避開中間執行增量檢查,先做一次full checkpoint。
--alert日志,在輸出一個full checkpoint.
Fri Sep 11 09:46:27 2015
Beginning global checkpoint up to RBA [0xe09.e485.10], SCN: 13200871682
Completed checkpoint up to RBA [0xe09.e485.10], SCN: 13200871682
update t1 set name='BBBB' where id1=1;
drop table t1;
00000000BC91E120 4 163 1 data block free 0 0 0 0 0 0 0000000093F32000
00000000BC91E120 4 163 1 data block cr 1 315969875 3 0 0 0 0000000094B60000
00000000BC91E120 4 163 1 data block cr 1 315968373 3 0 0 0 000000008FD54000
5.通過bbed觀察:
lock@8178: 0x03
--注意看資料塊的内容可以發現dba=4,163的塊的資訊已經寫盤(name内容變成了大寫'BBBB').
--說明T1相關的塊資訊已經寫入資料檔案。
399 enq: RO - fast object reuse 3 0 6 2.01 5 60152 143262751 4217450380 1 Application
399 log file sync 8 0 7 .9 2 72297 1328744198 3386400367 5 Commit
399 db file sequential read 43 0 19 .45 5 194899 2652584166 1740759767 8 User I/O
399 SQL*Net message to client 63 0 0 0 0 169 2067390145 2000153315 7 Network
399 SQL*Net message from client 62 0 336818 5432.54 185635 3368175121 1421975091 2723168908 6 Idle
399 events in waitclass Other 8 3 75 9.36 38 749168 1736664284 1893977003 0 Other
--你可以看到event='enq: RO - fast object reuse',有增加1次。
--總結:
--從以上的測試說明:drop 以及 truncate時,涉及到的對象髒塊會寫盤。這個叫Object level Checkpoint。