3.1 表空间的体系结构
在数据库中完全设置表空间的先决条件是理解不同类型的表空间,以及如何将它们用于Oracle数据库。本节将介绍不同类型的表空间,并且给出一些管理它们的示例。此外,本节将按类别回顾表空间的类型:永久表空间(SYSTEM和SYSAUX等)、临时表空间、撤消表空间和大文件表空间;并描述这些表空间的作用。最后讨论Oracle的OFA以及OFA如何简化了维护任务。
3.1.1 表空间类型
Oracle数据库中主要的表空间类型有永久表空间、撤消表空间和临时表空间。永久表空间包含一些段,这些段在会话或事务结束后依然持续存在。
虽然撤消表空间可能有一些段在会话或事务结束后仍然保留,但它为访问被修改表的SELECT语句提供读一致性,同时为数据库的大量Oracle闪回特性提供撤消数据。然而,撤消段主要用来存储一些列在更新或删除前的值。这样,如果用户的会话在用户发出COMMIT或ROLLBACK前失败,将取消更新、插入和删除,并且永远不会被其他会话访问。用户会话永远不能直接访问撤消段,而且撤消表空间只能有撤消段。
顾名思义,临时表空间包含暂时的数据,这些数据只存在于会话的持续时间,例如完成排序操作的空间数据不适合长期保存。
大文件表空间可用于这三类表空间的任何一种,它们将维护点从数据文件移到表空间,从而简化了表空间的管理。大文件表空间正好包含一个数据文件。大文件表空间也有一些缺点,本章后文中将予以介绍。
1.永久表空间
SYSTEM表空间和SYSAUX表空间是永久表空间的两个示例。此外,任何在超出会话或事务边界后需要由用户或应用程序保留的段都应存储在永久表空间。
SYSTEM表空间 用户段绝对不应该驻留在SYSTEM或SYSAUX表空间中。如果在创建用户时未指定默认的永久表空间或临时表空间,将使用数据库级别的默认永久表空间和临时表空间。
如果使用Oracle通用安装程序(Oracle Universal Installer,OUI)创建数据库,则会为永久段和临时段创建不同于SYSTEM的单独表空间。如果手动创建数据库,务必指定默认永久表空间和默认临时表空间,如下面的CREATE DATABASE命令所示:
从Oracle 10g开始,SYSTEM表空间默认为本地管理。换句话说,所有表空间的使用由位图段(bitmap segment)管理,位图段在表空间的第一个数据文件的第一部分。在本地管理的SYSTEM表空间的数据库中,数据库中的其他表空间也必须是本地管理,或者必须是只读的。使用本地管理的表空间可免除一些SYSTEM表空间的争用,因为表空间的空间分配和释放操作不需要使用数据字典表。关于本地管理的表空间的更多细节将在第6章介绍。除了支持从遗留数据库导入由字典管理的可传输表空间,在数据库中使用字典管理的表空间没有任何好处。
SYSAUX表空间 与SYSTEM表空间类似,SYSAUX表空间不应该有任何用户段。SYSAUX表空间的内容根据应用程序划分,可使用Oracle Enterprise Manager Database Express(EM Express)或Cloud Control 12c查看。在Cloud Control 12c中,选择Administration | Storage | Tablespaces命令,然后单击表空间列表中的SYSAUX链接,可编辑SYSAUX表空间。图3-1所示为SYSAUX中空间使用的图形表示。
图3-1 EM Cloud Control 12c SYSAUX表空间的内容
如果驻留在SYSAUX表空间中的特定应用程序的空间使用率过高,或者由于与其他使用SYSAUX表空间的应用程序严重争用表空间而造成了I/O瓶颈,可将这些应用程序中的一个或多个移到不同表空间。对于图3-1中包含Change Tablespace链接的任意SYSAUX占用者,可单击链接,然后在图3-2显示的字段中选择目标表空间,移动相应的SYSAUX占用者。XDB对象将移动到SYSAUX2表空间。第6章将介绍一个使用命令行界面将SYSAUX占用者移到不同表空间的示例。
可像监控任意其他表空间一样监控SYSAUX表空间,稍后将介绍如何使用EM Cloud Control来标识表空间中的热点。
图3-2 使用EM Cloud Control 12c移动SYSAUX占用者
2.撤消表空间
多个撤消表空间可存在于一个数据库中,但在单个数据库实例中,在任何给定的时间只有一个撤消表空间可以是活动的。撤消表空间用于回滚事务,以及提供与DML语句同时运行在同一个表或表集上的SELECT语句的读一致性,并支持大量Oracle闪回特性,如闪回查询(Flashback Query)。
撤消表空间需要正确地确定大小,从而防止“Snapshot too old”错误,并提供足够的空间来支持初始参数,如UNDO_RETENTION。关于如何监控、确定大小和创建撤消表空间的更多信息将在第7章介绍。
3.临时表空间
数据库中可以有多个临时表空间联机并处于活动状态,但在Oracle 10g之前,同一用户的多个会话只能使用同一个临时表空间,因为只有一个默认的临时表空间可被赋予用户。为消除这个潜在的性能瓶颈,Oracle现在支持临时表空间组。临时表空间组即为一系列临时表空间。
临时表空间组必须至少包含一个临时表空间,它不可以为空。一旦临时表空间组没有任何成员,它将不复存在。
使用临时表空间组的一个最大优点是,向具有多个会话的单个用户提供如下功能:对每个会话使用不同的实际临时表空间。在图3-3中,用户OE有两个活动会话,这些会话需要临时表空间来执行排序操作。
并不是将单个临时表空间赋给用户,而是赋给临时表空间组。在这个示例中,将临时表空间组TEMPGRP赋给OE。因为TEMPGRP临时表空间组中有3个实际的临时表空间,所以第一个OE会话可使用临时表空间TEMP1,第二个OE会话执行的SELECT语句可以并行使用其他两个临时表空间TEMP2和TEMP3。在Oracle 10g之前,两个会话都使用同一临时表空间,从而潜在地造成性能问题。
图3-3 临时表空间组TEMPGRP
创建临时表空间组非常简单。创建单独的表空间TEMP1、TEMP2和TEMP3后,可以创建名为TEMPGRP的临时表空间组,具体如下:
SQL> alter tablespace temp1 tablespace group tempgrp; Tablespace altered. SQL> alter tablespace temp2 tablespace group tempgrp; Tablespace altered. SQL> alter tablespace temp3 tablespace group tempgrp; Tablespace altered.
使用将实际临时表空间改为默认临时表空间的相同命令,可将数据库的默认临时表空间改为TEMPGRP。临时表空间组逻辑上可视为与一个临时表空间相同。
SQL> alter database default temporary tablespace tempgrp;
Database altered.
为删除表空间组,必须先删除它的所有成员。对组中的临时表空间分配空字符串(即删除组中的表空间),即可删除表空间组的成员:
SQL> alter tablespace temp3 tablespace group '';
Tablespace altered.
不出所料,将临时表空间组分配给用户等同于将一个临时表空间分配给用户,这种分配可以发生在创建用户时或者将来的某个时刻。下面的示例表示将新用户JENWEB分配给临时表空间TEMPGRP:
SQL> create user jenweb identified by pi4001 2 default tablespace users 3 temporary tablespace tempgrp; User created.
注意,如果在创建用户过程中没有分配表空间,将仍向用户JENWEB分配TEMPGRP作为临时表空间,因为根据前面的CREATE DATABASE e示例,这是数据库默认的临时表空间。
在Oracle Database 10g和Oracle Database 11g中,对数据字典视图进行了一些改动,以支持临时表空间组。与Oracle以前的版本一样,数据字典视图DBA_USERS仍有TEMPORARY_ TABLESPACE列,但该列现在可以包含分配给用户的临时表空间或临时表空间组的名称。
新的数据字典视图DBA_TABLESPACE_GROUPS显示了每个临时表空间组的成员
与其他大多数可以使用命令行实现的Oracle特性一样,可使用EM Cloud Control 12c将成员分配给临时表空间组,也可从临时表空间组中删除成员。在图3-4中,可从临时表空间组中添加或删除成员。
图3-4 使用EM Cloud Control 12c编辑临时表空间组
4.大文件表空间
大文件表空间简化了数据库管理,因为它只包含一个数据文件。如果表空间块大小是32KB,则该数据文件的大小最多可以为128TB。如果使用更常见的块大小8KB,则大文件表空间的大小最多为32TB。之前许多只用于维护数据文件的命令现在都可以用于表空间,只要表空间是大文件表空间即可。第6章将介绍如何创建和维护大文件表空间。
虽然大文件表空间便于维护,但大文件表空间也存在一些潜在缺点。因为大文件表空间是单一的数据文件,所以完全备份单一的一个大型数据文件所用的时间比完全备份多个较小数据文件(这些较小数据文件的总大小与单一数据文件表空间相等)要长得多,即使Oracle为每个数据文件使用多个从进程也是如此。如果大文件表空间是只读的,或者只定期备份已改变的块,则备份问题在这种环境中也许并不突出。如果使用Oracle Database 11g引入的RMAN的SECTION SIZE选项,可并行备份整个大文件表空间(以及整个数据文件)。
3.1.2 OFA
Oracle的OFA(Optimal Flexible Architecture,优化灵活体系结构)提供了减轻Oracle软件和数据库文件维护工作的指导原则,并改进了数据库的性能,即适当地放置数据库文件,从而最小化I/O瓶颈。
安装或维护Oracle环境时,虽然并不严格要求使用OFA,但使用OFA可以使客户更容易理解如何在磁盘上组织数据库,从而防止客户在你度假时午夜打电话给你。
根据所使用的存储器选项类型,OFA具有细微的区别——或者是ASM(Automatic Storage Management,自动存储管理)环境,或者是标准的操作系统文件系统,后者使用(或者不使用)第三方逻辑卷管理器或支持RAID的磁盘子系统。无论哪种情形,Database Configuration Assistant(数据库配置助手)都可以自动创建符合OFA标准的数据文件目录结构。
1.非ASM环境
在UNIX服务器的非ASM环境中,单独的物理设备上至少要求有3个文件系统才能实现OFA的推荐标准。从顶层开始,安装点的推荐格式是/<string const><numeric key>,其中<string const>可以是一个或多个字母,<numeric key>是两个或三个数字。例如,在某个系统上,可以有安装点/u01、/u02、/u03和/u04,利用空间可以扩展到另外的96个安装点,且不需要改变文件命名约定。图3-5显示了典型的UNIX文件系统布局,它具有符合OFA标准的Oracle目录结构。
该服务器上有两个实例:管理磁盘组的ASM实例和标准的RDBMS实例(dw)。
图3-5 符合OFA标准的UNIX目录结构
软件可执行文件 每个单独产品名的软件可执行文件驻留在目录/<string const><numeric key>/<directory type>/<product owner>中,其中<string const>和<numeric key>在前面已经定义过,<directory type>指示安装在这个目录中的文件类型,<product owner>则是拥有该目录并在这个目录中安装文件的用户名。例如,目录/u01/app/oracle可包含由用户Oracle在服务器上安装的应用程序相关文件(可执行文件),目录/u01/app/apache可包含从前一个Oracle版本中安装的中间件Web服务器的可执行文件。
从Oracle 10g开始,OFA标准使DBA更容易在同一高级目录中安装多个版本的数据库和客户端软件。符合OFA标准的Oracle主路径对应于环境变量ORACLE_HOME,该路径包含一个后缀,对应于安装类型和具体内容。例如,Oracle 12c的一个安装、Oracle 11g的一个安装、Oracle 10g的两个不同安装和Oracle 9i的一个安装可以驻留在下面几个目录中:
/u01/app/oracle/product/9.2.0.1 /u01/app/oracle/product/10.1.0/db_1 /u01/app/oracle/product/10.1.0/db_2 /u01/app/oracle/product/11.1.0/db_1 /u01/app/oracle/product/12.1.0/dbhome_1
同时,Oracle客户端可执行文件和配置可与数据库可执行文件存储在同一父目录中:
/u01/app/oracle/product/12.1.0/client_1
有些安装目录将永远不会有一个给定产品的多个实例。例如,Oracle Grid Infrastructure(每个服务器一个安装)将安装在下面的目录中(给定前面的安装):
/u01/app/oracle/product/12.1.0/grid
因为Grid Infrastructure一次只可以安装在一个系统上,所以它没有自增的数字后缀。
数据库文件 任何非ASM的Oracle数据文件都驻留在/<mount point>/oradata/<database name>中,其中<mount point>是前面讨论的一种安装点,<database name>是初始参数DB_NAME的值。例如,/u02/oradata/rac0和/u03/oradata/rac0可以包含实例rac0的非ASM控制文件、重做日志文件和数据文件,而/u05/oradata/dev1可以包含同一服务器上实例dev1的相同文件。表3-1详述了oradata目录下不同文件类型的命名约定。
表3-1 符合OFA标准的控制文件、重做日志文件和数据文件命名约定
虽然Oracle表空间名可以长达30个字符,但建议在UNIX环境中保持表空间名为8个字符或更少。因为可移植的UNIX文件名限制为14个字符,并且OFA数据文件名的后缀为<n>.dbf,其中n是两个数字,即文件系统中总共需要6个字符用于后缀。这就为表空间名自身留下了8个字符可用。
只有与数据库<database name>关联的控制文件、重做日志文件和数据文件应该存储在目录/<mount point>/oradata/<database name>中。对于没有使用ASM管理的数据库ord,数据文件名如下:
除了编号为8和9的文件之外,ord数据库中的所有数据文件都符合OFA标准,并且被展开到4个不同的安装点。编号为8的文件中的表空间名太长,而编号为9的文件没有用两位数的数字计数器来表示同一表空间的新数据文件。
2.ASM环境
在ASM环境中,可执行文件存储在前面表示的目录结构中。然而,如果浏览图3-5中的目录/u02/oradata,可看到其中没有任何文件。实例dw的所有控制文件、重做日志文件和数据文件都由该服务器上的ASM实例+ASM管理。
大多数管理功能并不需要实际的数据文件名,因为ASM文件都是Oracle管理文件(Oracle Managed Files,OMF)。这减轻了数据库所需要的全部管理工作。在ASM存储结构中,类似于OFA的语法用于进一步细分文件类型:
在磁盘组+DATA和+RECOV中,可以看到每个数据库文件类型,如数据文件、控制文件和联机日志文件,都有自己的目录。完全限定的ASM文件名具有如下格式:
+<group>/<dbname>/<file type>/<tag>.<file>.<incarnation>
其中<group>是磁盘组名,<dbname>是文件所属的数据库,<file type>是Oracle文件类型,<tag>是特定于文件类型的信息,<file>.<incarnation>用来确保文件在磁盘组中的唯一性。第6章将介绍自动存储管理。