Oracle 表空间管理

一、表空间管理指南

  表空间是将相关逻辑结构组合在一起的数据库存储单元。数据库数据文件存储在表空间中。

1.使用多个表空间

  使用多个表空间可以更灵活地执行数据库操作。
  当一个数据库有多个表空间时,你可以:

  • 将用户数据与数据字典数据分离以减少I/O争用。
  • 为了避免在某个表空间必须脱机时影响多个应用,建议将不同应用之间的数据进行分离。
  • 将不同表空间的数据文件存储在不同的磁盘驱动器上,以减少I/O争用。
  • 将个别表空间脱机,而其他表空间保持联机,从而提供更好的整体可用性。
  • 通过为特定类型的数据库(例如高更新活动、只读活动或临时段存储)预留一个表空间来优化表空间使用。
  • 备份单个表空间。

  有些操作系统限制了能够同时打开的文件数量。这样的限制可能会影响可以同时联机的表空间的数量。为了避免超出操作系统的限制,请有效地规划表空间。只创建足够的表空间来满足您的需要,并使用尽可能少的文件创建这些表空间。如果必须增加表空间的大小,那么添加一个或两个大的数据文件,或者创建启用自动扩展的数据文件,而不是创建许多小的数据文件。

2.为用户分配表空间配额

  为将要创建表、集群、物化视图、索引和其他对象的用户授予创建对象的权限,并在用于保存对象段的表空间中授予配额(空间限额或限制)。

说明:对于包、过程、函数等PL/SQL对象,用户只需要拥有创建这些对象的权限。创建这些PL/SQL对象不需要显式的表空间配额。

二、创建表空间

  创建表空间是为了将相关的逻辑结构(如表和索引)聚集在一起。数据库数据文件存储在表空间中。

1.关于创建表空间

  要创建一个新的表空间,请使用SQL语句create tablespace或create TEMPORARY tablespace。创建表空间必须具有CREATE TABLESPACE系统权限。
  在创建表空间之前,必须创建一个数据库来包含它。任何数据库的主要表空间都是SYSTEM表空间,它包含数据库服务器运行的基本信息,如数据字典和系统回滚段。SYSTEM表空间是创建数据库时创建的第一个表空间。它像其他表空间一样管理,但需要更高级别的特权,并且在某些方面受到限制。例如,您不能重命名或删除SYSTEM表空间或使其脱机。
  SYSAUX表空间作为SYSTEM表空间的辅助表空间,也总是在创建数据库时创建。它包含各种Oracle产品和特性使用的模式,因此这些产品不需要自己的表空间。和SYSTEM表空间一样,SYSAUX表空间的管理需要更高级别的安全性,不能重命名或删除它。
  创建表空间的步骤因操作系统而异,但第一步总是使用操作系统创建一个目录结构,将在其中分配数据文件。在大多数操作系统上,当您创建新的表空间或通过添加数据文件来更改现有表空间时,指定数据文件的大小和完全指定的文件名。无论是创建新的表空间还是修改已有的表空间,数据库都会自动分配和格式化指定的数据文件。
  你也可以使用CREATE UNDO TABLESPACE语句来创建一个特殊类型的表空间,称为UNDO表空间,它是专门用来包含UNDO记录的。这些是由数据库生成的记录,用于回滚或撤消对数据库的更改,以实现恢复、读取一致性或 ROLLBACK 语句的请求。
  可以使用ALTER TABLESPACE或ALTER DATABASE语句修改表空间。您必须具有相应的ALTER TABLESPACE或ALTER DATABASE系统权限。

2.本地管理表空间

  本地管理的表空间使用存储在每个数据文件中的位图来管理区(extent)。

(1)关于本地管理的表空间

  本地管理的表空间通过使用位图跟踪表空间本身中的所有区信息。

本地管理的表空间提供了以下好处:

  • 快速、并发的空间操作。空间分配和释放会修改本地管理的资源(存储在头文件中的位图)。
  • 增强性能
  • 允许使用可读的备用数据库,因为本地管理的临时表空间不会生成任何撤销(undo)或重做(redo)。
  • 空间分配被简化了,因为当指定AUTOALLOCATE子句时,数据库会自动选择适当的区大小。
  • 用户对数据字典的依赖降低了,因为必要的信息存储在文件头和位图块中。
  • 对于本地管理的表空间,合并空闲区是不必要的。

  所有表空间,包括SYSTEM表空间,都可以进行本地托管。
  DBMS_SPACE_ADMIN包提供本地托管的表空间的维护过程。

(2)创建本地管理的表空间

  通过在Create tablespace语句的EXTENT MANAGEMENT子句中指定LOCAL创建本地管理的表空间。
  这是新的永久表空间的默认值,但是您必须指定EXTENT MANAGEMENT LOCAL子句来指定AUTOALLOCATE子句或UNIFORM子句。您可以使用AUTOALLOCATE子句(默认值)让数据库自动管理区,也可以指定表空间使用特定大小的统一区(uniform)进行管理。
  如果您希望表空间包含各种大小的对象,且这些对象需要许多具有不同区大小的区,那么AUTOALLOCATE是最佳选择。如果对空间分配和释放的大量控制对您来说并不重要,AUTOALLOCATE也是一个不错的选择,因为它简化了表空间管理。使用此设置可能会浪费一些空间,但是让Oracle数据库管理空间的好处很可能超过这个缺点。
  如果您希望精确地控制未使用的空间,并且可以准确地预测为一个或多个对象分配的空间以及区的数量和大小,那么UNIFORM是一个不错的选择。此设置确保在表空间中永远不会有不可用的空间。
  当您没有明确指定区管理的类型时,Oracle数据库将按照如下方式确定区管理:

  • 如果CREATE TABLESPACE语句省略了DEFAULT 存储子句,则数据库将创建一个本地管理的自动分配表空间。
  • 如果CREATE TABLESPACE语句包含一个DEFAULT 存储子句,那么数据库会考虑以下情况:
    – 如果指定了MINIMUM EXTENT子句,数据库将评估MINIMUM EXTENT、INITIAL和NEXT的值是否相等,PCTINCREASE的值是否为0。如果是,数据库将创建一个本地管理的统一表空间,其extent size = INITIAL。如果MINIMUM EXTENT、INITIAL和NEXT参数不相等,或者PCTINCREASE不为0,则数据库将忽略您可能指定的任何区存储参数,并创建一个本地管理的自动分配表空间。
    – 如果没有指定MINIMUM EXTENT子句,则数据库只评估INITIAL和NEXT的存储值是否相等,PCTINCREASE是否为0。如果是,则表空间是本地管理和统一的。否则,表空间是本地管理和自动分配的。

# 1.授予用户create tablespace权限 SYS@orcl> grant create tablespace to zb; Grant succeeded. 1. 2.下面的语句创建了一个名为lmtbsb的本地管理表空间,并指定了AUTOALLOCATE: ZB@orcl> create tablespace lmtbsb datafile '/u01/app/oracle/oradata/orcl/lmtbsb01.dbf' size 50M extent management local autoallocate; Tablespace created. 1. 3.注意:如果不是DBA用户或拥有创建表空间权限,则创建表空间会报如下错: ORA-01031: insufficient privileges 1. 4.下面的示例创建一个具有统一128K区的表空间。(在一个有2K块的数据库中,每个区相当于64个数据库块)。 ## 每个128K区由该文件区位图中的一位表示。 ZB@orcl> create tablespace lmtbsa datafile '/u01/app/oracle/oradata/orcl/lmtbsa01.dbf' size 50M extent management local uniform size 128K; Tablespace created.