【kingsql分享】邏輯資料庫結構 之 資料塊

kingsql發表於2014-10-10

    資料塊:資料塊是oracle資料庫的儲存基礎,它由磁碟空間上的若干位元組組成。

    資料塊是oracle資料庫的最小邏輯部件。例如,可以定義oracle的資料塊為2KB,4KB,8KB,16KB32KB(甚至更大的塊),通常稱資料塊為oracle塊。駐留oracle塊的儲存磁碟分成若干磁碟快(disk block),一個磁碟塊是一個包含指定位元組數的相鄰的儲存區域——例如,4096位元組或32768位元組(4KB32KB1KB=1024B

    初始化引數檔案init.oraDB_BLOCK_SIZE引數設定oracle塊的大小。

    塊尺寸是處理oracle的更新,選擇或插入資料事務的最小單位,當使用者從表中選擇資料時,選擇操作將從資料庫檔案中以oracle塊為單位"讀取"或提取資料。

    如果使用64KBoracle塊尺寸(65536位元組),即一個oracle資料塊是65536位元組,即使只想檢索僅僅4個字元的名字(一個字元一個位元組算),那麼也就是4個位元組的資料,也必須讀取含有這4個位元組的整個資料塊,這個資料塊是65536位元組啊!

如果從SQL SERVER進入oracle,則可以認為oracle塊的大小與SQL SERVER頁的大小相同。

Oracle塊尺寸的確定應該基於資料庫將要做的工作。例如,如果處理的行較小且要進行大量的索引查詢,那麼應選擇較小的塊尺寸;當掃描大表時,應選擇較大的塊尺寸,這適用於報表應用程式。如果不能確定使用多大的塊尺寸,那麼,對於大多數處理大量事務的系統來說,oracle建議選擇塊尺寸為8KB

多個oracle資料塊尺寸:DB_BLOCK_SIZE初始化引數決定oracle資料庫的標準塊尺寸,其取值範圍可以從2KB-32KBOracle總是依據標準塊尺寸建立系統表空間的,並且oracle還可指定最多4個額外的非標準的塊尺寸。例如,在同一個資料庫中,可以定義2KB,4KB,8KB,16KB32KB的塊尺寸。如果選擇配置多個oracle塊尺寸,還必須配置SGA的緩衝區快取記憶體中相應的子快取記憶體。但並非總是需要有多個資料塊尺寸,大多數情況下只有一個標準的oracle塊尺寸也會做的很好。多個塊尺寸主要用於在具有不同資料庫塊尺寸的資料庫之間傳送表空間(也就是DB1:2KBDB2:4KB,DB3:8KB,那麼DB4要傳送表空間在這三個資料庫,DB4本身16KB,它就需要配置多個oracle塊尺寸,2KB,4KB,8KB,以便能夠把表空間傳送到前三個資料庫中)。

資料塊的內部結構:所有資料塊都可以分為兩個主要部分:行資料部分和可用空間部分(還有其他一些小的區域,如維護資料塊所使用的系統開銷和首部空間)。資料塊的行資料部分包括儲存在表或索引中的資料。可用空間(free space)部分是oracle塊留下的空間,為的是給將要插入的新資料或是擴充已有的行留出空間。

有時,正確地找出某個塊中有哪些資料,或者查詢哪個oracle塊包含了某些資料,是很有用的。透過"轉儲"塊的內容可以實際"看到"資料塊中有什麼東西。Oracle塊可以在作業系統級轉儲(二進位制轉儲),也可以執行oracle格式的塊轉儲。

執行塊轉儲的最常見原因是調查塊訛誤(block corruption),這些錯誤可能由作業系統或oracle軟體錯誤,硬體問題,記憶體或I/O快取記憶體問題所引起。Recovery Manager(RMAN)可以從訛誤資料塊恢復資料,也可以用Data Recovery Advisor利用其他策略從訛誤資料塊恢復資料。

我們來看一下oracle資料塊中究竟有什麼。首先,在轉儲資料前,需要查詢想要轉儲哪個資料檔案和資料塊。

用於確定檔案和塊的ID的查詢:

SYS@hzh >select segment_name,file_id,block_id

  2  from dba_extents where segment_name='DEPT';

SEGMENT_NAME            FILE_ID   BLOCK_ID

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

DEPT                          4          9

也可以使用以下查詢得到同樣的資訊:

SYS@hzh >select header_file,header_block from dba_segments

  2  where segment_name='DEPT';

HEADER_FILE HEADER_BLOCK

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

          4           11

接著,可以使用相應的檔案和塊號釋出以下命令得到所需的轉儲塊

SYS@hzh >alter system dump datafile 4 block 9;

System altered.

以上命令將在oracle資料庫的預設跟蹤目錄(UDUMP)中產生一個塊轉儲

以下是此命令的輸出

/u01/app/oracle/admin/hzh/udump/hzh_ora_7385.trc

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production

With the Partitioning, OLAP and Data Mining options

ORACLE_HOME = /u01/app/oracle/product/10.2.0.1/db_1

System name:    Linux

Node name:      hong

Release:        2.6.18-164.el5

Version:        #1 SMP Tue Aug 18 15:51:54 EDT 2009

Machine:        i686

Instance name: hzh

Redo thread mounted by this instance: 1

Oracle process number: 15

Unix process pid: 7385, image: oracle@hong (TNS V1-V3)

*** 2012-08-29 11:39:27.117

*** SERVICE NAME:(SYS$USERS) 2012-08-29 11:39:27.116

*** SESSION ID:(159.33) 2012-08-29 11:39:27.116

Start dump data blocks tsn: 6 file#: 5 minblk 347 maxblk 347

buffer tsn: 6 rdba: 0x0140015b (5/347)

scn: 0x0000.0006dac9 seq: 0x02 flg: 0x04 tail: 0xdac92302

frmt: 0x02 chkval: 0x63e8 type: 0x23=PAGETABLE SEGMENT HEADER

Hex dump of block: st=0, typ_found=1

Dump of memory from 0x0D130400 to 0x0D132400

D130400 0000A223 0140015B 0006DAC9 04020000  [#...[.@.........]

D130410 000063E8 00000000 00000000 00000000  [.c..............]

D130420 00000000 00000001 00000008 00000A9C  [................]

D130430 00000000 00000008 00000008 01400161  [............a.@.]

D130440 00000000 00000000 00000000 00000005  [................]

D130450 00000000 00000000 00000000 00000000  [................]

D130460 00000008 00000008 01400161 00000000  [........a.@.....]

D130470 00000000 00000000 00000005 01400159  [............Y.@.]

D130480 01400159 00000000 00000000 00000000  [Y.@.............]

D130490 00000000 00000000 00000000 00000000  [................]

        Repeat 3 times

D1304D0 00000001 00002000 00000000 00001434  [..... ......4...]

D1304E0 00000000 0140015A 00000001 01400159  [....Z.@.....Y.@.]

D1304F0 0140015A 00000000 00000000 00000000  [Z.@.............]

D130500 00000000 00000000 00000001 00000000  [................]

D130510 0000C861 10000000 01400159 00000008  [a.......Y.@.....]

D130520 00000000 00000000 00000000 00000000  [................]

        Repeat 152 times

D130EB0 01400159 0140015C 00000000 00000000  [Y.@.\.@.........]

D130EC0 00000000 00000000 00000000 00000000  [................]

        Repeat 151 times

D131840 00000000 00000000 0140015A 00000000  [........Z.@.....]

D131850 00000000 00000000 00000000 00000000  [................]

        Repeat 185 times

D1323F0 00000000 00000000 00000000 DAC92302  [.............#..]

  Extent Control Header

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

  Extent Header:: spare1: 0      spare2: 0      #extents: 1      #blocks: 8     

                  last map  0x00000000  #maps: 0      offset: 2716  

      Highwater::  0x01400161  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::  0x01400161  ext#: 0      blk#: 8      ext size: 8     

  #blocks in seg. hdr's freelists: 0     

  #blocks below: 5     

  mapblk  0x00000000  offset: 0     

  Level 1 BMB for High HWM block: 0x01400159

  Level 1 BMB for Low HWM block: 0x01400159

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

  Segment Type: 1 nl2: 1      blksz: 8192   fbsz: 0      

  L2 Array start offset:  0x00001434

  First Level 3 BMB:  0x00000000

  L2 Hint for inserts:  0x0140015a

  Last Level 1 BMB:  0x01400159

  Last Level II BMB:  0x0140015a

  Last Level III BMB:  0x00000000

     Map Header:: next  0x00000000  #extents: 1    obj#: 51297  flag: 0x10000000

  Inc # 0 

  Extent Map

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

   0x01400159  length: 8     

  

  Auxillary Map

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

   Extent 0     :  L1 dba:  0x01400159 Data dba:  0x0140015c

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

  

   Second Level Bitmap block DBAs 

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

   DBA 1:   0x0140015a

  

End dump data blocks tsn: 6 file#: 5 minblk 347 maxblk 347

*** 2012-08-29 11:51:38.670

Start dump data blocks tsn: 4 file#: 4 minblk 9 maxblk 9

buffer tsn: 4 rdba: 0x01000009 (4/9)

scn: 0x0000.0006bfdb seq: 0x02 flg: 0x04 tail: 0xbfdb2002

frmt: 0x02 chkval: 0x01b6 type: 0x20=FIRST LEVEL BITMAP BLOCK

Hex dump of block: st=0, typ_found=1

Dump of memory from 0x0D130400 to 0x0D132400

D130400 0000A220 01000009 0006BFDB 04020000  [ ...............]

D130410 000001B6 00000000 00000000 00000000  [................]

D130420 00000000 00000000 00000000 00000000  [................]

        Repeat 1 times

D130440 00000000 00000000 00000000 00000004  [................]

D130450 FFFFFFFF 00000000 00000003 00000008  [................]

D130460 00010001 00000000 00000000 00000000  [................]

D130470 00000005 00000003 42C4AEDD 42C4AEDD  [...........B...B]

D130480 00000000 00000000 00000000 00000000  [................]

D130490 0100000A 00000000 00000000 00000008  [................]

D1304A0 00000008 01000011 00000000 00000000  [................]

D1304B0 00000000 00000005 00000000 00000001  [................]

D1304C0 0000C7CA 00000000 00000000 01000009  [................]

D1304D0 00000008 00000000 00000000 00000000  [................]

D1304E0 00000000 00000000 00000000 00000000  [................]

        Repeat 9 times

D130580 00000000 00000000 00000000 55551511  [..............UU]

D130590 00000000 00000000 00000000 00000000  [................]

        Repeat 485 times

D1323F0 00000000 00000000 00000000 BFDB2002  [............. ..]

Dump of First Level Bitmap Block

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

   nbits : 4 nranges: 1         parent dba:  0x0100000a   poffset: 0     

   unformatted: 0       total: 8         first useful block: 3      

   owning instance : 1

   instance ownership changed at 07/01/2005 10:47:57

   Last successful Search 07/01/2005 10:47:57

   Freeness Status:  nf1 0      nf2 0      nf3 0      nf4 5      

 

   Extent Map Block Offset: 4294967295 

   First free datablock : 3      

   Bitmap block lock opcode 0

   Locker xid:     :  0x0000.000.00000000

   Inc #: 0 Objd: 51146 

  HWM Flag: HWM Set

      Highwater::  0x01000011  ext#: 0      blk#: 8      ext size: 8     

  #blocks in seg. hdr's freelists: 0     

  #blocks below: 5     

  mapblk  0x00000000  offset: 0     

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

  DBA Ranges :

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

   0x01000009  Length: 8      Offset: 0      

  

   0:Metadata   1:Metadata   2:Metadata   3:75-100% free

   4:75-100% free   5:75-100% free   6:75-100% free   7:75-100% free

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

End dump data blocks tsn: 4 file#: 4 minblk 9 maxblk 9

可以解釋和讀取轉儲資料,以便查詢表或索引中相關資訊的詳細內容。

下面考慮一個簡單的例子,說明如何從上述塊轉儲資訊中得到表的名稱。取出倒數第2行的obj#,並執行以下查詢:

 

SYS@hzh >alter system dump datafile 4 block 11;

/u01/app/oracle/admin/hzh/udump/hzh_ora_7749.trc

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production

With the Partitioning, OLAP and Data Mining options

ORACLE_HOME = /u01/app/oracle/product/10.2.0.1/db_1

System name:    Linux

Node name:      hong

Release:        2.6.18-164.el5

Version:        #1 SMP Tue Aug 18 15:51:54 EDT 2009

Machine:        i686

Instance name: hzh

Redo thread mounted by this instance: 1

Oracle process number: 15

Unix process pid: 7749, image: oracle@hong (TNS V1-V3)

*** 2012-08-29 11:59:15.839

*** SERVICE NAME:(SYS$USERS) 2012-08-29 11:59:15.838

*** SESSION ID:(159.42) 2012-08-29 11:59:15.838

Start dump data blocks tsn: 4 file#: 4 minblk 11 maxblk 11

buffer tsn: 4 rdba: 0x0100000b (4/11)

scn: 0x0000.0006bfdb seq: 0x02 flg: 0x04 tail: 0xbfdb2302

frmt: 0x02 chkval: 0x6c43 type: 0x23=PAGETABLE SEGMENT HEADER

Hex dump of block: st=0, typ_found=1

Dump of memory from 0x0DD22400 to 0x0DD24400

DD22400 0000A223 0100000B 0006BFDB 04020000  [#...............]

DD22410 00006C43 00000000 00000000 00000000  [Cl..............]

DD22420 00000000 00000001 00000008 00000A9C  [................]

DD22430 00000000 00000008 00000008 01000011  [................]

DD22440 00000000 00000000 00000000 00000005  [................]

DD22450 00000000 00000000 00000000 00000000  [................]

DD22460 00000008 00000008 01000011 00000000  [................]

DD22470 00000000 00000000 00000005 01000009  [................]

DD22480 01000009 00000000 00000000 00000000  [................]

DD22490 00000000 00000000 00000000 00000000  [................]

        Repeat 3 times

DD224D0 00000001 00002000 00000000 00001434  [..... ......4...]

DD224E0 00000000 0100000A 00000001 01000009  [................]

DD224F0 0100000A 00000000 00000000 00000000  [................]

DD22500 00000000 00000000 00000001 00000000  [................]

DD22510 0000C7CA 10000000 01000009 00000008  [................]

DD22520 00000000 00000000 00000000 00000000  [................]

        Repeat 152 times

DD22EB0 01000009 0100000C 00000000 00000000  [................]

DD22EC0 00000000 00000000 00000000 00000000  [................]

        Repeat 151 times

DD23840 00000000 00000000 0100000A 00000000  [................]

DD23850 00000000 00000000 00000000 00000000  [................]

        Repeat 185 times

DD243F0 00000000 00000000 00000000 BFDB2302  [.............#..]

  Extent Control Header

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

  Extent Header:: spare1: 0      spare2: 0      #extents: 1      #blocks: 8     

                  last map  0x00000000  #maps: 0      offset: 2716  

      Highwater::  0x01000011  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::  0x01000011  ext#: 0      blk#: 8      ext size: 8     

  #blocks in seg. hdr's freelists: 0     

  #blocks below: 5     

  mapblk  0x00000000  offset: 0     

  Level 1 BMB for High HWM block: 0x01000009

  Level 1 BMB for Low HWM block: 0x01000009

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

  Segment Type: 1 nl2: 1      blksz: 8192   fbsz: 0      

  L2 Array start offset:  0x00001434

  First Level 3 BMB:  0x00000000

  L2 Hint for inserts:  0x0100000a

  Last Level 1 BMB:  0x01000009

  Last Level II BMB:  0x0100000a

  Last Level III BMB:  0x00000000

     Map Header:: next  0x00000000  #extents: 1    obj#: 51146  flag: 0x10000000

  Inc # 0 

  Extent Map

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

   0x01000009  length: 8     

  

  Auxillary Map

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

   Extent 0     :  L1 dba:  0x01000009 Data dba:  0x0100000c

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

  

   Second Level Bitmap block DBAs 

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

   DBA 1:   0x0100000a

  

End dump data blocks tsn: 4 file#: 4 minblk 11 maxblk 11

SYS@hzh >select name from obj$

  2  where obj#='51146';

NAME

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

DEPT

 

上面的例子說明了如何直接從資料庫塊轉儲中得到資訊。當然,如果需要從轉儲中得到更重要的資料,必須使用更高階的技術。


kingsql分享

2014-10-10

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

相關文章