oracle的表空间及数据文件
一、默认表空间
Oracle 安装时会自动创建几个默认表空间,可以在 dba_tablespaces
这张表查看到默认表空间 :

说明:
SYSTEM
:管理任何其他表空间。它包含数据字典,有关数据库管理信息的表和视图,编译的存储对象(如触发器,过程等)。SYSAUX
:辅助表空间。UNDOTBS1
:撤销表空间。存储的是撤销信息,可以用于恢复操作。TEMP
:临时表空间。可用于排序操作等。USERS
:存储用户的表和索引数据。
使用 dba_users
这张表可以查询用户的默认表空间。

从结果中可以发现,一个用户只能分配一个表空间,一个表空间可以被多个用户使用
如果想查询 SYS 和 SYSTEM 这两个用户的默认表空间可以使用 where 限定查询条件

可以看到 SYS 和 SYSTEM 这两个用户的默认表空间都是 SYSTEM 表空间。
二、表空间的管理
表空间的类型有如下三种:
- 永久表空间:永久表空间包含持久性模式对象。永久表空间中的对象存储在数据文件中。
- 撤销表空间:撤消表空间是在自动撤消管理模式下运行数据库时,管理撤消数据的一种永久性表空间。
- 临时表空间:临时表空间仅包含会话期间的模式对象。临时表空间中的对象存储在临时文件中。
(此段来自 创建表空间-官方文档)
三、创建表空间
创建一个最简单的表空间:
SQL> create tablespace tp1
datafile 'tp1.dbf'
size 1M;
- 第一行的
tp1
是表空间的名字。 - 第二行是表空间的数据文件是
tp1.dbf
。 - 第三行是表空间大小为
1M
。
默认情况下,创建的表空间不会自动扩展,如果我们想要在数据文件充满时进行自动扩展,可以创建一个自动扩展的表空间,当数据文件装满后,它会自动增加数据文件的尺寸。
SQL> create smallfile tablespace tp2
datafile 'tp2.dbf'
size 10M autoextend on next 1M maxsize 20M
extent management local autoallocate
segment space management auto;
代码详细解释:

三、更改表空间
1、重命名表空间
例如我们想要把 tp2
这个表空间重命名为 syl_tp
,可以使用如下语句:
SQL> alter tablespace tp2 rename to syl_tp;
注意:重命名表空间不会重命名与之关联的任何数据文件。
设置表空间的读写状态
表空间在创建时默认是读写状态,我们可以将其设置为只读状态。
SQL> alter tablespace tp1 read only;
如果要改回读写状态,可以使用下面的语句:
SQL> alter tablespace tp1 read write;
设置表空间的可用状态
可用状态指的是表空间的两种状态:
- 联机状态
ONLINE
:表空间可用,可以被使用。 - 脱机状态
OFFLINE
:表空间和其数据文件不可用。脱机状态还包括三种方式,即NORMAL
(正常状态):将表空间中的所有数据文件中的所有块刷新到系统全局区域(SGA)之外。这是默认的方式。TEMPORARY
(临时状态):Oracle 数据库会为表空间中的所有联机数据文件执行检查点,但不能确保可以写入所有文件。IMMEDIATE
(立即状态):立即使表空间和数据文件脱机,不会确保表空间文件可用,并且不执行检查点。可能丢失未提交的更改。
我们下面将表空间 tp1
以 normal
方式脱机:
SQL> alter tablespace tp1 offline normal;
注意:不能把一个临时表空间脱机。
再将 tp1
设置成联机状态:
SQL> alter tablespace tp1 online;
调整表空间的大小
在创建表空间时,如果使用了 autoextend
,则可以自动调整数据文件的大小。如果没有使用,就需要我们手动去调整。有两种调整方式可供选择:
- 调整现有数据文件的大小
下面我们将表空间 tp1
的尺寸更改为 2M
:
SQL> alter database datafile 'tp1.dbf' resize 2m;
向表空间添加数据文件
SQL> alter tablespace tp1 add datafile 'tp1_02.dbf' size 1m;
使用 v$tablespace
和 v$datafile
这两个视图可以查看到表空间的数据文件和大小:
SQL> select t.name tname,d.name dname,d.bytes from v$tablespace t join v$datafile d using(ts#) where t.name like 'TP1';
ts#
:tablespace number。

四、删除表空间
例如我们要删除 tp1
这个表空间及其数据文件:
SQL> drop tablespace tp1 including contents and datafiles;
如果表空间包含的表与另一个表空间的表存在外键关系,就会删除失败,这个时候我们可以使用 cascade constraints
将表空间中的完整性也删除:
SQL> drop tablespace syl_tp including contents cascade constraints;
使用下面的命令查看表空间会发现表空间已经被删除:
SQL> select tablespace_name from dba_data_files;
想了解更多删除表空间内容可参考 删除表空间