一、什么是表空间(Tablespace)和数据文件(Data File)
Data File是具体的物理文件,Linux系统上通过ls命令,Windows系统上使用dir命令可以查看得到,体积相应比较大;一个或多个Data File只属于一个Tablespace;用户的物理对象都存储在Data File里。
Tbalespace则是一个逻辑概念,一组(一个或多个)datafile组成一个tablespace;而一个或多个tablespace在同一时间只属于一个数据库;Tablespace能进一步划分为其他的逻辑单元,如segement、extent和block。
逻辑关系:
Database —(一对多)—>Tablespace —(一对多)—> Segment—(一对多)—>
Extent —(一对多)—>连续的Oracle data block
物理关系:
Data file —(一对多)—>操作系统的block
逻辑<—>物理关系:
Tablespace —(一对多)—>Data file
Oracle data block —(幂的整数倍,一对多)—>操作系统的block
注:操作系统的block是个物理概念,比如一个block是4k,它在内存中也占4页;而Oracledata block是个逻辑概念,它是OSblock的幂的整数倍,可以是4k,8k或16k等等。
Segment包括table,index等等,它有一个或多个extent组成,它可以跨越多个datafile;而extent是由多个连续的block组成,它不可以跨多个datafile;block是数据库进行I/O传输的最小单元。
二、表空间的类型
Tablespace可以从用途的角度,划分为两种:
A. SYSTEM Tablespace:
1.数据字典存储在SYSTEMTablespace中;
2.SYSTEM undo segment 存储在SYSTEMTablespace中。
B. NON-SYSTEM Tablespace:是用户真正用来存储数据库的表空间。
更为科学的划分,是将tablespace划分为三种:
A.Permanent 永久表空间——即包括了SYSTEMTablespace,也包含了用户用来存储数据 的NON-SYSTEMTablespace
B.Undo 表空间
C.Temporary 临时表空间
Undo 和 Temporary表空间都是用来管理数据库的,存储的是临时文件。
三、创建表空间
CREATE TABLESPACE这个命令可以用来创建Tablespace,具体的用法可以查看联机文档SQL LanguageReference。
从10g以后,引入了BIGFILE这一类型,用来满足一些超大数据存储的需求,一个tablespace的体积最大可以支持128TB,但它需要操作系统的支持。
不同的Tablespace可以指定不同的block size,可以和database的block size 不一致。Tablespace中的数据发生了改变,通常会记录在online redo logfile中,指定logging_clause (开启或关闭),能够决定是否记录,从而提高性能。
/*======创建表空间的过程演示=====*/
=====查询当前的表空间====
SQL> select * from v$tablespace;
-- v$tablespace记录了该数据库中有哪些表
TS# NAME INC BIG FLA ENC ---------- ------------------------------ --- --- --- --- 0 SYSTEM YES NO YES 1 SYSAUX YES NO YES 2UNDOTBS1 YESNO YES 4 USERS YES NO YES 3 TEMP NO NO YES 6EXAMPLE YESNO YES 6 rows selected.
=====查询每个表空间中都有哪些文件=====
SQL> desc dba_data_files;
Name Null? Type ------------------------------------------------- ---------------------------- FILE_NAME VARCHAR2(513) FILE_ID NUMBER TABLESPACE_NAME VARCHAR2(30) BYTES NUMBER BLOCKS NUMBER STATUS VARCHAR2(9) RELATIVE_FNO NUMBER AUTOEXTENSIBLE VARCHAR2(3) MAXBYTES NUMBER MAXBLOCKS NUMBER INCREMENT_BY NUMBER USER_BYTES NUMBER USER_BLOCKS NUMBER ONLINE_STATUS VARCHAR2(7)
SQL> col file_name format a40;
SQL> select file_name, tablespace_name from dba_data_files;
FILE_NAME TABLESPACE_NAME ---------------------------------------------------------------------- /oracle/oradata/orcl/users01.dbf USERS /oracle/oradata/orcl/undotbs01.dbf UNDOTBS1 /oracle/oradata/orcl/sysaux01.dbf SYSAUX /oracle/oradata/orcl/system01.dbf SYSTEM /oracle/oradata/orcl/example01.dbf EXAMPLE -- 可以看出,一个数据文件只属于一个表空间
========增加一个表空间==========
SQL> create tablespace mickey datafile
2 ‘/oracle/oradata/orcl/mickey01.dbf‘ size 20M;
-- 增加了一个名为mickey的表空间 Tablespace created.
====查看磁盘变化=======
[[email protected] ~]$ cd /oracle/oradata/orcl
[[email protected] orcl]$ ll
total 1641120 -rw-r-----. 1 oracle oinstall 9748480 Sep 10 10:12 control01.ctl -rw-r-----. 1 oracle oinstall 9748480 Sep 10 10:12 control03.ctl -rw-r-----. 1 oracle oinstall 20979712 Sep 10 10:11 mickey01.dbf # 可以看到多了一个文件mickey01.dbf -rw-r-----. 1 oracle oinstall 5251072 Sep 10 05:42 users01.dbf
=====查看数据库表空间信息=======
SQL> select * from v$tablespace;
TS# NAME INC BIG FLA ENC ---------- ------------------------------ --- --- --- --- 0 SYSTEM YES NO YES 1 SYSAUX YES NO YES 2UNDOTBS1 YES NO YES 4 USERS YES NO YES 3 TEMP NO NO YES 6EXAMPLE YES NO YES 7 MICKEY YES NO YES -- 新增了一个表空间MICKEY 7 rows selected.
SQL> select file_name, tablespace_name from dba_data_files;
FILE_NAME TABLESPACE_NAME ---------------------------------------------------------------------- /oracle/oradata/orcl/users01.dbf USERS /oracle/oradata/orcl/undotbs01.dbf UNDOTBS1 /oracle/oradata/orcl/sysaux01.dbf SYSAUX /oracle/oradata/orcl/system01.dbf SYSTEM /oracle/oradata/orcl/example01.dbf EXAMPLE /oracle/oradata/orcl/mickey01.dbf MICKEY -- 新表空间及其对应的数据文件 6 rows selected.