Oracle Bigfile Tablespace大檔案表空間

不一樣的天空w發表於2017-04-02

 

Oracle表空間Tablespace是邏輯結構的最高層次,其他分別對應段物件segment、區extent和塊block。而物理層面的Oracle資料庫是透過一系列的檔案構成,其中資料檔案datafile是與Tablespace進行對應的物件。

 

 

TablespaceDatafile的關係是一對多的關係。一個表空間Tablespace可以對應多個DatafileDatafile則是隻能歸屬在一個Tablespace裡。傳統的Oracle管理概念中,倡導一個表空間中建立多個資料檔案,特別是建立分佈在多個儲存磁碟上,以期分散I/O。但是,Oracle10g推出的BigFile Tablespace大檔案表空間,將這個概念有所變化。

 

 

1、  Bigfile tablespace

 

Oracle 10g中,推出了Bigfile tablespace的概念。表空間TablespaceOracle 10g以後就分為兩個型別,smallfile tablespacebigfile tablespace。過去一個表空間對應多個資料檔案我們成為Smallfile Tablespace

 

所謂Bigfile Tablespace最顯著的差別就是一個表空間只能對應一個資料檔案。Bigfile Tablespace雖只對應一個資料檔案,但資料檔案對應的最大體積大大增加。傳統的small datafile每個檔案中最多包括4M個資料塊,按照一個資料塊8K的大小核算,最大檔案大小為32G。每個Small Tablespace理論上能夠包括1024個資料檔案,這樣計算理論的最大值為32TB大小。而Bigfile Datafile具有更強大的資料塊block容納能力,最多能夠包括4G個資料塊。同樣按照資料塊8K計算,Bigfile Datafile大小為32KG=32TB。理論上small tablespacebig tablespace總容量相同。

 

下面我們透過一連串的實驗來觀察Bigfile Tablespace

 

 

SQL> select * from v$version;

 

BANNER

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

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod

PL/SQL Release 10.2.0.1.0 - Production

CORE     10.2.0.1.0       Production

TNS for 32-bit Windows: Version 10.2.0.1.0 - Production

NLSRTL Version 10.2.0.1.0 - Production

 

SQL> create bigfile tablespace bttest datafile 'D:\ORADATA\ORCL\BTTEST.dbf' size 10m autoextend off

  2  extent management local uniform. size 1m

  3  segment space management auto;

 

Tablespace created

 

 

此處,我們透過create bigfile tablespace語句建立Bigfile Tablespace。注意兩方面的問題,其一是Bigfile Tablespace必須使用local本地extent管理方式,不允許使用DMTDictionary Managed Tablespace)。另一方面是段segment空間使用auto自動方式,不要使用manual

 

不過這兩個條件在Undo或者臨時Bigfile表空間的時候,是允許例外的。

 

Small TablespaceBigfile Tablespace是可以並存的。

 

 

SQL> select tablespace_name, bigfile from dba_tablespaces;

 

TABLESPACE_NAME                BIGFILE

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

(篇幅原因,省略……

QCDATA                         NO

QCTEMP                         NO

BTTEST                         YES

 

11 rows selected

 

 

在建立bigfile tablespace的時候,就已經指定了資料檔案。如果此時我們嘗試加入一個新的資料檔案,Oracle系統會報錯。

 

 

SQL> alter tablespace bttest add datafile 'D:\ORADATA\ORCL\BTTEST02.dbf' size 10m autoextend off;

 

alter tablespace bttest add datafile 'D:\ORADATA\ORCL\BTTEST02.dbf' size 10m autoextend off

 

ORA-32771: 無法在大檔案表空間中新增檔案

 

 

下面我們分析一下bigfile tablespace的特性。

 

2Bigfile的相對檔案編號

 

此處我們觀察一下Bigfile Tablespace體系下的一些特徵。

 

 

SQL> select file_name, file_id, relative_fno from dba_data_files;

 

FILE_NAME                         FILE_ID RELATIVE_FNO

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

D:\ORADATA\ORCL\USERS01.DBF             4            4

D:\ORADATA\ORCL\SYSAUX01.DBF            3            3

D:\ORADATA\ORCL\UNDOTBS01.DBF           2            2

D:\ORADATA\ORCL\SYSTEM01.DBF            1            1

D:\ORADATA\ORCL\EXAMPLE01.DBF           5            5

D:\ORADATA\ORCL\SPTABLESPACE            6            6

D:\ORADATA\ORCL\QCDATA.DBF              7            7

D:\ORADATA\ORCL\BTTEST.DBF              8         1024

 

8 rows selected

 

 

每個檔案都包括兩個編號,一個是絕對檔案編號file_id,另一個是相對檔案編號relative_fno。在檔案數量較少,或者建立刪除檔案比較少情況下的資料庫,file_idrelative_fno是相同的。Relative_fno是一個迴圈週期,以1024為一個迴圈。當file_id依次遞增到1024整數倍之後,file_id會繼續增加,而relative_fno會形成一個內部迴圈。

 

 

這種機制讓我們聯想起了Oracle Small Tablespace的資料檔案上限限制,也是1023個檔案。我們設想一種極端的情況,如果一個表空間中的資料檔案個數超過了1024,也就是一個表空間內的資料檔案中,存在相同的relative_fno。這種情況首先是不被允許的。

 

 

設定1024relative_fno是進行Oracle資料定址的需要。這裡我們要關注到Oracle定位資料行的rowid資訊,rowidOracle內部唯一標註一行記錄的地址。Rowid包括四部分組成,物件號+檔案號+塊號+slot行號。Rowid長度固定,所以四部分的長度都是固定的,這裡的檔案號fno是相對檔案編號。這裡的查詢順序是,物件號獲取所在表空間的編號,在表空間內部使用相對檔案號來定位到檔案。如果一個表空間內出現相同的relative_fno檔案,定位就不可能了。所以,small tablepsace的內部檔案上限必然是1023

 

 

但是,Bigfile Tablespace存在一些不同之處。如果一個表空間只有一個資料檔案且只能擁有一個資料檔案,那麼relative_fno就失去了存在的意義。所以在dba_data_files中的relative_fno列上,bigfile tablespace對應的datafile是直接1024

 

 

SQL> create table t_big tablespace bttest as select * from dba_tables;

Table created

 

SQL> select dbms_rowid.rowid_object(t.rowid) obj_id, dbms_rowid.rowid_relative_fno(t.rowid,'BIGFILE') relative_fno,

  2  dbms_rowid.rowid_block_number(t.rowid) block_num, dbms_rowid.rowid_row_number(t.rowid) rownums,

  3  dbms_rowid.rowid_to_absolute_fno(t.rowid,'SYS','T_BIG') abso_fno

  4  from t_BIG t where rownum<4;

 

    OBJ_ID RELATIVE_FNO  BLOCK_NUM    ROWNUMS   ABSO_FNO

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

     55707         1024         21          0          8

     55707         1024         21          1          8

     55707         1024         21          2          8

 

 

藉助dbms_rowid包的相應方法,我們也可以看清bigfile tablespacerowid行的relative_fno資訊。

 

3Bigfile Datafile大小探索

 

一個資料檔案最大能有多大,在Oracle中有兩個因素控制,一個是Oracle內部定址能夠尋找到的最大範圍多少個塊,另一個是資料庫每個塊大小是多大。

 

我們首先來看看Small Datafile的情況。Rowid是一個用16進製表示的18位長度類字串。其中,前6位表示object_id,之後3位表示檔案編號,之後6位表示塊號,最後3位表示rowslot編號。

 

--語句摘自MOS[ID 1057891.6]

 

   SQL> select substr(rowid,1,6) "object",

               substr(rowid,7,3) "file",

               substr(rowid,10,6) "block",

               substr(rowid,16,3) "row"

       from test;

 

        object fil block  row

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

        AAABPW AAF AAAAv1 AAA

 

 

small datafile中,對資料塊有6×4=24位二進位制表示。Oracle利用中間的22位進行塊地址儲存。這樣,22位二進位制可以表示的資料塊編號範圍為(2^22-1=4M個資料塊。如果按照每個資料塊8K的普遍大小計算,這樣每個small datafile大小上限就是32G。如果按照每個資料塊上限32K計算,這樣每個small datafile大小上限就是128G

 

 

bigfile datafile中,事情有所不同。由於沒有relative_fno的問題,這樣rowid中就不需要儲存relative_fno的最多1024的數值。這樣就節省出10位二進位制位給資料塊定位,相同長度的rowid就可以進行32位二進位制長度的資料塊定址。每個bigfile datafile中,最多可以包括到(2^32-1=4G個資料塊。在資料塊大小8K的環境下,最大為32TB資料。如果是資料塊大小為32K環境下,檔案最大可以到128TB大小。

 

 

4、結論和討論

 

在本文第一部分中,我們討論了Bigfile TablespaceSmall Tablespace的理論分析,兩者理論上最大容量值是一樣的。只是Bigfile的單個檔案容量上限很大,我們如何看待這種新型別呢?

 

首先,實際生產環境下,Bigfile Tablespace在應對大資料量儲存的時候略有優勢。因為Small Tablespace在實現相同的儲存大小時,要消耗大量的多檔案管理開銷。同時控制檔案為了維護多位置上的檔案,協同檢查點和檔案頭SCN等內容,要消耗很大精力。

 

其次,Small Tablespace的儲存量只是理論,很少有系統真的建立上千個檔案在一個表空間中。從這個角度看,Bigfile吸引力是不小的。

 

最後,Oracle對於Bigfile Tablespace支援是全面的。儲存層面上,ASMLogical Volumn Manager/RAIDDynamically Extensible Logical VolumesOMF都提供了比較全面的支援。

 

 

但是,Bigfile Tablespace並不是萬靈藥。BigfileOracle層面的Bigfile,並不涉及到OS層面的支援。使用Bigfile的時候,要選擇合適的底層儲存系統提供支援。此外,Bigfile的理念違背了我們過去宣稱的I/O分散理論。所以,最好在有底層強大儲存支援(如ASM)的情況下使用Bigfile,達到最優的效能平衡點。

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

相關文章