Oracle 10g大檔案表空間(轉)

zhouwf0726發表於2019-03-16
作者:Fenng
日期:27-Nov-2004 
出處:
http://www.dbanotes.net
版本:0.1

簡單介紹

Oracle 10g 的儲存能力有了顯著的增強。這表現在很多方面,下面介紹 10g 新增的表空間型別:大檔案 (Bigfile) 表空間

大檔案表空間從某種角度來說提高了 Oracle 在 VLDB 上的管理能力。 只有自動段空間管理的 LMT (Locally Managed Tablespaces ) 支援 BIGFILE 表空間。 大檔案表空間只能包含一個檔案,但是檔案可以達到 4G 個資料塊大小。(以下用 BFT 指代 BIGFILE Tablespace。)

BFT 可以和以下儲存技術結合使用:

  • 自動儲存管理(ASM)
  • LVM
  • OMF

理論上的 BFT 可以達到下面所列的值:

資料塊大小(單位:K)BFT 最大值(單位:T)
2k8T
4k16T
8k32T
16k64T
32k128T

在實際環境中,這還受到作業系統的檔案系統的限制。

BFT基本操作

10g 資料庫在建立的時候,會指定預設的表空間型別。如果不特殊指定的話,預設為 SMALLFILE 型別的表空間。

SQL> SELECT *
  2    FROM database_properties                
  3   WHERE property_name = 'DEFAULT_TBS_TYPE';

PROPERTY_NAME        PROPERTY_VALUE  DESCRIPTION
-------------------- --------------- ----------------------------------------
DEFAULT_TBS_TYPE     SMALLFILE       Default tablespace type

這種情況下,如果我們建立表空間的時候不指定型別,那麼預設建立的都是 SMALLFILE 型別的表空間。可以通過 ALTER DATABASE 命令來修改資料庫預設的表空間型別:

SQL> ALTER DATABASE SET DEFAULT bigfile TABLESPACE;

Database altered.

SQL> SELECT *
  2      FROM database_properties                
  3     WHERE property_name = 'DEFAULT_TBS_TYPE';

PROPERTY_NAME        PROPERTY_VALUE  DESCRIPTION
-------------------- --------------- ----------------------------------------
DEFAULT_TBS_TYPE     BIGFILE         Default tablespace type

SQL> 
SQL> ALTER DATABASE SET DEFAULT smallfile TABLESPACE; 

建立 BIGFILE 型別的表空間,只需指定額外的一個引數 BIGFILE 即可,其他和原有建立表空間語法類似:

CREATE BIGFILE TABLESPACE bftbs
    DATAFILE '/u01/app/oracle/oradata/DEMO/bftbs01.dbf' SIZE 5M;

DBA_TABLESPACES (USER_TABLESPACES)與 V$TABLESPACE 這兩個檢視可以檢視 BIGFILE 表空間的相關資訊。先看看 DBA_TABLESPACES 在 10g 中有了什麼變化:

SQL> desc DBA_TABLESPACES
 Name                                      Null?    Type
 ----------------------------------------- -------- ------------------------
 TABLESPACE_NAME                           NOT NULL VARCHAR2(30)
 BLOCK_SIZE                                NOT NULL NUMBER
 INITIAL_EXTENT                                     NUMBER
 NEXT_EXTENT                                        NUMBER
 MIN_EXTENTS                               NOT NULL NUMBER
 MAX_EXTENTS                                        NUMBER
 PCT_INCREASE                                       NUMBER
 MIN_EXTLEN                                         NUMBER
 STATUS                                             VARCHAR2(9)
 CONTENTS                                           VARCHAR2(9)
 LOGGING                                            VARCHAR2(9)
 FORCE_LOGGING                                      VARCHAR2(3)
 EXTENT_MANAGEMENT                                  VARCHAR2(10)
 ALLOCATION_TYPE                                    VARCHAR2(9)
 PLUGGED_IN                                         VARCHAR2(3)
 SEGMENT_SPACE_MANAGEMENT                           VARCHAR2(6)
 DEF_TAB_COMPRESSION                                VARCHAR2(8)
 RETENTION                                          VARCHAR2(11)
 BIGFILE                                            VARCHAR2(3)

SQL> 

和 9i 相比, DBA_TABLESPACES 檢視多了兩列:RETENTION 和 BIGFILE。其中 BIGFILE 列說明該表空間是否為 BFT:

SQL> SELECT tablespace_name, bigfile
  2    FROM dba_tablespaces;

TABLESPACE_NAME                BIG
------------------------------ ---
SYSTEM                         NO
UNDOTBS                        NO
SYSAUX                         NO
TEMP                           NO
USERS                          NO
EXAMPLE                        NO
TEST                           NO
BFTBS                          YES

8 rows selected.
V$TABLESPACE 檢視相對 9i 也增加了新的列:
SQL> desc V$TABLESPACE
 Name                                      Null?    Type
 ----------------------------------------- -------- ------------------------
 TS#                                                NUMBER
 NAME                                               VARCHAR2(30)
 INCLUDED_IN_DATABASE_BACKUP                        VARCHAR2(3)
 BIGFILE                                            VARCHAR2(3)
 FLASHBACK_ON                                       VARCHAR2(3)

其中 FlASHBACK_ON 和 BIGFILE 列都是新增的。

BFT 屬性

BFT有一些特有的屬性。

1.每個表空間只能包含一個資料檔案。如果試圖新增新的檔案,則會報告 ORA-32771 錯誤:

SQL> ALTER TABLESPACE bftbs 
  2  ADD DATAFILE '/u01/app/oracle/oradata/DEMO/bftbs02.dbf' SIZE 5M;
ALTER TABLESPACE bftbs
*
ERROR at line 1:
ORA-32771: cannot add file to bigfile tablespace

2.只有自動段空間管理的 LMT (locally managed tablespaces ) 支援 BFT

SQL> CREATE BIGFILE TABLESPACE bftbs02
  2      DATAFILE '/u01/app/oracle/oradata/DEMO/bftbs02.dbf' SIZE 5M
  3  EXTENT MANAGEMENT DICTIONARY;
CREATE BIGFILE TABLESPACE bftbs02
*
ERROR at line 1:
ORA-12913: Cannot create dictionary managed tablespace


SQL> CREATE BIGFILE TABLESPACE bftbs02
  2          DATAFILE '/u01/app/oracle/oradata/DEMO/bftbs02.dbf' SIZE 5M
  3      SEGMENT SPACE MANAGEMENT MANUAL;
CREATE BIGFILE TABLESPACE bftbs02
*
ERROR at line 1:
ORA-32772: BIGFILE is invalid option for this type of tablespace

3.相對檔案號(RELATIVE_FNO)為1024 ( 4096 on OS/390)

因為BFT只有一個資料檔案,所以其相對檔案號也是固定的:1024

SQL> SELECT tablespace_name, file_id, relative_fno
  2    FROM dba_data_files;

TABLESPACE_NAME                   FILE_ID RELATIVE_FNO
------------------------------ ---------- ------------
USERS                                   4            4
SYSAUX                                  3            3
UNDOTBS                                 2            2
SYSTEM                                  1            1
EXAMPLE                                 5            5
TEST                                    6            6
BFTBS                                   7         1024

7 rows selected.

SQL>

4.rowid的變化

在 BFT 上儲存的表的 ROWID 與 smallfile 表空間上的 rowid 結構有些不同的。要正確得到 rowid 資訊,dbms_rowid 包增加了一個新的引數 ts_type_in 來解決這個問題。參考這個範例:

SQL> SELECT DBMS_ROWID.rowid_block_number (ROWID, 'BIGFILE')
  2    FROM foo;

DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID,'BIGFILE')
----------------------------------------------
                                            24

SQL> 

你可以建立多大的表空間?

我們在前面提及,BFT 還受到作業系統的檔案系統的限制。下面我們以 Linux 作業系統為例:

SQL> SHOW parameters db_block_size

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_block_size                        integer     8192
SQL> 
也就是說,理論上我們可以建立最大 32T (4G*8K) 的表空間。我們可以做到麼?
SQL> CREATE BIGFILE TABLESPACE bftbs02
  2      DATAFILE '/u01/app/oracle/oradata/DEMO/bftbs02.dbf' SIZE 20T reuse;
CREATE BIGFILE TABLESPACE bftbs02
*
ERROR at line 1:
ORA-01119: error in creating database file '/u01/app/oracle/oradata/DEMO/bftbs02.dbf'
ORA-27059: could not reduce file size
Linux Error: 27: File too large
Additional information: 2

SQL> 

注意我們得到的作業系統資訊(黑色部分):File too large 。這說明超出了作業系統允許值。我所用的環境是Fedora Core Linux, 核心的版本是2.6.9,檔案系統是 EXT3 。2.4以後的版本的核心都是支援 LFS (Large File Support)的。

檔案系統(塊)檔案大小限制檔案系統大小限制
ext2/3 (2K)256G8T
ext2/3 (4K)2T16T
ext2/3 (8K)64T32T
ReiserFS 3.6 1E16T

我們檢查一下OS檔案系統塊大小:

[root@FC3 ~]# tune2fs -l /dev/hda7 | grep Block
Block count:              2621440
Block size:               4096
Blocks per group:         32768
[root@FC3 ~]#

也即,我們可以在作業系統上建立不大於 2T 的檔案。雖然我們沒有那麼大的儲存空間,不妨也測試一下:

SQL> CREATE BIGFILE TABLESPACE bftbs02
  2      DATAFILE '/u01/app/oracle/oradata/DEMO/bftbs02.dbf' SIZE 1800g;

在另外一個終端中,觀察該目錄的變化情況:

[root@FC3 DEMO]# ls -ltr
total 1159048
-rw-------  1 oracle oracle       5251072 Nov 28 20:05 bftbs01.dbf
-rw-------  1 oracle oracle 1932735291392 Nov 28 20:49 bftbs02.dbf
[root@FC3 DEMO]# 

哇,我們真的能觀察到Oracle在建立“超大”檔案呢,接近1.8T 的檔案 :-) 要過一會兒,Oracle 才會報告錯誤(畢竟1800G 的大檔案):

CREATE BIGFILE TABLESPACE bftbs02
*
ERROR at line 1:
ORA-19502: write error on file "/u01/app/oracle/oradata/DEMO/bftbs02.dbf",
blockno 898048 (blocksize=8192)
ORA-27072: File I/O error
Additional information: 898047

可見,在本例中,由於作業系統檔案系統的限制,我們只可以建立2T以下的 BFT。

你需要BFT麼?

應用 BFT 的話,優點缺點都存在。根據 Oracle 官方的文件,DB_FILES 和 MAXDATAFILES 這兩個引數的值給 SGA 帶來的壓力會減輕(原來的壓力就很大麼?)。資料庫中最大資料檔案數是有限的 (64K files),BFT 的出現的確對海量資料庫有一定的積極意義。從一定程度上來說,BFT 簡化了管理多個資料檔案的複雜性,但是在恢復的時候可能是一場災難。

在筆者看來,至少我們現在在大多數情況下不需要用 BFT 。"你要把雞蛋都放到一個籃子裡麼? "

參考資訊


Oracle Database Administrator's Guide 10g Release 1 (10.1) Part Number B10739-01 ( Note 62294.1 ) Large File Support in Linux - http://www.suse.de/~aj/linux_lfs.html
Metalink [NOTE:262472.1] 10g: BIGFILE Type Tablespaces Versus SMALLFILE Type


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

相關文章