oracle表空间

Oracle表空间是Oracle数据对象和数据存储的容器,Oracle表空间经常和数据文件成对出现,一个表空间可以对应多个数据文件,而一个数据文件只能在一个表空间当中。我们在创建表空间时,就会默认创建一个数据文件,同理,我们创建数据文件时,必须指定一个表空间。

Oracle数据库存储数据是有一个个表空间组成的,一个表空间当中存储着多个数据文件,Oracle的数据(表、索引等数据)存储在数据文件当中,在表空间当中的逻辑单位是段(segment),例如:

我们创建一个索引时,会在指定表空间的创建一个以索引名字命名的索引段,然后在索引段当中创建一个或者多个区(extent),用来存储索引数据,一个区段只能存在于一个数据文件当中。再细分,一个区段当中,可以分为多个区块(block)。区块是Oracle数据库当中最小的空间分配单位。

一个文件在磁盘空间当中存储一般都不是连续的,因此,表空间当中的段是由不同数据文件当中的区段组成的。

默认表空间

Oracle安装完后(笔者采用的是Oracle11g),会有五个个默认的表空间,分别是:

SYSAUX:安装Oracle11g示例的数据库表空间。
SYSTEM:存储sys/system用户表、存储过程、视图等数据库对象。
UNDOTBS1:用于存储撤销(用于回滚)的信息。
TEMP:临时表空间,用于存储SQL语句处理的表和索引信息。
USERS:存储数据库用户创建的数据库对象信息。

查看表空间

  1. select * from dba_tablespaces;

查看指定用户的默认表空间

  1. select T.username,--用户名
  2. T.account_status,--用户状态
  3. T.default_tablespace,--默认表空间
  4. T.temporary_tablespace,--临时表空间
  5. T.created--创建时间
  6. from dba_users t
  7. where t.username in ('SYS', 'SYSTEM', 'STUDENT')

通过结果可以看出,SYS、SYSTEM的默认表空间都是SYSTEM,临时表空间为TEMP,而STUDENT的表空间是笔者指定的USERS表空间。

创建表空间

Oracle创建表空间是数据库管理员经常要做的事情,在实际当中,一般独立的业务系统会有一个独立的用户进行独立开发管理,附带的会独立创建一个自己的表空间进行存储。

Oracle创建表空间可以通过OEM企业管理器、SQL命令两种方式进行创建,笔者这里采用SQL命令方式进行讲解,OEM方式读者可以自行登录OEM后台自行试验。

创建表空间语法
  1. create tablespace tab_name datafile 'filename'
  2. size n
  3. [autoextend on next n1 maxsize m /of]
  4. [permanent]
  5. [extent management local/dictionary];create tablespace:创建表空间的关键字。
  6. tab_name:创建后表空间的名字。
  7. datafile:指定数据文件的路径为filename
  8. size n:指定数据文件的大小。
  9. [autoextend on next n1 maxsize m /of ]:表示表空间是否是自动扩展的,on 为自动扩展,of为不扩展,当自动扩展时,next n1表示自动扩展的大小,max size m 表示数据文件最大扩展到m大小。
  10. [permanent] :表示创建的表空间的类型,permanent表示永久表空间,不填都是默认永久表空间。
  11. [extent management local/dictionary]:表示表空间管理的方式,local表示本地的管理模式,dictionary表示数据字典管理模式,默认都是本地管理方式。
  • create tablespace:创建表空间的关键字。
  • tab_name:创建后表空间的名字。
  • datafile:指定数据文件的路径为filename。
  • size n:指定数据文件的大小。
  • [autoextend on next n1 maxsize m /of ]:表示表空间是否是自动扩展的,on 为自动扩展,of为不扩展,当自动扩展时,next n1表示自动扩展的大小,max size m 表示数据文件最大扩展到m大小。
  • [permanent] :表示创建的表空间的类型,permanent表示永久表空间,不填都是默认永久表空间。
  • [extent management local/dictionary]:表示表空间管理的方式,local表示本地的管理模式,dictionary表示数据字典管理模式,默认都是本地管理方式。

例:

  1. create tablespace student
  2. datafile 'E:\APP\ADMIN\ORADATA\ORCL\student.DBF'
  3. size 100m
  4. autoextend on next 10m maxsize 500m
  5. permanent
  6. extent management local;

创建一个student表空间,指定了数据文件为“E:\APP\ADMIN\ORADATA\ORCL\student.DBF”,表空间是自动扩展的,每次自动扩展大小为10M,最大扩展到500M,创建的是永久表空间,用来存储student用户的数据库对象和数据,管理模式为本地管理。

我们查看数据字典dba_data_files和dba_tablespaces对创建好后的student表空间进行查询。

  1. select t.TABLESPACE_NAME, --表空间名
  2. t.FILE_NAME, --文件名
  3. t.AUTOEXTENSIBLE, --是否自动扩展
  4. t.BYTES / 1024 / 1024, --表空间初始大小
  5. t.MAXBYTES / 1024 / 1024, --表空间最大扩展到多少
  6. b.CONTENTS, --表空间类型
  7. b.EXTENT_MANAGEMENT --表空间管理模式
  8. from dba_data_files t, dba_tablespaces b
  9. where t.TABLESPACE_NAME = b.TABLESPACE_NAME

删除表空间

Oracle删除表空间的操作经常发生在数据库部分业务拆分的情况下,会把不必要的表空间和对应的数据文件删除,释放当前的数据库的硬件空间。

删除表空间可以通过OEM企业管理、SQL命令两种方式进行直接删除。Oracle删除表空间的时候不需要先删除数据文件,再删除表空间,可以选择删除表空间时,把数据文件一并删除。

  1. drop tablespace tab_name [including contents][cascade constraints]
  • drop tablespace:删除表空间的关键字,tab_name表示表空间名字。
  • [including contents]:表示在删除表空间的时候把表空间中的数据文件一并删除。
  • [cascade constraints]:表示在删除表空间的时候把表空间的完整性也一并删除。比如表的外键,和触发器等就是表的完整性约束。

例:

  1. drop tablespace student
  2. including contents
  3. cascade constraints;

临时表空间

Oracle临时表空间主要是存储数据库的排序操作、临时表、中间排序结果等临时对象。例如,我们进行大数量级的排序操作时,当数据库内存不够时,就会写入临时表空间,当操作完成后,临时表空间就会自动清空释放。Oracle经常使用到临时表空间的操作有:create index(创建索引)、group by(分组查询)、order by(排序时)、集合运算时(union、minus、intersect)、多表连接查询时,当数据库内存不足时,会用到临时表空间。

创建临时表空间

Oracle数据库在安装完后就会创建一个默认的临时表空间temp。Oracle创建临时表空间的语法结构和创建持久化表空间一样,只是多了关键字temporary进行创建临时表空间。

  1. create temporary tablespace tempname
  2. tempfile 'filename'
  3. size m;
  • create temporary tablespace:表示创建临时表空间,tempname表示创建临时表空间的名字。
  • filename:指定临时表空间数据文件的位置。
  • size m:表示临时表空间的大小。

例: 创建临时表空间temp1

  1. create temporary tablespace temp1
  2. tempfile 'E:\APP\ADMIN\ORADATA\ORCL\temp1.DBF'
  3. size 50m;

查看创建的表空间2020-10-26 16:37:42 星期一

  1. select t.TABLESPACE_NAME, --表空间名
  2. t.FILE_NAME, --文件名
  3. t.AUTOEXTENSIBLE, --是否自动扩展
  4. t.BYTES / 1024 / 1024 as tsize, --表空间初始大小
  5. t.MAXBYTES / 1024 / 1024 msize, --表空间最大扩展到多少
  6. b.CONTENTS, --表空间类型
  7. b.EXTENT_MANAGEMENT --表空间管理模式
  8. from dba_temp_files t, dba_tablespaces b
  9. where t.TABLESPACE_NAME = b.TABLESPACE_NAME

临时表空间组

Oracle10g之前,我们只能通过扩充临时表空间,因为,Oracle10g之前每个用户只能指定一个临时表空间。但是在Oracle11g中Oracle数据提供了Oracle临时表空间组的概念。应许把多个临时表空间组成一个组,然后把用户指定到这个临时表空间组,从而达到一个用户可以同时使用多个临时表空间的目的。

Oracle临时表空间组中至少得有一个临时表空间,并且同组下的表空间不能有重名。Oracle临时表空间组不用显式的创建,在创建临时表空间的时候为他指定一下临时表空间组即可,实际上创建临时表空间组就是为表空间设定组。

创建临时表空间时指定临时表空间组:这种创建的方式和创建表空间的语法很相似

  1. create temporary tablespace tempname
  2. tempfile 'filename'
  3. size m
  4. tablespace group groupname;

例:

  1. create temporary tablespace temp2
  2. tempfile 'E:\APP\ADMIN\ORADATA\ORCL\temp2.DBF'
  3. size 50m
  4. tablespace group tempgroup;

查看创建的临时表空间组

  1. select * from dba_tablespace_groups;

把原有的临时表空间转移到创建好的临时表空间组当中,下面把临时表空间temp1转移到tempgroup组中

  1. alter tablespace temp1
  2. tablespace group tempgroup;

创建好临时表空间组,可以把数据库的默认临时表空间设置为表空间组,也可以把对应的用户的临时表空间替换成临时表空间组,从而达到优化临时表空间的目的

  1. --修改数据库默认临时表空间
  2. alter database default temporary tablespace tempgroup;
  3. --修改用户默认临时表空间
  4. alter user student temporary tablespace tempgroup;

已经用户student的临时表空间指向了tempgroup临时表空间组。

文档更新时间: 2020-10-26 16:50   作者:张尚