简单介绍
Oracle 10g 的存储能力有了显著的增强。这表现在很多方面,下面介绍 10g 新增的表空间类型:大文件 (Bigfile) 表空间。
大文件表空间从某种角度来说提高了 Oracle 在 VLDB 上的管理能力。 只有自动段空间管理的 LMT (Locally Managed Tablespaces ) 支持 BIGFILE 表空间。 大文件表空间只能包含一个文件,但是文件可以达到 4G 个数据块大小。(以下用 BFT 指代 BIGFILE Tablespace。)
BFT 可以和以下存储技术结合使用:
自动存储管理(ASM)
LVM
OMF
理论上的 BFT 可以达到下面所列的值:
数据块大小(单位:K) BFT 最大值(单位:T)
2k 8T
4k 16T
8k 32T
16k 64T
32k 128T
在实际环境中,这还受到操作系统的文件系统的限制。
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 (4