初識oracle block系列(一)

wisdomone1發表於2012-12-31
 

--測試場景
SQL> select * from v$version where rownum=1;
BANNER
------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
SQL>
 
----使用命令
Oracle 7之前
ALTER SESSION SET EVENTS 'immediate trace name blockdump level n';
n為block的rdba
Oracle8以後
ALTER SYSTEM DUMP DATAFILE file# BLOCK block#;
ALTER SYSTEM DUMP DATAFILE file#
BLOCK MIN minimum_block#
BLOCK MAX maximum_block#;

---建立測試並插入資料
SQL> create table t_block(a int,b int);
表已建立。
SQL> insert into t_block select level,level from dual connect by level<=3e2;
已建立300行。
SQL> commit;
提交完成。
-----獲取測試表某條記錄所屬的塊號及檔案號
SQL> select dbms_rowid.rowid_to_absolute_fno(rowid,'SCOTT','T_BLOCK'),dbms_rowid
.rowid_block_number(rowid) from t_block where rownum=1;
DBMS_ROWID.ROWID_TO_ABSOLUTE_FNO(ROWID,'SCOTT','T_BLOCK')
---------------------------------------------------------
DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
------------------------------------
                                                        5
                                 134

SQL> select file_id from dba_data_files where tablespace_name='SELF_LEARN';
   FILE_ID
----------
         5
----自dba_segment可得知此段表的標頭檔案是5,段頭塊是130
SQL> select  segment_name,header_file,header_block from dba_segments where segme
nt_name='T_BLOCK';
SEGMENT_NAME
--------------------------------------------------------------------------------
HEADER_FILE HEADER_BLOCK
----------- ------------
T_BLOCK
          5          130
         
         
--segment header block儲存內容到底是什麼呢?         
 
網際網路關於dump block的文章列表:
http://blog.csdn.net/tianlesoftware/article/details/6529346
-----下面開始簡約描述dump block大致內容
---鑑於篇幅過大,略去不重要的內容------------------------------------
 
 ----推知自表空間5,資料塊130轉儲檔案,tsn為tablespace number file#為檔案編號
Start dump data blocks tsn: 5 file#:5 minblk 130 maxblk 130
--自快取轉儲資料塊
Block dump from cache:
--轉化資料塊地址dba為塊號block number
SQL> select dbms_utility.data_block_address_block(20971650) from dual;
DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK(20971650)
-----------------------------------------------
                                            130
SQL>
Dump of buffer cache at level 4 for tsn=5, rdba=20971650 ---rdba即表t_block segment header block的資料塊地址
SQL> select file#,block#,ts# from v$bh where block#=130;
     FILE#     BLOCK#        TS#
---------- ---------- ----------
         5        130          5
--說明segment header已在快取buffer cache中
SQL> select ts#,tch,state,obj from x$bh where ba='000007FF4C668000';
       TS#        TCH      STATE        OBJ
---------- ---------- ---------- ----------
         5          3          1      66434
SQL> select object_name from dba_objects where object_id=66434;
OBJECT_NAME
----------------------------------------------------------------
T_BLOCK
-- ba即資料塊地址
BH (0x000007FF4CFA2CA8) file#: 5 rdba: 0x01400082 (5/130) class: 4 ba: 0x000007FF4C668000
  set: 9 pool 3 bsz: 8192 bsi: 0 sflg: 1 pwc: 0,28
  dbwrid: 0 obj: 66434 objn: 66434 tsn: 5 afn: 5 hint: f
 
 
  SQL> select hladdr,nxt_hash,prv_hash,lru_flag,obj_flag,dirty_queue from  x$bh wh
ere ba='000007FF4C668000';
HLADDR           NXT_HASH         PRV_HASH           LRU_FLAG   OBJ_FLAG
---------------- ---------------- ---------------- ---------- ----------
DIRTY_QUEUE
-----------
000007FF603C8220 000007FF603CA3A8 000007FF603CA3A8          0        240
          0
  ---儲存雙向hash連結串列的上和後一個hash的地址       
  hash: [0x000007FF603CA3A8,0x000007FF603CA3A8] lru: [0x000007FF4CFA2EC0,0x000007FF4CFA2C60] --增表記錄後,lru的第二部分由0x000007FF4CFA2C60變為0x000007FF4CF9C2D8
 
  ---閱之前的文件可知是檢查點事務佇列,檔案佇列,物件佇列
  --此塊內容要用其它的dump內容來檢視了,在此不予討論
 
  ---初次如下內容皆為空,
  ----增加表記錄後如下變為:ckptq: [0x000007FF4DF87A08,0x000007FF51FD1798] fileq: [0x000007FF4DF87A18,0x000007FF4CFA2A58] objq: [0x000007FF4CFA2B58,0x000007FF4CF9C2D8]
  ----chktq,有值了,fileq同理,objq變更了,大家注意看[0x000007FF5CC4B890,0x000007FF4CFA2B58]變為[0x000007FF4CFA2B58,0x000007FF4CF9C2D8],說明佇列是採用雙向連結串列設計
  ckptq: [NULL] fileq: [NULL] objq: [0x000007FF5CC4B890,0x000007FF4CFA2B58]
 
  --st是status的縮寫,XCURRENT表當前模式
  --tch對映x$bh的tch,命名此塊的個塊
  ----增加表記錄後,如下變為:st: XCURRENT md: NULL tch: 8,命中表的次數變為8
  st: XCURRENT md: NULL tch: 3
 
  ---由原來的block_written_once redo_since_read變為buffer_dirty block_written_once redo_since_read,說明有了修改塊的操作
  flags: block_written_once redo_since_read --變更:flags: buffer_dirty block_written_once redo_since_read(自下不再標明:增加表記錄後述語,直接寫變更)
 
  SQL> select lrba_seq,lrba_bno,hscn_bas from x$bh where ba='000007FF4C668000';
  LRBA_SEQ   LRBA_BNO   HSCN_BAS
---------- ---------- ----------
         0          0 4294967295
SQL> select to_char(4294967295,'xxxxxxxxxxxxxxx') from dual;
TO_CHAR(4294967295,'XXXXXXXXXXXX
--------------------------------
        ffffffff
SQL> select hsub_scn from x$bh where ba='000007FF4C668000';
  HSUB_SCN
----------
         1
        
--------lrba的地址及lscn由上sql可知.皆從0開始計數,hscn表示最高的scn,hsub不太理解是什麼
  LRBA: [0x0.0.0] LSCN: [0x0.0] HSCN: [0xffff.ffffffff] HSUB: [1] --變更:--變更:LRBA: [0x2f.5587.0] LSCN: [0x0.b053c] HSCN: [0x0.b074d] HSUB: [2],發現沒,全變了,不再是0
 
  --如下cr即一致性讀,sh表什麼,refcnt?
  cr pin refcnt: 0 sh pin refcnt: 0  --變更:cr pin refcnt: 0 sh pin refcnt: 0,未發生變化
Block dump from disk:
buffer tsn: 5 rdba: 0x01400082 (5/130)
--scn是什麼的scn,tail又是什麼?
scn: 0x0000.000af9c9 seq: 0x01 flg: 0x04 tail: 0xf9c92301 --變更:scn: 0x0000.000af9c9 seq: 0x01 flg: 0x04 tail: 0xf9c92301未變化

---frmt??
--type表明是segment header
frmt: 0x02 chkval: 0xa802 type: 0x23=PAGETABLE SEGMENT HEADER --變更:frmt: 0x02 chkval: 0xa802 type: 0x23=PAGETABLE SEGMENT HEADER 未變化
Hex dump of block: st=0, typ_found=1
--如下表明自0x000000001C8F8200到0x000000001C8FA200進行轉儲
--這裡面的16進位制的東東到底是什麼呢?
Dump of memory from 0x000000001C8F8200 to 0x000000001C8FA200 --變更:Dump of memory from 0x000000001D3E6C00 to 0x000000001D3E8C00 ,變化了
01C8F8200 0000A223 01400082 000AF9C9 04010000  [#.....@.........]
01C8F8210 0000A802 00000000 00000000 00000000  [................]
01C8F8220 00000000 00000001 00000008 00000A9C  [................]
01C8F8230 00000000 00000008 00000008 01400088  [..............@.]
01C8F8240 00000000 00000000 00000000 00000005  [................]
01C8F8250 00000000 00000000 00000000 00000000  [................]
01C8F8260 00000008 00000008 01400088 00000000  [..........@.....]
01C8F8270 00000000 00000000 00000005 01400080  [..............@.]
01C8F8280 01400080 00000000 00000000 00000000  [..@.............]
01C8F8290 00000000 00000000 00000000 00000000  [................]
        Repeat 3 times --重複3次,什麼重複??
01C8F82D0 00000001 00002000 00000000 00001434  [..... ......4...]
01C8F82E0 00000000 01400081 00000001 01400080  [......@.......@.]
01C8F82F0 01400081 00000000 00000000 00000000  [..@.............]
01C8F8300 00000000 00000000 00000001 00000000  [................]
01C8F8310 00010382 10000000 01400080 00000008  [..........@.....]
01C8F8320 00000000 00000000 00000000 00000000  [................]
        Repeat 152 times
01C8F8CB0 01400080 01400083 00000000 00000000  [..@...@.........]
01C8F8CC0 00000000 00000000 00000000 00000000  [................]
        Repeat 151 times
01C8F9640 00000000 00000000 01400081 00000000  [..........@.....]
01C8F9650 00000000 00000000 00000000 00000000  [................]
        Repeat 185 times
01C8FA1F0 00000000 00000000 00000000 F9C92301  [.............#..]
 
  ----區控制頭塊,綜上,即segment header會儲存它包含的extent的資訊
 
  ---查段包含的區數
  SQL> select segment_name,extents from dba_segments where segment_name='T_BLOCK';

SEGMENT_NAME
--------------------------------------------------------------------------------
   EXTENTS
----------
T_BLOCK
         1
---查段所屬的區資訊,綜上,segment header block為130,而如下段啟始塊為128,說明3個塊用於段頭
--且,自131塊開始共計5個塊儲存真實的表中記錄
SQL> select segment_name,extent_id,block_id,blocks from dba_extents where segmen
t_name='T_BLOCK';
SEGMENT_NAME
--------------------------------------------------------------------------------
 EXTENT_ID   BLOCK_ID     BLOCKS
---------- ---------- ----------
T_BLOCK
         0        128          8

  --區頭塊資訊
  Extent Control Header
  -----------------------------------------------------------------
  --如下說明僅一個區,區中的塊數量為8
  --此為段中區的總述
  Extent Header:: spare1: 0      spare2: 0      #extents: 1      #blocks: 8     -- 變更:Extent Header:: spare1: 0      spare2: 0      #extents: 1      #blocks: 8
                  last map  0x00000000  #maps: 0      offset: 2716  --offset不知何意?
      --highwater是表的hwm,還是?
     
      --ext是區編號,在此僅一個區,故為0,blk#為塊大小,ext size為區中個個數
      Highwater::  0x01400088  ext#: 0      blk#: 8      ext size: 8    
  #blocks in seg. hdr's freelists: 0    
  #blocks below: 5    
  mapblk  0x00000000  offset: 0    
                   Unlocked
  --------------------------------------------------------
  --低高水位標記
  Low HighWater Mark :
      Highwater::  0x01400088  ext#: 0      blk#: 8      ext size: 8    
  #blocks in seg. hdr's freelists: 0    
 
  #blocks below: 5    
  mapblk  0x00000000  offset: 0 
 
  --基於高(低)水位線塊的1級bmb塊地址,所謂1級bmb不理解,要查閱官方手冊
 
  --變更:對比之前發變化
  /******************************
  egment Type: 1 nl2: 1      blksz: 8192   fbsz: 0     
  L2 Array start offset:  0x00001434
  First Level 3 BMB:  0x00000000
  L2 Hint for inserts:  0x01400081
  Last Level 1 BMB:  0x01400080
  Last Level II BMB:  0x01400081
  Last Level III BMB:  0x00000000
  ******************************/
 
 
  Level 1 BMB for High HWM block: 0x01400080
  Level 1 BMB for Low HWM block: 0x01400080
  --------------------------------------------------------
  Segment Type: 1 nl2: 1      blksz: 8192   fbsz: 0     
  L2 Array start offset:  0x00001434
  First Level 3 BMB:  0x00000000
  L2 Hint for inserts:  0x01400081
  Last Level 1 BMB:  0x01400080
  Last Level II BMB:  0x01400081
  Last Level III BMB:  0x00000000
    
     --對映頭,這個對映頭
     Map Header:: next  0x00000000  #extents: 1    obj#: 66434  flag: 0x10000000 --變更:Map Header:: next  0x00000000  #extents: 1    obj#: 66434  flag: 0x10000000未變化
  Inc # 0
 
  ---區對映
  Extent Map
  -----------------------------------------------------------------
   0x01400080  length: 8    
 
  --輔助對映
  Auxillary Map
  --------------------------------------------------------
   Extent 0     :  L1 dba:  0x01400080 Data dba:  0x01400083 --Data dba也說明自第4個資料塊開始儲存表的記錄,參上面的分析描述
  --------------------------------------------------------
 
   Second Level Bitmap block DBAs
   --------------------------------------------------------
   DBA 1:   0x01400081
 
End dump data blocks tsn: 5 file#: 5 minblk 130 maxblk 130
小結:1,segment header由extent控制資訊,extent map,Auxillary Map,二級點陣圖塊幾個管理型資訊單元構成
     2,某些引數要學習dsi之後,方可更細緻理解
 


資料塊轉儲
alter system dump datafile 5 block 131;--131開始才是表記錄的內容
 

---資料塊轉儲
Start dump data blocks tsn: 5 file#:5 minblk 131 maxblk 131
Block dump from cache:
Dump of buffer cache at level 4 for tsn=5, rdba=20971651
BH (0x000007FF4CF80CC8) file#: 5 rdba: 0x01400083 (5/131) class: 1 ba: 0x000007FF4C2D4000
  set: 12 pool 3 bsz: 8192 bsi: 0 sflg: 1 pwc: 0,28
  dbwrid: 0 obj: 66434 objn: 66434 tsn: 5 afn: 5 hint: f
  hash: [0x000007FF60739F68,0x000007FF60739F68] lru: [0x000007FF4CF80EE0,0x000007FF4CF80C80]
  ckptq: [NULL] fileq: [NULL] objq: [0x000007FF5CC51058,0x000007FF4CF80CA8]
  st: XCURRENT md: NULL tch: 5
  flags: block_written_once redo_since_read
  LRBA: [0x0.0.0] LSCN: [0x0.0] HSCN: [0xffff.ffffffff] HSUB: [1]
  cr pin refcnt: 0 sh pin refcnt: 0
Block dump from disk:
buffer tsn: 5 rdba: 0x01400083 (5/131)
scn: 0x0000.000b0662 seq: 0x01 flg: 0x06 tail: 0x06620601
frmt: 0x02 chkval: 0x3ae7 type: 0x06=trans data
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x000000001D3E6C00 to 0x000000001D3E8C00
01D3E6C00 0000A206 01400083 000B0662 06010000  [......@.b.......]
01D3E6C10 00003AE7 00000001 00010382 000AF9C8  [.:..............]
---相近資料從略
01D3E8BF0 012C03C1 08C20302 03C10242 06620601  [..,.....B.....b.]
Block header dump:  0x01400083
 Object id on Block? Y
 seg/obj: 0x10382  csc: 0x00.af9c8  itc: 2  flg: E  typ: 1 - DATA
     brn: 0  bdba: 0x1400080 ver: 0x01 opc: 0
     inc: 0  exflg: 0
 
---儲存事務資訊,即哪些事務操作此表,一致性讀或恢復自此獲取資訊
 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0006.004.0000023e  0x00c0c936.0056.01  --U-  605  fsc 0x0000.000b0662
0x02   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000
bdba: 0x01400083
data_block_dump,data header at 0x1d3e6c64
===============
tsiz: 0x1f98
hsiz: 0x4cc
pbl: 0x1d3e6c64
     76543210
flag=--------
ntab=1
nrow=605 --此塊中表的記錄數
frre=-1
fsbo=0x4cc
fseo=0x7fc
avsp=0x330
tosp=0x330
0xe:pti[0] nrow=605 offs=0
--如上是表中行在資料塊的地址
SQL> select count(1) from t_block where dbms_rowid.rowid_block_number(rowid)=131
;
  COUNT(1)
----------
       605
--如下行條目共計605,與上述查詢匹配
0x12:pri[0] offs=0x19b3
0x14:pri[1] offs=0x19bd
0x16:pri[2] offs=0x19c7
0x18:pri[3] offs=0x19d1
0x1a:pri[4] offs=0x19db
0x1c:pri[5] offs=0x19e5
0x1e:pri[6] offs=0x19ef
0x20:pri[7] offs=0x19f9
0x22:pri[8] offs=0x1a03
0x24:pri[9] offs=0x1a0d
0x26:pri[10] offs=0x1a17
0x28:pri[11] offs=0x1a21
0x2a:pri[12] offs=0x1a2b
0x2c:pri[13] offs=0x1a35
0x2e:pri[14] offs=0x1a3f
0x30:pri[15] offs=0x1a49
0x32:pri[16] offs=0x1a53
0x34:pri[17] offs=0x1a5d
0x36:pri[18] offs=0x1a67
0x38:pri[19] offs=0x1a71
0x3a:pri[20] offs=0x1a7b
0x3c:pri[21] offs=0x1a85
0x3e:pri[22] offs=0x1a8f
0x40:pri[23] offs=0x1a99
0x42:pri[24] offs=0x1aa3
0x44:pri[25] offs=0x1aad
0x46:pri[26] offs=0x1ab7
0x48:pri[27] offs=0x1ac1
0x4a:pri[28] offs=0x1acb
0x4c:pri[29] offs=0x1ad5
----中間相近資料從略--------------
0x4ca:pri[604] offs=0xfb6

--塊中表的行的轉儲
block_row_dump:
tab 0, row 0, @0x19b3
tl: 10 fb: --H-FL-- lb: 0x1  cc: 2
col  0: [ 3]  c2 07 10 --表列1
col  1: [ 2]  c1 03 -- ,表列2
tab 0, row 1, @0x19bd
--中間相近資料從略
tl: 10 fb: --H-FL-- lb: 0x1  cc: 2
col  0: [ 3]  c2 0d 14
col  1: [ 2]  c1 03
end_of_block_dump
End dump data blocks tsn: 5 file#: 5 minblk 131 maxblk 131
 

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

相關文章