文章来自:http://wenku.baidu.com/link?url=1mGNCM3jaaJQmZveGFpT8EwdRhJm8NWtZXoRW51DZdGnFr38rVyU4LkrDSnx_fGsVWOvMqiU7I6sdoQrZRTRJX-83ACPKXLQYs3Dtbt6-pe
BigFile和SmallFile表空间技术
在前面的章节中大家或许注意到,在Oracle 10g创建数据库的脚本中,有这样的代码:
SMALLFILE DEFAULT TEMPORARY TABLESPACE TEMP TEMPFILE SIZE 20M
AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED
SMALLFILE UNDO TABLESPACE "UNDOTBS1" DATAFILE
SIZE 200M AUTOEXTEND ON NEXT 5120K MAXSIZE UNLIMITED
其中SmallFile是Oracle 10g新增的特性。从Oracle 10g开始,Oracle推出了大文件表空间(BigFile Tablespace,BFT)支持,相对地,也就有了小文件表空间(SmallFile Tablespace,SFT)。
大文件表空间只能包含一个文件(这是区分大文件与小文件表空间的标准),但是文件最大可以达到4GB个数据块大小,按照Oracle通常支持的不同数据块大小(2KB、4KB、8KB、16KB和32KB),最小的大文件表空间单个文件大小可达8TB,最大可以达到128TB,当然具体单个文件能够达到的大小还受到操作系统的限制。
和BFT相对应的、以前的表空间管理方式就被称为SFT。Oracle通过BFT支持,极大地扩展了数据库的存储能力。由于引入了BFT,Oracle将这一特性作为数据库属性进行维护:
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
由于数据库缺省的表空间类型为SFT,所以缺省创建的都是小文件表空间。当然可以修改这个属性:
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> ALTER DATABASE SET DEFAULT smallfile TABLESPACE;
Database altered.
如果在缺省设置下要创建BIGFILE类型的表空间,就需要指定一个新的参数BIGFILE,其他和原有创建表空间语法类似。如果数据库使用了ASM或OMF技术,那么创建就更为简化,以下一条命令就足够了:
SQL> CREATE BIGFILE TABLESPACE bftbs datafile size 10M;
Tablespace created.
通过DBA_TABLESPACES视图,可以查看表空间属性,这个视图中新增加了一个字段BIGFILE用于标识一个表空间是否属于BIGFILE表空间:
SQL> select tablespace_name,bigfile from dba_tablespaces;
TABLESPACE_NAME BIG
------------------------------ ---
SYSTEM NO
UNDOTBS1 NO
SYSAUX NO
TEMP NO
BOSSMGR YES
DBMON NO
BFTBS YES
7 rows selected.
由于大文件表空间只能包含一个数据文件,所以其相对文件号(RELATIVE_FNO)被设为1024:
SQL> select file_name,file_id,relative_fno from dba_data_files;
FILE_NAME FILE_ID RELATIVE_FNO
-------------------------------------------------
- ---------- ------------
+DATADG/smsboss/datafile/system.261.577731551
1 1
+DATADG/smsboss/datafile/undotbs1.260.577731573
2 2
+DATADG/smsboss/datafile/sysaux.262.577731593
3 3
+DATADG/smsboss/datafile/users.256.577731607
4 4
+DATADG/smsboss/datafile/bossmgr.271.577809233
5 1024
+DATADG/smsboss/datafile/dbmon.5417.595530625
6 6
+DATADG/smsboss/datafile/bftbs.5416.613388183
7 1024
大文件表空间可以最小化表空间文件数量,从而简化DBA的管理,在大型的数据库中,包含几十、数百文件的表空间随处可见,随着文件数量的增加,很多数据库参数就要做出相应的调整,如db_files,静态参数的调整又要重新启动数据库才能生效,这都给数据库的维护带来不便,而BFT的出现,可以彻底解决这些问题。由于文件数量的减少,控制文件的空间使用也可以随之减少,检查点等数据库内部操作需要同步的文件头数量也大大减少,总之,大文件表空间的出现为超大型数据库(VLDB)的管理带来了极大的便利。
但是需要注意的是,一个大文件自然会带来I/O或存储上的问题,由于BFT只能存在一个数据文件,所以要保证分配的磁盘或磁盘组具有足够的空间;为了避免I/O的竞争,在数据库底层,磁盘的分配和规划也非常重要,通常Striping/RAID或Oracle的ASM技术等需要被采用去分散I/O,避免磁盘上的竞争。
例如,在一个Oracle 10gR2 +ASM生产环境中,以32KB块大小建立的大文件表空间已经使用了200GB的空间:
SQL> SELECT a.tablespace_name, b.file_name,
a.block_size, a.bigfile,
2 b.BYTES / 1024 / 1024 / 1024 gb
3 FROM dba_tablespaces a, dba_data_files b
4 WHERE a.tablespace_name = b.tablespace_name
AND a.bigfile = 'YES';
TABLESPACE_NAME
------------------------------
FILE_NAME BLOCK_SIZE BIG GB
---------------------------------------------
----- ---------- --- ----------
BOSSMGR
+DATADG/smsboss/datafile/bossmgr.271.577809233
32768 YES 205.078125