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;

想了解更多删除表空间内容可参考 删除表空间

发表评论

后才能评论