3.1.1 表空间类型
Oracle数据库中主要的表空间类型有:永久表空间、撤销表空间和临时表空间。永久表空间包含一些段,这些段在超出会话或事务的持续时间后持续存在。
虽然撤销表空间可能有一些段在超出会话或事务末尾后仍然保留,但它为访问被修改表的select语句提供读一致性,同时为数据库的大量闪回特性提供撤销数据。然而,撤销段主要用来存储一些列在更新或删除前的值,或者用于提供指示,表明不存在用于插入的行。如果用户的会话在用户发出commit或rollback前失败,则取消更新、插入和删除。用户的会话永远不可以直接访问撤销段,并且撤销表空间可能只有撤销段。
顾名思义,临时表空间包含暂时的数据,这些数据只存在于会话的持续时间,例如完成分类操作的空间不适合来自于内存。
大文件表空间可用于这3类表空间的任何一种,大文件表空间将维护点从数据文件移动到表空间,从而简化了表空间的管理。大文件表空间只包含一个数据文件。大文件表空间也有一些缺点,本章后文中会介绍这些缺点。
1. 永久表空间
SYSTEM表空间和SYSAUX表空间是永久表空间的两个示例。此外,任何在超出会话或事务边界后需要由用户或应用程序保留的段都应该存储在永久表空间中。
SYSTEM表空间 用户段绝对不应该驻留在SYSTEM表空间中。从Oracle 10g开始,除了保留Oracle 9i中指定默认临时表空间的能力外,还可以指定默认的永久表空间。
如果使用Oracle通用安装程序(Oracle Universal Installer,OUI)来创建数据库,则会为永久段和临时段创建不同于SYSTEM的单独表空间。如果手动创建数据库,则要确保指定默认永久表空间和默认临时表空间,如同下面的样例create database命令。
CREATE DATABASE rjbdb |
从Oracle 10g开始,SYSTEM表空间默认为本地管理。换句话说,所有的表空间使用由位图段管理,位图段在表空间的第一个数据文件的第一个部分中。在本地管理SYSTEM表空间的数据库中,数据库中的其他表空间也必须被本地管理,或者必须是只读的。使用本地管理的表空间可免除一些SYSTEM表空间的争用,因为表空间的空间分配和释放操作不需要使用数据字典表。关于本地管理表空间的更多细节将在第6章中介绍。
SYSAUX表空间 类似于SYSTEM表空间,SYSAUX表空间不应该有任何用户段。SYSAUX表空间的内容根据应用程序划分,可以使用EM数据库控制台(Database Control)进行查看。通过单击Server选项卡下面的Tablespaces链接,并单击SYSAUX链接,可以编辑SYSAUX表空间。图3-1为SYSAUX中空间使用的图形表示。
![]() |
图3-1 EM数据库控制台中的SYSAUX表空间内容 |
如果驻留在SYSAUX表空间中的特定应用程序的空间使用率过高,或者由于与其他使用SYSAUX表空间的应用程序严重争用表空间而造成了I/O瓶颈,那么可以将这些应用程序中的一个或多个移动到不同的表空间。将如图3-1所示的屏幕向下滚动,可以单击一个SYSAUX占用者的Change Tablespace链接,将此SYSAUX占用者移动到另一个表空间,如图3-2所示。第6章将介绍使用命令行界面将SYSAUX占用者移动到不同表空间的示例。
![]() |
图3-2 使用EM数据库控制台移动SYSAUX占用者 |
可以像监控其他表空间一样监控SYSAUX表空间。本章后面将介绍如何使用EM数据库控制台来标识表空间中的热点。
2. 撤销表空间
多个撤销表空间可以存在于一个数据库中,但在任何给定的时间内只有一个撤销表空间可以是活动的。撤销表空间用于回滚事务,以及提供与DML语句同时运行在相同的表或表集上的select语句的读一致性,并支持大量Oracle闪回特性,例如闪回查询(Flashback Query)。
撤销表空间需要正确地确定大小,从而防止"Snapshot too old"错误,并且提供足够的空间来支持初始参数,例如UNDO_RETENTION。关于如何监控、确定大小和创建撤销表空间的更多信息将在第7章介绍。
3. 临时表空间
数据库中可以有多个临时表空间联机并处于活动状态,但在Oracle 10g之前,同一个用户的多个会话只可以使用同一个临时表空间,因为只有一个默认的临时表空间可以被赋予用户。为了解决这个潜在的性能瓶颈,Oracle现在支持临时表空间组。临时表空间组即为一系列临时表空间。
临时表空间组必须至少包含一个临时表空间,它不可以为空。一旦临时表空间组没有任何成员,它将不再存在。
使用临时表空间组的一个最大优点是,向具有多个会话的单个用户提供如下功能:对每个会话使用不同的实际临时表空间。在如图3-3所示的图表中,用户OE具有两个活动会话,这些会话需要临时的表空间来执行分类操作。
![]() |
图3-3 临时表空间组TEMPGRP |
并不是将单个临时表空间赋给用户,而是赋予临时表空间组。在这个示例中,将临时表空间组TEMPGRP赋给OE。因为TEMPGRP临时表空间组中有3个实际的临时表空间,所以第一个OE会话可以使用临时表空间TEMP1,第二个OE会话执行的select语句可以并行使用其他两个临时表空间TEMP2和TEMP3。在Oracle 10g以前,两个会话都使用相同的临时表空间,从而潜在地造成性能问题。
创建临时表空间组非常简单。创建单独的表空间TEMP1、TEMP2和TEMP3后,可以创建名为TEMPGRP的临时表空间组,具体如下:
SQL> alter tablespace temp1 tablespace group tempgrp; |
使用将实际临时表空间改为默认临时表空间的相同命令,可以将数据库的默认临时表空间改为TEMPGRP。临时表空间组逻辑上可视为与一个临时表空间相同。
SQL> alter database default temporary tablespace tempgrp; |
为了删除表空间组,必须先删除它的所有成员。对组中的临时表空间赋予空字符串(取消组中的表空间),即可删除表空间组的成员:
SQL> alter tablespace temp3 tablespace group ''; |
将临时表空间组赋给用户等同于将一个临时表空间赋给用户,这种分配可以发生在创建用户时或者将来的某个时刻。下面的示例表示将新用户JENWEB赋给临时表空间TEMPGRP:
SQL> create user jenweb identified by pi4001 |
注意,如果在创建用户期间没有分配表空间,将仍然向用户JENWEB赋予TEMPGRP作为临时表空间,因为根据前面的create database示例,这是数据库默认的临时表空间。
在Oracle Database 10g和Oracle Database 11g中,对数据字典视图进行了一些改动以支持临时表空间组。与Oracle以前的版本一样,数据字典视图DBA_USERS仍然具有列TEMPORARY_TABLESPACE,但该列现在可以包含赋给用户的临时表空间的名称,或者是临时表空间组的名称。
SQL> select username, default_tablespace, temporary_tablespace USERNAME DEFAULT_TABLESPACE TEMPORARY_TABLESPACE 1 row selected. |
新的数据字典视图DBA_TABLESPACE_GROUPS显示了每个临时表空间组的成员:
SQL> select group_name, tablespace_name from dba_tablespace_groups; GROUP_NAME TABLESPACE_NAME 3 rows selected. |
和其他大多数可以使用命令行实现的Oracle特性一样,可以使用EM数据库控制台将成员赋给临时表空间组,也可以从临时表空间组中取消成员。在图3-4中,可以从临时表空间组中添加或取消成员。
4. 大文件表空间
大文件表空间减轻了数据库管理,因为它只包含一个数据文件。如果表空间块大小是32KB,则该数据文件的大小最多可以为128TB。前面许多只可用于维护数据文件的命令现在都可以用于表空间,只要表空间是大文件表空间即可。第6章将介绍如何创建和维护大文件表空间。
虽然大文件表空间的维护很方便,但大文件表空间也存在一些潜在的缺点。因为大文件表空间是单一的数据文件,所以完全备份单一的一个大型数据文件所花的时间比完全备份多个小型数据文件(这些小型数据文件的总大小与单一数据文件表空间相等)要长得多,这是因为在Oracle中,每个数据文件只使用一个从进程,因此不能使用并行进程备份大文件表空间的不同部分。如果大文件表空间是只读的,或者只定期备份已改变的块,备份问题在这种环境中也许并不突出。
![]() |
图3-4 使用EM数据库控制台编辑临时表空间组 |