[Oracle 10g] 大文件表空間
2024-08-29 13:44:58
供稿:網友
作者: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)2k8T4k16T8k32T16k64T32k128T
在實際環境中,這還受到操作系統的文件系統的限制。
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 typeSQL>
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 NOUNDOTBS NOSYSAUX NOTEMP NOUSERS NOEXAMPLE NOTEST NOBFTBS YES8 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 tablespaceSQL> 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 4SYSAUX 3 3UNDOTBS 2 2SYSTEM 1 1EXAMPLE 5 5TEST 6 6BFTBS 7 10247 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')---------------------------------------------- 24SQL>
你可以創建多大的表空間?
我們在前面提及,BFT 還受到操作系統的文件系統的限制。
下面我們以 linux 操作系統為例:
SQL> SHOW parameters db_block_sizeNAME TYPE VALUE------------------------------------ ----------- ------------------------------db_block_size integer 8192SQL>
也就是說,理論上我們可以創建最大 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 sizeLinux Error: 27: File too largeAdditional information: 2SQL>
注重我們得到的操作系統信息(黑色部分):File too large 。這說明超出了操作系統答應值。我所用的環境是Fedora Core Linux, 內核的版本是2.6.9,文件系統是 EXT3 。2.4以后的版本的內核都是支持 LFS (Large File Support)的。
文件系統(塊)文件大小限制文件系統大小限制ext2/3 (2K)256G8Text2/3 (4K)2T16Text2/3 (8K)64T32TReiserFS 3.6 1E16T
我們檢查一下OS文件系統塊大小:
[root@FC3 ~]# tune2fs -l /dev/hda7 grep BlockBlock count: 2621440Block size: 4096Blocks 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 -ltrtotal 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 errorAdditional 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
本文作者Fenng,某美資公司DBA,業余時間混跡于各數據庫相關的技術論壇且樂此不疲。目前關注如何利用ORACLE數據庫有效地構建企業應用。對Oracle tuning、troubleshooting有一點研究。
個人技術站點:http://www.dbanotes.net/ 。可以通過電子郵件 dbanotes@Gmail.com 聯系到他。
原文出處http://www.dbanotes.net/Oracle/10g_Bigfile_Tablespaces.htm
All Articles (by Fenng) are licensed under a Creative Commons License.
I would welcome any feedback. Please send questions, comments or corrections to dbanotes@gmail.com