Oracle Database 10g DBA 手册


第1章 Oracle 体系结构概述 Oracle Database 10g 是改良的版本,它在前一个版本 Oracle 9i 的基础上有了很大的进步。 Oracle 10g 不仅增加了更丰富的特性,而且通过更多的工具简化了管理工作,从而帮助 DBA 做到“设置它然后忘记它”。本书的第一部分介绍 Oracle 体系结构的基础,通过给出全新安装 或从以前 Oracle 版本升级的实际建议,建立部署 Oracle 基本结构的基础。为了提供 Oracle 10g 软件的良好基础,相关小节中也介绍了服务器硬件和操作系统配置问题。 在本书的第二部分中,将介绍一些与 Oracle 10g 数据库的日常维护和操作相关的领域。第 二部分中的第 5 章讨论了一些需求,使用安装光盘将软件安装在服务器上之前,DBA 需要收 集这些需求。后面的章节介绍了一些方法,DBA 可以通过这些方法管理磁盘空间、CPU 利用 率、调整 Oracle 参数以优化服务器的资源,同时 DBA 可以根据需要自由使用各种工具监控数 据库的性能。通过自动撤销管理(Automated Undo Management,AUM)极大地简化了事务管理, AUM 是 Oracle 9i 中引入的 Oracle Database 特性,并且在 Oracle 10g 中得到了增强。 本书的第三部分重点关注 Oracle 10g 的高可用性方面,包括使用 Oracle 的恢复管理器 (Recovery Manager,RMAN)执行并自动化数据库备份和恢复,以及使用其他特性,例如 Oracle Data Guard(数据卫士):提供可靠而简单的方法来从数据库失败中恢复。最后这一部分还将介 绍 Oracle 10g 的实时应用集群(Real Application Clusters,RAC)如何同时将极端的可伸缩性和透 第Ⅰ部分 数据库体系结构 4 明的失败转移功能提供给数据库环境。 本书的第四部分将介绍涉及网络化 Oracle 的各种问题。不仅介绍如何在 N 层环境中配置 Oracle Net,还会介绍如何管理大型的和分布式的数据库,这些数据库可能驻留在邻近的城市 或整个世界中。 本章中将介绍 Oracle 10g 的基础,重点强调本书剩余部分中将介绍的许多特性,以及使用 Oracle 通用安装程序(Oracle Universal Installer,OUI)和数据库配置助手(Database Configuration Assistant,DBCA)安装 Oracle 10g 的知识。本章也将介绍组成 Oracle 10g 实例的各种元素,其 范围从内存结构到磁盘结构、初始参数、表、索引和 PL/SQL。在使 Oracle 10g 具有高伸缩性、 可用性和安全性方面,每种元素都扮演重要的角色。 1.1 数据库和实例概述 虽然术语“数据库(Database)”和“实例(instance)”经常交换使用,但它们之间存在很大 的区别。在 Oracle 数据中心中,它们是完全不同的实体,您将在下面的小节中看到这一点。 1.1.1 数据库 数据库是磁盘上数据的集合,位于收集和维护相关信息的数据库服务器上的一个或多个文 件中。数据库由各种物理和逻辑结构组成,而表则是数据库中最重要的逻辑结构。表由包含相 关数据的行和列组成。最低限度,数据库必须至少有存储有用信息的表。图 1-1 显示了一个示 例表,其中包含 4 行和 3 列。表的每一行中的数据都有关联:每一行包含有关公司中特定雇员 的信息。 表名 列名 数据行 列 图 1-1 示例数据库表 此外,数据库提供了安全级别,用于防止对数据的未授权访问。Oracle Database 10g 提供 了许多机制来帮助实现保持机密数据秘密级所需的安全性。第 10 章中将更详细地介绍 Oracle 安全性和访问控制。 组成数据库的文件主要分为两类:数据库文件和非数据库文件。两者之间的区别在于存储 何种数据。数据库文件包含数据和元数据;非数据库文件包含初始参数、记录信息等。数据库 文件对于每时每刻正在进行的数据库操作至关重要。我们将在第 1.4 节中讨论这些物理存储 结构。 第 1 章 Oracle 体系结构概述 5 1.1.2 实例 典型企业服务器的主要组成部分是一个或多个 CPU、磁盘空间和内存。Oracle 数据库存储 在服务器的磁盘上,而 Oracle 实例则存在于服务器的内存中。Oracle 实例由一个大型的内存块 组成,在称为“系统全局区域”(System Global Area,SGA)的区域中分配该内存块和大量后台 进程,这些进程在 SGA 和磁盘上的数据库文件之间相互作用。 在 Oracle 实时应用集群(RAC)中,多个实例将使用相同的数据库。虽然共享数据库的实例 可以在相同的服务器上,但更可能的情况是这些实例在不同的服务器上,这些服务器通过高速 互连进行连接,并且访问驻留在专门的、支持 RAID 的磁盘子系统上的数据库。第 11 章中将 介绍如何配置 RAC 安装的更多细节。 1.2 Oracle 逻辑存储结构 Oracle 数据库中的数据文件被分组集合到一个或多个表空间中。在每个表空间中,逻辑数 据库结构,例如表和索引,是被进一步细分为盘区(extent)和块(block)的段(segment)。这种存储 的逻辑细分允许 Oracle 更有效地控制磁盘空间利用率。图 1-2 显示了数据库中逻辑存储结构之 间的关系。 数据库 System 表空间 USERS 表空间 SYSAUX 表空间 表空间 段 1 段 3 段 5 段 2 段 4 段 6 段 盘区 1 盘区 2 块 图 1-2 逻辑存储结构 1.2.1 表空间 Oracle 表空间由一个或多个数据文件组成,一个数据文件只可以是一个表空间的一部分。 对于 Oracle 10g 的安装,最少创建两个表空间:SYSTEM 表空间和 SYSAUX 表空间。 Oracle 10g 允许创建特殊类型的表空间,称为“大文件表空间”,其容量最大可为 8EB(艾 字节,或一百万的千兆字节)。使用大文件可使表空间管理对 DBA 完全透明可见,换句话说, DBA 可以将表空间作为一个单位进行管理,而不需要担心底层数据文件的大小和结构。 使用 Oracle 管理文件(Oracle Managed Files,OMF)可以使表空间数据文件管理更为容易。 使用 OMF,DBA 可以在文件系统中指定一个或多个位置来驻留数据文件、控制文件和重做日 第Ⅰ部分 数据库体系结构 6 志文件,并且 Oracle 自动处理这些文件的命名和管理。第 4 章中将更详细地讨论 OMF。 如果表空间是临时的,则表空间自身是永久的,只有保存在表空间中的段是临时的。临时表 空间可用于排序操作,并且作为构建索引的工作区域。专门使用一个表空间用于这些类型的操作, 可帮助减少临时段和存储在另一个表空间中的永久段之间的 I/O 争用。 表空间可以是字典管理的或本地管理的。在字典管理的表空间中,盘区管理记录在数据字 典表中。因此,即使所有的应用程序表都在 USERS 表空间中,仍然需要访问 SYSTEM 表空间, 以管理应用程序表上的 DML。因为所有的用户和应用程序必须使用 SYSTEM 表空间进行盘区 管理,这就为写入密集型应用程序创建潜在瓶颈。在本地管理的表空间中,Oracle 在表空间的 每个数据文件中维护一个位图,用于跟踪空间可用性。只管理数据字典中的分配额,可极大地 减少数据字典表的争用。 从 Oracle 9i 开始,如果 SYSTEM 表空间是本地管理的,则只要在其上执行读取和写入操 作,所有其他的表空间必须是本地管理的。在具有本地管理的 SYSTEM 表空间的数据库中, 字典管理的表空间必须是只读。 1.2.2 块 数据库块是 Oracle 数据库中最小的存储单位。块的大小是数据库的给定表空间中特定数量 的存储字节。 块通常是操作系统块的几倍大,有助于提升磁盘 I/O 的效率。由 Oracle 初始参数 DB_BLOCK _SIZE 指定默认的块大小。最多可以为数据库中的其他表空间定义其他 4 个块大小,而 SYSTEM 表空间、SYSAUX 表空间和任何临时表空间中的块大小必须为 DB_BLOCK_SIZE 的值。 1.2.3 盘区 盘区是数据库中的下一个逻辑分组级别,它由一个或多个数据库块组成。当扩大数据库对 象时,为该对象增加的空间分配为一个盘区。 1.2.4 段 盘区的下一个逻辑分组级别是段。段是一组盘区,这组盘区组成了被视为一个单位的数据 库对象,例如表或索引。因此,段一般是数据库终端用户将处理的最小存储单位。Oracle 数据 库中可看到 4 种类型的段:数据段、索引段、临时段和回滚段。 1. 数据段 数据库中的每个表都驻留在单独的数据段中,数据段由一个或多个盘区组成;如果某个表 是分区表或集群表,则为该表分配多个段。本章后面将讨论分区表和集群表。 2. 索引段 每个索引都存储在自己的索引段中。和分区表中一样,分区索引的每个分区存储在自己的 段中。 第 1 章 Oracle 体系结构概述 7 3. 临时段 当用户的 SQL 语句需要磁盘空间来完成操作,例如不能在内存中完成的排序操作时,则 会分配临时段。临时段只存在于 SQL 语句的持续期间。 4. 回滚段 从 Oracle 10g 开始,回滚段只存在于 SYSTEM 表空间中,并且 DBA 一般不需要维护 SYSTEM 回滚段。在以前的 Oracle 版本中,当事务回滚时,创建回滚段以保存数据库 DML 操 作之前的值,并且用于维护“之前”的图像数据,从而为访问表的其他用户提供表数据的读一 致性视图。回滚段也用于在数据库恢复期间回滚未提交的事务,在数据库实例崩溃或异常终止 时产生这些事务。 在 Oracle 10g 中,自动撤销管理处理一个撤销表空间中回滚段的自动分配和管理。在撤销 表空间中,撤销段的构造类似于回滚段,不同点是如何管理这些段的细节在 Oracle 的控制下, 而不是由 DBA 管理(通常无效)。从 Oracle 9i 开始就可以采用自动撤销段,但在 Oracle 10g 中 仍然可以手动管理回滚段。然而,从 Oracle 10g 开始不赞成使用这种手动管理功能,并且在将 来的版本中这种功能不再可用。第 7 章中将详细地讨论自动撤销管理。 1.3 Oracle 逻辑数据库结构 本节将介绍所有主要逻辑数据库结构的重点部分,首先将介绍表和索引。接下来讨论各种 数据类型,可以使用这些数据类型定义表的列。在创建带有列的表时,可以在表的列上添加限 制,或称为“约束”。 使用关系数据库管理系统(Relational Database Management System,RDMS)管理数据的一个 原因在于,权衡 Oracle 数据库的安全性和审核特性。本节将回顾一些方法,可以使用这些方法 分离用户对数据库的访问或被访问对象对数据库的访问。 本节也将接触其他许多可以由 DBA 或用户定义的逻辑结构,包括同义词、外部文件的链 接和其他数据库的链接。 1.3.1 表 表是 Oracle 数据库中的基本存储单位。如果没有任何表,数据库对于企业来说就没有任何 价值。无论表的类型是什么,表中的数据总是存储在行和列中,这方式类似于在电子表格中存 储数据。但是,这种类似性仅限于此。决定在何处存储关键信息时,由于 Oracle 数据库的可靠 性、完整性和可伸缩性带来的数据库表的健壮性,使得电子表格成为次要选择。 本节中将回顾 Oracle 数据库中许多不同类型的表,并且回顾它们如何满足组织的大多数数 据存储需求。第 5 章和第 8 章中将介绍如何根据特定的应用程序在这些类型的表中选择,以及 如何管理它们。 1. 关系表 关系表是数据库中最常见的表类型。关系表以堆的形式进行组织的;换句话说,表中行没 有按照任何特定的顺序存储。在 create table 命令中,您可以指定子句 organization heap 来定义 以堆的形式组织的表(简称堆组织表),但是因为这是默认值,所以该子句可以省略。 第Ⅰ部分 数据库体系结构 8 表的每一行包含一列或多个列,每一列都有一种数据类型和一个长度。从 Oracle 版本 8 开始,列也可以包含用户定义的对象类型、嵌套表或 VARRAY。此外,可以将表定义为对象表。 本节将回顾对象表,下一节将回顾对象。 表 1-1 列出了内置的 Oracle 数据类型。 表 1-1 Oracle 内置数据类型 Oracle 内置数据类型 说 明 VARCHAR2(size)[BYTE|CHAR] 变长字符串,最大长度为 4000 字节,最小为 1 字节。 CHAR 表明使用字符语义计算串的长度;BYTE 表明 使用字节语义 NVARCHAR(size) 变长字符串,最大长度为 4000 字节 NUMBER(p,s) 带有精确值(p)和范围(s)的数字,精确值从 1 到 38,范 围从-84 到 127 LONG 变长字符数据,长度最多为 2GB(231-1) DATE 日期值,从公元前 4712 年 1 月 1 日到公元 9999 年 12 月 31 日 BINARY_FLOAT 32 位浮点数 BINARY_DOUBLE 64 位浮点数 TIMESTAMP(fractional_seconds) 年、月、日、小时、分钟、秒和小数部分的秒。 fractional_seconds 的值从 0 到 9;换句话说,最多为十 亿分之一的精确度。默认为 6(百万分之一) TIMESTAMP(fractional_seconds) WITH TIME ZONE 包含一个 TIMESTAMP 值,此外还有一个时区置换值。 时区置换可以是从 UTC(例如‘-6:00’)或区域名(例如, ‘US/Central’)的偏移量 TIMESTAMP(fractional_seconds) WITH LOCAL TIME ZONE 类似于 TIMESTAMP WITH TIME ZONE,除了(1)在存 储数据时将其标准化为数据库时以及(2)在检索具有这 种数据类型的列时,用户可以看到以会话的时区表示 的数据 INTERVAL YEAR(year_precision) TO MONTH 以年和月的方式存储时间周期,year_precision 的值是 YEAR 字段中数字的位数 INTERVAL DAY(day_precision) TO SECOND(fractional_seconds_precision) 以日、小时、分钟、秒、小数秒的形式存储一段时间。 day_precision 的值从 0 到 9,默认为 2。fractional_ seconds_precision 的值类似于 TIMESTAMP 值中的小 数秒;范围从 0 到 9,默认为 6 RAW(size) 原始二进制数据,最大尺寸为 2000 字节 LONG RAW 原始二进制数据,变长,最大大小为 2GB ROWID 以 64 为基数的串,表示对应表中某一行的唯一地址。 该地址在整个数据库中是唯一的 第 1 章 Oracle 体系结构概述 9 (续表) Oracle 内置数据类型 说 明 UROWID[(size)] 以 64 为基数的串,表示按索引组织的表中某一行的逻 辑地址。size 的最大值为 4000 字节 CHAR(size)[BYTE|CHAR] 定长字符串,其长度为 size。最小尺寸为 1,最大为 2000 字节。BYTE 和 CHAR 参数是 BYTE 和 CHAR 语义, 与 VARCHAR2 中相同 NCHAR(size) 定长字符串,最大为 2000 字节;最大尺寸取决于数据 库的国际字符集定义。默认大小为 1 CLOB 字符大型对象,包含单字节或多字节字符;支持定宽 和变宽的字符集。最大尺寸为(4GB-1)*DB_BLOCK_ SIZE NCLOB 类似于 CLOB,除了存储来自于定宽和变宽字符集的 Unicode 字符。最大尺寸为(4GB-1)*DB_BLOCK_SIZE BLOB 二进制大型对象;最大尺寸为(4GB-1)*DB_BLOCK_ SIZE BFILE 指针,指向存储在数据库外部的大型二进制文件。必 须能够从运行 Oracle 的服务器中访问二进制文件。最 大尺寸为 4GB Oracle 也支持 ANSI 兼容的数据类型,表 1-2 提供了 ANSI 数据类型和 Oracle 数据类型之 间的映射。 表 1-2 与 ANSI 数据类型等价的 Oracle 数据类型 ANSI SQL 数据类型 Oracle 数据类型 CHARACTER(n) CHAR(n) CHAR(n) CHARACTER VARYING(n) CHAR VARYING(n) VARCHAR(n) NATIONAL CHARACTER(n) NATIONAL CHAR(n) NCHAR(n) NCHAR(n) NATIONAL CHARACTER VARYING(n) NATIONAL CHAR VARYING(n) NCHAR VARYING(n) NVARCHAR2(n) NUMERIC(p,s) DECIMAL(p,s) NUMBER(p,s) INTEGER INT SMALLINT NUMBER(38) 第Ⅰ部分 数据库体系结构 10 (续表) ANSI SQL 数据类型 Oracle 数据类型 FLOAT(b) DOUBLE PRECISION REAL NUMBER 2. 临时表 从 Oracle 8i 开始就支持临时表。之所以称它们为“临时表”,在某种意义上是因为数据存 储在表中,而不是存储在表自身的定义中。命令 create global temporary table 可创建一个临时表。 只要其他用户具有访问表自身的权限,他们就可以在临时表上执行 select 命令或数据操作 语言命令(Data Manipulation Language Commands,DML),例如 insert、update 或 delete。然而, 每个用户只能看到表中自己的数据。当用户截取临时表时,只会从表中删除他们插入的数据。 临时表中有两种不同风格的临时数据:事务持续期间的临时数据和会话持续期间的临时数 据。临时数据的寿命由 on commit 子句控制,在执行 commit 或 rollback 命令时,on commit delete rows 负责删除临时表中的所有行,而 on commit preserve rows 能够在超出事务边界后保存表中 的行。然而,当用户的会话终止时,临时表中所有的用户行都会被删除。 使用临时表时还有其他一些注意事项。虽然可以在临时表上创建索引,但索引中的条目将 随数据行一起被删除,这一点与普通表一样。另外,由于临时表中数据的临时特性,Oracle 不 会为临时表上的 DML 生成任何重做信息,但是会在撤销表空间中会创建撤销信息。 3. 索引组织表 如同您将在后面关于索引的小节中看到的那样,创建索引可以更有效地查找表中的特定 行。然而,创建索引将带来额外的一些系统开销,因为数据库必须同时维护表的数据行和索引 条目。如果表只有有限的列,并且对表的访问主要集中在某一列上,这时应怎么做呢?在这种 情况下, 索引组织表(IOT)可能就是正确的解决方案。IOT 以 B 树索引的形式存储表中的行, 其中 B 树索引的每个节点包含作为键的(索引)列以及一个或多个非索引列。 IOT 最明显的优点在于只需要维护一个存储结构,而不是两个。类似地,表中主键的值只 在 IOT 中存储一次,而在普通表中则是存储两次。 然而,使用 IOT 也有一些缺点。一些表,例如记录事件的表,可能不需要主键,或者在某 些情况下不需要任何键,而 IOT 必须有主键。同时,IOT 不可以是集群的成员。最后,如果表 中有大量的列,并且在检索表中的行时需要频繁访问许多列,则 IOT 可能就不是最佳的解决 方案。 4. 对象表 从 Oracle8 开始,Oracle Database 已经支持数据库中许多面向对象的特性。用户定义的类 型,以及针对这些对象类型定义的方法,可以无缝实现 Oracle 中面向对象(OO)的开发项目。 对象表具有自身就是对象或类型定义实例化的行。对象表中的行可以通过对象 ID(OID)引 用,这与关系表或普通表中的主键形成对比。然而,对象表仍然可以有主键和唯一键,如同关 系表一样。 第 1 章 Oracle 体系结构概述 11 例如,假设正在从头开始创建一个人力资源(Human Resources,HR)系统,因此可以完全 从 OO 观点来灵活设计数据库。第一步是通过创建如下类型来定义雇员对象或类型: create type PERS_TYP as object (Last_Name varchar2(45), First_Name varchar2(30), Middle_Initial char(1), Surname varchar2(10), SSN varchar2(15)); 在上面的例子中,没有创建任何用于 PERS_TYP 对象的方法,但是 Oracle 默认为该类型 创建了一个构造函数方法,它具有和类型自身相同的名称(在本例中就是 PERS_TYP)。为了创 建作为 PERS_TYP 对象集合的对象表,您可以使用熟悉的 create table 语法,具体如下: create table pers of pers_typ; 为了将对象实例添加到对象表,在 insert 命令中指定构造函数方法: insert into pers values(pers_typ('Judd','Dawn','R','Dr.','123-45-6789')); 对 PERS_TYP 对象实例的引用可以作为 REF 对象存储在其他表中,并且可用于检索 PERS 表中的数据,而不需要直接引用 PERS 表自身。 第 5 章中将通过更多的示例来介绍如何使用对象实现面向对象设计项目。 5. 外部表 Oracle 9i 引入了外部表。简单来说,外部表允许用户访问数据源,例如文本文件,如同该 数据源是数据库中的表一样。表的元数据存储在 Oracle 数据字典中,但表的内容存储在外部。 外部表的定义包含两个部分。第一部分(也是最熟悉的部分)是从数据库用户的角度观察的 表定义。该定义类似于在 create table 语句中看到的一般定义。 第二部分用于区分外部表和普通表。这是数据库列和外部数据源之间产生映射的位置:数 据元素开始于哪些列,列宽是多少,外部列的格式是字符还是二进制。外部表 ORACLE_ LOADER 的默认类型的语法实际上等同于 SQL*Loader 中控制文件的语法。这是外部表的一个 优点,用户只需要知道如何访问标准数据库表以获得外部文件。 然而,使用外部表也有一些缺点。在外部表上不可以创建索引,也不可以执行插入、更新 或删除操作。但是,如果考虑到使用外部表加载本地数据库表(例如,在数据仓库环境中)的优 点,这些缺点都可以看作是较为次要的问题。 6. 集群表 如果经常同时访问两个或多个表(例如,一个订单表和一个行式项细节表),则创建集群表 可能就是一种好的方法,它可以改进这些表的查询性能。在具有相关行式项细节表的订单表中, 订单标题信息可以存储在和行式项细节记录相同的块中,从而减少检索订单和行式项信息所需 的 I/O 数量。 第Ⅰ部分 数据库体系结构 12 集群表还可以减少存储两个表共有的列所需的空间量,两个表共有的列也称为“集群键 值”。集群键值也存储在集群索引中。集群索引操作起来非常类似于传统的索引,通过集群键 值访问集群表时,可以改进对集群表的查询。在具有订单和行式项的示例中,订单号只存储一 次,而不是针对每个行式项细节行重复存储。 相对于对表执行的 select 语句数量,如果需要频繁对表执行插入、更新和删除操作,则集 群表的优点就会减少。此外,经常对集群中的单个表进行查询也会减弱首先对表进行集群化的 优点。 7. 散列集群 作为特殊类型的集群表,散列表操作起来非常类似于普通的集群表,但是,散列表没有使 用集群索引,而是使用散列函数来存储并检索表中的行。在创建表时,将根据在创建集群期间 指定散列键的数量分配所需的预估空间量。在订单条目示例中,假设 Oracle 数据库需要镜像传 统的数据条目系统(该系统将周期性地重复使用订单号)。同时,订单号总是 6 位数的数字。可 以按照下面的示例所示创建订单集群: create cluster order_cluster (order_number number(6)) size 50 hash is order_number hashkeys 1000000; create table cust_order ( order_number number(6) primary key, order_date date, customer_number number) cluster order_cluster(order_number); 使用相等比较从表中选择行时,散列集群具有性能方面的优点,如下所示: select order_number, order_date from cust_order where order_number = 196811; 一般情况下,如果 hashkeys 的数量足够多并且包含散列函数的 hash is 子句产生均匀分布 的散列键,那么这种查询在检索行时将只使用一次 I/O。 8. 排序的散列集群 排序的散列集群是 Oracle 10g 中的新增内容。它们类似于普通的散列集群,通过使用散列 函数来定位表中行。然而,除此之外,排序的散列集群允许对表中的行根据表的一列或多列进 行升序排列。它能够更快速地处理应用程序的数据,并且对这些应用程序进行先进先出(First In First Out,FIFO)处理的应用程序。 使用和普通集群表相同的语法创建排序的散列集群,但需要在集群中的列定义后面加上 SORT 位置参数。下面是在排序散列集群中创建表的示例: create table order_detail ( order_number number, order_timestamp timestamp sort, customer_number number) cluster order_detail_cluster ( 第 1 章 Oracle 体系结构概述 13 order_number, order_timestamp); 由于排序散列集群的 FIFO 特性,通过 order_number 访问订单时,将根据 order_timestamp 的值首先检索时间最久的订单。 9. 分区表 对表进行分区(或对索引进行分区,下一节将介绍)可帮助建立更加易于管理的大型表。可 以将表分区(甚至细分)为较小的部分。从应用程序的观点来看,分区是透明的(也就是说,在终 端用户的 SQL 中不需要对任何特定分区进行显式的引用)。用户唯一能够观察到的是在 where 子句中,符合分区方案的标准分区表查询将运行更为快速。 从 DBA 的观点进行分区有很多优点。如果表的一个分区位于已损坏的磁盘卷上,则在修 复遭到破坏的卷时,用户仍然可以查询其他的分区。类似地,对分区的备份可以许多天进行一 次,每次备份一个分区,而不需要对整个表进行一次备份。 分区有 3 种类型:范围分区、散列分区以及从 Oracle9i 开始引入的列表分区。分区表中的 每一行只能存在于一个分区中。分区键用于指示行到正确的分区,它可以是组合键,最多为表 中的 16 个列。对可以分区的表类型有一些次要的限制,例如,包含 LONG 或 LONG RAW 列 的表不能进行分区。 提示: Oracle Corporation 推荐:对于大于 2GB 的任何表,应尽量考虑对其进行分区。 无论使用何种类型的分区方案,分区表的每个成员必须具有相同的逻辑属性,例如列名、 数据类型、约束等等。然而,根据每个分区的大小和在磁盘上的位置,它们的物理属性可能有 所区别。关键在于,从应用程序或用户观点来看,分区表必须在逻辑上一致。 范围分区 对于范围分区,它的分区键落在某个范围内。例如,对公司电子商务站点的访 问可以根据访问日期赋给某个分区,每个季度一个分区。在 2004 年 5 月 25 日对站点的访问将 记录在名为 FY2004Q2 的分区中,而在 2004 年 12 月 2 日对站点的访问则记录在名为 FY2004Q4 的分区中。 列表分区 在列表分区中,分区键落在完全不同的值组中。例如,按国家区域的销售可针 对 NY、CT、MA 和 VT 创建一个分区,针对 IL、WI、IA 和 MN 创建另一个分区。如果缺少 州代码,则世界其他区域的销售可以赋给它自己的分区。 散列分区 散列分区根据散列函数将行赋给分区,只需指定用于散列函数中的列以及有多 少分区可用,而不必将这些列显式赋予分区。Oracle 将行赋给分区,并且确保每个分区中行的 均匀分布。 如果没有明确的列表或范围分区方案提供给表中的列类型,或者分区的相对大小经常改 变,需要重复手工调整分区方案,则散列分区就非常有帮助。 组合分区 使用组合分区可以对分区进程进行更进一步的细分。例如,可以先对表进行 范围分区,然后在每个范围中,使用列表或散列进一步分区。 10. 分区索引 表上的索引也可以进行分区—— 或者符合索引表的分区方案(本地索引),或者独立于表的 第Ⅰ部分 数据库体系结构 14 分区方案进行分区(全局索引)。在进行分区操作时,本地分区索引可增加索引的可用性,例如, 归档并删除分区 FY2002Q4 和它的本地索引不会影响到表中其他分区的索引可用性。 1.3.2 约束 Oracle 约束是一种规则,它定义了在表中的一列或多列上,用于帮助实施业务规则。例如, 约束可实现雇员起薪必须至少为$25,000.00 这种业务规则。另一个实施业务规则的约束示例是, 如果将新的雇员分配到一个部门(虽然不需要立刻将他们分配到特定的部门),则部门号必须有 效,并且存在于 DEPT 表中。 共有 6 种数据完整性规则类型可应用于表的列:空值规则、唯一列值、主键值、引用完整 性值、复合内联完整性和基于触发器的完整性。下面的小节将简要介绍这些规则。 创建表或在列的级别上改变表时,定义表上的所有约束(除了触发器,它们是根据在表上 执行哪些 DML 操作来定义的)。可在创建时或将来的任意时间点启用或禁止约束;启用或禁止 (使用关键字 enable 或 disable)约束时,根据有效的业务规则,需要(或不需要)验证(使用关键字 validate 或 novalidate)表中已有的数据是否满足约束。 例如,汽车制造商数据库中的表 CAR_INFO 包含新的汽车数据,需要在其中的 AIRBAG_ QTY 列上添加一个新的约束,该列的值必须不为 NULL,并且对于所有新的车辆,该值必须至 少为 1。然而,该表包含许多年前不需要汽车气袋的模型数据,从而包含值 0 或 NULL。在这 种情况下,一种解决方案是在 AIRBAG_QTY 表上创建新的约束,从而对添加到表中的所有新 行实施新的规则,但不验证已有行的约束。 下面创建的表具有所有约束类型。下面的小节中将介绍每种约束。 create table CUST_ORDER (Order_Number NUMBER(6) PRIMARY KEY, Order_Date DATE NOT NULL, Delivery_Date DATE, Warehouse_Number NUMBER DEFAULT 12, Customer_Number NUMBER NOT NULL, Order_Line_Item_Qty NUMBER CHECK (Order_Line_Item_Qty < 100), UPS_Tracking_Number VARCHAR2(50) UNIQUE, foreign key (Customer_Number) references CUSTOMER(Customer_Number)); 1. 空值约束 NOT NULL 约束可防止将 NULL 值输入到 Order_Date 列或 Customer_Number 列。从业务 规则的观点来看,这样做很有意义:订单必须有订购日期,只有在顾客下订单时,订单才有 意义。 注意,列中的 NULL 值并不意味着值为空或零;更正确地说,该值不存在。NULL 值不等 同于任何内容,甚至不等同于另一个 NULL 值。在使用 SQL 查询可能具有 NULL 值的列时, 这个概念非常重要。 2. 唯一列值 唯一完整性约束确保一列或一组列(通过组合约束)在整个表中是唯一的。在前面的示例中, UPS_Tracking_Number 列将不包含重复的值。 第 1 章 Oracle 体系结构概述 15 为了实施约束,Oracle 将在 UPS_Tracking_Number 列上创建唯一索引。如果该列上已经有 一个有效的唯一索引,Oracle 将使用该索引实施约束。 具有唯一约束的列也可以声明为 NOT NULL。如果没有声明该列具有 NOT NULL 约束, 则任意数量的行都可以具有 NULL 值,只要剩余的行在该列中具有唯一值。 在允许一个或多个列具有 NULL 值的组合唯一约束中,非 NULL 值的列用于确定是否满 足约束。NULL 列总是满足约束,因为 NULL 值不等同于任何内容。 3. 主键值 主键完整性约束是数据库表中最常见的约束类型。一个表上最多只可以存在一个主键约 束,组成主键的列不可以有 NULL 值。 在前面的示例中,Order_Number 列是主键。创建唯一索引以实施该约束,如果该列已经 存在可用的唯一索引,主键约束就使用该索引。 4. 引用完整性值 引用完整性或外键约束比前面介绍的任何一种约束都更为复杂,因为它依赖于另一个表来 限制哪些值可以输入到具有引用完整性约束的列中。 在前面的示例中,在 Customer_Number 列上声明外键;任何输入到这个列中的值必须也存 在于另一个表(在这种情况下是 CUSTOMER 表)的 Customer_Number 列中。 和允许 NULL 值的其他约束一样,具有引用完整性约束的列可以有 NULL 值,并且不需 要引用列包含 NULL 值。 此外,外键约束可以自引用。在主键为 Employee_Number 的 EMPLOYEE 表中,Manager_ Number 具有根据同一个表中的 Employee_Number 列声明的外键,这就允许在 EMPLOYEE 表 自身中创建一个报告层次结构。 应该总是在外键列上声明索引以改进性能,该规则的唯一例外是在绝对不会更新或删除父 表中的引用主键或唯一键时。 5. 复合内联完整性 通过使用 CHECK 约束,可以在列级别中实施更复杂的业务规则。在前面的示例中, Order_Line_Item_Qty 不能超出 99。 CHECK 约束可以使用插入或更新的行中的其他列来应用约束。例如,STATE_CD 列上的 约束只有在 COUNTRY_CD 列的值不为 USA 时才允许 NULL 值。此外,该约束可以使用文字 值和内置的函数,例如 TO_CHAR 或 TO_DATE,只要这些函数能够处理文字或表中的列。 一列上允许有多个 CHECK 约束。只有在所有的 CHECK 约束都计算为 TRUE 时,才允许 将值输入列中。例如,可以修改前面的 CHECK 约束,确保 Order_Line_Item_Qty 大于 0 并且 小于 100。 6. 基于触发器的完整性 如果业务规则过于复杂,使用唯一性约束很难实现,则可以使用 create trigger 命令在表上 创建一个数据库触发器,同时使用一个 PL/SQL 代码块来实施这一业务规则。 第Ⅰ部分 数据库体系结构 16 当引用的表存在于不同的数据库中时,需要使用触发器来实施引用完整性约束。触发器也 可用于许多超出约束检查领域的情况(例如,对表的审核访问)。 第 18 章中将深入介绍数据库触发器。 1.3.3 索引 当检索表中少量的行时,使用 Oracle 索引能够更快速地访问表中的这些行。索引存储了进 行索引的列的值,同时存储包含索引值的行的物理 RowID,唯一的例外是索引组织表(IOT), 它使用主键作为逻辑 RowID。一旦在索引中找到匹配值,索引中的 RowID 就指向表行的确切 位置:哪个文件、文件中的哪个块,以及块中的哪一行。 可以在一列或多个列上创建索引。索引条目存储在 B 树结构中,因此遍历索引以找到行的 键值只需要使用非常少的 I/O 操作。在唯一索引的情况下,使用索引可能有两个目的:不仅可 以提高搜索行的速度,而且可以在索引列上实施唯一或主键约束。在插入、更新或删除表行的 内容时,自动更新索引中的条目。删除表时,在该表上创建的所有索引也自动删除。 Oracle 中有一些可用的索引类型,每种索引都适合于特定的表类型、访问方法或应用程序 环境。下面的小节将介绍最常见索引类型的重点内容和特性。 1. 唯一索引 唯一索引是最常见的 B*Tree 索引形式,它经常用于实施表的主键约束,其作用在于确保 索引列中不存在重复的值。可以在 EMPLOYEE 表中 Social Security Number(社会安全号)的对 应列上创建唯一索引,因为该列中不应该有任何重复值。然而,一些雇员可能没有 Social Security Number,因此该列可以包含 NULL 值。 2. 非唯一索引 非唯一索引帮助提高表访问的速度,而不会实施唯一性。例如,可以在 EMPLOYEE 表的 Last_Name 列上创建非唯一索引,从而提高按姓查找的速度。但是,对于任何给定的姓,确实 可以有许多重复的值。 如果在 CREATE INDEX 语句中没有指定其他任何关键字,则默认在列上创建非唯一 B*Tree 索引。 3. 反向键索引 反向键索引是特殊类型的索引,一般用于 OLTP(联机事务处理)环境中。在反向键索引中, 反向每个列的索引键值中的所有字节。在 create index 命令中,使用 reverse 关键字指定反向键 索引。下面是创建反向键索引的一个示例: create index IE_LINE_ITEM_ORDER_NUMBER on LINE_ITEM(Order_Number) REVERSE; 如果发出的订单号是 123459,则反向键索引存储订单号为 954321。插入到表中的内容分 布在表的所有叶键上,从而减少一些插入新行的写入程序之间的争用。如果在发出订单后不久 就查询或修改订单,反向键索引也可减少 OLTP 环境中这些“热点”的潜在性。 第 1 章 Oracle 体系结构概述 17 4. 基于函数的索引 基于函数的索引类似于标准的 B*Tree 索引,不同之处在于它将声明为表达式的列的变换 存储在索引中,而不是存储列自身。 在名称地址可以作为混合内容存储在数据库中时,基于函数的索引就非常有用。如果搜索 标准是“Smith”,在包含值“SmiTh”的列上进行普通索引就不会返回任何值。另一方面,如 果索引存储所有以大写字母表示的姓,则所有对姓的搜索都可以使用大写字母。下面的示例是 在 EMPLOYEE 表的 Last_Name 列上创建基于函数的索引: create index up_name on employee(upper(Last_Name)); 作为结果,使用如下查询的搜索将使用前面创建的索引,而不是进行完整的表扫描: select Employee_Number, Last_Name, First_Name from employee where upper(Last_Name) = 'SMITH'; 5. 位图索引 在索引的叶节点上,位图索引结构与 B*Tree 索引存在较大的区别。它只存储索引列每个 可能值(基数)的一个位串,位串的长度与索引表中的行数相同。 与传统索引相比,位图索引除了可以节省大量的空间,还可以在响应时间方面提供较大的 改进,因为在需要访问表自身很久之前,Oracle 就可以从包含多个 where 子句的查询中快速删 除潜在的行。多个位图可以使用逻辑 and 和 or 操作来确定访问表中的哪些行。 虽然位图索引可用于表中的任何列上,但在索引列具有较低基数或大量不同的值时,使用 位图索引才最有效。例如,PERS 表中的 Gender 列将有 NULL、M 或 F 值。Gender 列上的位 图索引将只有 3 个位图存储在索引中。另一方面,Last_Name 列上的位图索引将有和表中行数 基本相同的位图串数量!如果执行完整的表扫描而不是使用索引,则查找特定姓的查询将很可 能花费较少的时间。在这种情况下,使用传统的 B*Tree 非唯一索引将更有意义。 位图索引的一种变体称为“位图连接索引”,这种索引在表列上创建一个位图索引,根据 相同的列连接一个或多个其他的表。这就在数据仓库环境中提供了大量的优点,在一个实际表 和一个或多个维表上创建位图连接索引,等于在本质上预先连接这些表,从而在执行实际的连 接时节省 CPU 和 I/O 资源。 注意: 位图索引只在 Oracle 10g 的企业版本中可用。 1.3.4 视图 视图允许用户查看单独表或多个连接表中数据的自定义表示。视图也称为“存储查询”: 用户无法看到视图底层的查询细节。普通的视图不存储任何数据,而只存储定义,并且在每次 访问视图时运行底层的查询。普通视图的扩展称为“物化视图”,允许同时存储查询的结果和 查询的定义,从而加快处理速度,同时还有其他优点。对象视图类似于传统的视图,它可以隐 藏底层表连接的细节,并且允许在数据库中进行面向对象的开发和处理,而底层的表仍然保持 关联格式。 下一小节将介绍一般用户创建并使用的普通视图类型的基础知识。 第Ⅰ部分 数据库体系结构 18 1. 普通视图 普通视图,通常称之为“视图”,不会分配任何内存,只有它的定义(查询)存储在数据字典 中。视图底层查询的表称为“基表”,视图中的每个基表可以进一步定义为视图。 视图有许多优点,它可以隐藏数据复杂性:高级分析员可以定义包含 EMPLOYEE、 DEPARTMENT 和 SALARY 表的视图,从而上层管理部门可以更容易地使用 select 语句检索有 关雇员薪水的信息,这种检索表面上看起来是使用表,但实际上是包含查询的视图,该查询连 接 EMPLOYEE、DEPARTMENT 和 SALARY 表。 视图也可以用于实施安全性。EMPLOYEE 表上的视图 EMP_INFO 包含除了薪水的所有列, 并且该视图定义为只读,从而防止更新该表: create view EMP_INFO as select Employee_Number, Last_Name, First_Name, Middle_Initial, Surname from EMPLOYEE with READ ONLY; 如果没有 read only 子句,则可以更新或添加行到视图中,甚至在包含多个表的视图上进行 这些操作。视图中有一些构造可防止对其进行更新,例如使用 distinct 运算符、聚集函数或 group by 子句。 当 Oracle 处理包含视图的查询时,它替换用户的 select 语句中的底层查询定义,并且处 理结果查询,就好像视图不存在一样。因此,在使用视图时,基表上任何已有索引的优点都 会丢失。 2. 物化视图 在某些方面,物化视图非常类似于普通视图:视图的定义存储在数据字典中,并且该视图 对用户隐藏底层的基查询细节。但是,相似之处仅限于此。物化视图也在数据库段中分配空间, 用于保存执行基查询得到的结果集。 物化视图可用于将表的只读副本复制到另一个数据库,该副本具有和基表相同的列定义和 数据,这是物化视图的最简单的实现。为了减少刷新物化视图时的响应时间,可以创建物化视 图日志以刷新物化视图。否则,在需要刷新时就必须进行完全的刷新:必须获取基查询的全部 结果以刷新物化视图。物化视图日志可帮助对物化视图的不断增加的更新。 在数据仓库环境中,物化视图可存储来自于 group by rollup 或 group by cube 查询的聚集数 据。如果设置适当的初始参数值,例如 QUERY_REWRITE_ENABLED,并且查询自身允许查 询重写(使用 query rewrite 子句),则任何表现为和物化视图执行相同类型聚集操作的查询将自 动使用物化视图,而不是运行初始的查询。 无论物化视图的类型是什么,在基表中提交事务或根据需要刷新它时,都会自动对物化视 图进行刷新。 物化视图在很多方面类似于索引,它们都直接和表联系并且占用空间,在更新基表时必须 刷新它们,它们的存在实际上对用户是透明的。通过使用可选的访问路径来返回查询结果,它 们可以帮助优化查询。 第 18 章中将介绍在分布式环境中使用物化视图的更多细节。 第 1 章 Oracle 体系结构概述 19 3. 对象视图 面向对象(OO)的应用程序开发环境已经变得越来越流行,Oracle 10g 数据库完全支持数据 库中本地化对象和方法的实现。然而,从纯粹的关系数据库环境向纯粹的 OO 数据库环境迁移 并不是容易的变迁过程,很少有组织愿意花费时间和资源从头开始构建新的系统,而 Oracle 10g 使用对象视图使这种变迁变得更为容易。对象视图允许面向对象的应用程序查看作为对象集合 的数据,这种对象集合具有属性和方法,同时传统的系统仍然可以对 INVENTORY 表运行批量 工作。对象视图可以模仿抽象数据类型、对象标识符(OID)以及纯粹的 OO 数据库环境能够提 供的引用。 和普通视图一样,您可以在视图定义中使用 instead of 触发器来允许针对视图的 DML,这 里使用 PL/SQL 代码块,而不是用户或应用程序提供的实际 DML 语句。 1.3.5 用户和模式 授权获得对数据库访问的数据库账户称为“用户”。用户可以存在于数据库中,而不拥有 任何对象。然而,如果用户在数据库中创建并拥有对象,这些对象就是模式的一部分,模式与 数据库用户具有相同的名称。模式可以拥有数据库中任何类型的对象:表、索引、序列和视图 等。模式拥有者或 DBA 可以授权其他数据库用户访问这些对象。用户总是拥有完整的权限, 并且可以控制用户模式中的对象。 当 DBA(或其他任何拥有 create user 系统权限的用户)创建用户时,可以将其他许多特征赋 给用户,例如用户可以使用哪些表空间创建对象,以及密码是否提前到期。 可以使用 3 种方法验证数据库中的用户:数据库验证、操作系统验证和网络验证。使用数 据库验证时,用户的加密密码存储在数据库中。与之相反,操作系统验证进行如下假设:操作 系统连接已经验证的用户具有和某些用户相同的权限,这些用户具有相同的或类似的名称(取 决于 OS_AUTHENT_PREFIX 初始参数的值)。网络验证使用基于公共密钥基础结构(Public Key Infrastructure,PKI)的解决方案。这些网络验证方法需要具有 Oracle 高级安全性选项的 Oracle 10g 企业版本。 1.3.6 配置文件 数据库资源不是无限的,因此 DBA 必须对所有的数据库用户管理和分配资源。数据库资 源的一些示例是 CPU 时间、并发会话、逻辑读和连接时间。 数据库配置文件是可以赋给用户的指定资源限制集。安装 Oracle 后,DEFAULT 配置文件 已经存在,并且将其赋给任何还没有显式分配配置文件的用户。DBA 可以添加新的配置文件 或改变 DEFAULT 配置文件,从而适合企业的需求。DEFAULT 配置文件的初始值允许无限使 用所有的数据库资源。 1.3.7 序列 Oracle 序列用于分配有序数,并且保证其唯一性(除非重新创建或重新设置序列)。它在多 用户环境中产生一系列唯一的数字,并且没有磁盘锁定或任何特殊 I/O 调用的系统开销,这一 点不同于将序列加载到共享池中涉及的情况。 序列可以生成长达 38 位的数字,数字序列可以按升序或降序排列,间隔可以是任何用户 指定的值,并且 Oracle 可以在内存中缓存序列中的数字块,从而获得更快的性能。 第Ⅰ部分 数据库体系结构 20 序列中的数字可保证唯一,但不一定要有序。如果缓存数字块,并且重新启动实例,或者 回滚使用序列中数字的事务,则从序列中获取的下一个数字不会与原序列中已引用但未使用的 数字相同。 1.3.8 同义词 Oracle 同义词只是数据库对象的别名,用于简化对数据库对象的引用,并且隐藏数据库对 象源的细节。同义词可以赋给表、视图、物化视图、序列、过程、函数和程序包。类似于视图, 除了它在数据字典中的定义以外,同义词不会在数据库中分配任何空间。 同义词可以是公有或私有。私有同义词定义在用户的模式中,并且只有该用户可用。公有 同义词通常由 DBA 创建,并且所有的数据库用户都可以自动使用公有同义词。 提示: 创建公有同义词后,确保同义词的用户具有对该同义词引用的对象的正确权限。 引用数据库对象时,Oracle 首先检查该对象是否存在于用户的模式中。如果不存在这样的 对象,Oracle 就检查私有同义词。如果没有任何私有同义词,Oracle 就检查公有同义词。如果 没有公有同义词,就返回一个错误。 1.3.9 PL/SQL Oracle PL/SQL 是 Oracle 对 SQL 的过程化语言扩展。当标准的 DML 和 select 语句因为缺 少过程化元素而无法以简单的方式产生所需的结果时,PL/SQL 非常有用,这些过程化元素在 传统的第三代语言(例如C++和Ada)中很常见。从Oracle9i开始,SQL处理引擎在SQL和PL/SQL 之间共享,这意味着所有添加到 SQL 的新特性也可以自动用于 PL/SQL。 下面几节将简要介绍使用 Oracle PL/SQL 的优点。 1. 过程/函数 PL/SQL 过程和函数是 PL/SQL 指定块的示例。PL/SQL 块是 PL/SQL 语句序列,可以将其 视为用作执行功能的单位,它最多包含 3 个部分:变量声明部分、执行部分和异常部分。 过程和函数之间的区别在于:函数将单个值返回到调用程序,例如 SQL select 语句。相反, 过程不返回值,而只返回状态代码。然而,过程的参数列表中可能有一个或多个变量,可以设 置这些变量并且作为结果返回。 过程和函数在数据库环境中有许多优点。在数据字典中只需编译并存储过程一次,当多个 用户调用过程时,该过程已经编译,并且只有一个副本存在于共享池中。此外,网络通信量会 减少,即使没有使用 PL/SQL 的过程化特性也是如此。一次 PL/SQL 调用使用的网络带宽远小 于单独通过网络发送的 SQL select 和 insert 语句,这还没有考虑到对通过网络发送的每条语句 的重新解析。 2. 程序包 PL/SQL 程序包将相关的函数和过程组合在一起,同时包含常见的变量和指针。程序包由 两个部分组成:程序包规范和程序包主体。在程序包规范中,提供程序包的方法和属性,方法 的实现以及任何私有方法和属性隐藏在程序包主体中。如果使用程序包而不是单独的过程或函 数,则在改变内嵌的过程或函数的时候,任何引用程序包规范中元素的对象都不会失效,从而 避免了重新编译引用程序包的对象。 第 1 章 Oracle 体系结构概述 21 3. 触发器 触发器一种是特殊类型的 PL/SQL 或 Java 代码块,或者是在指定事件发生时执行或触发。 事件类型可以是表或视图上的 DML 语句、DDL 语句、甚至是数据库事件,例如启动和关闭。 可以改进指定的触发器,使其作为审核策略的一部分在特定用户的特定事件上执行。 在分布式环境中,触发器可用于模仿不同数据库中的表之间的外键关系。它们也可用于实 现,那些无法使用内置的 Oracle 约束类型定义的复合完整性规则。 第 18 章中将介绍触发器如何应用于健壮的分布式环境中。 1.3.10 外部文件访问 除了外部表外,Oracle 还有大量其他的方法可用于访问外部文件: ● 在SQL*Plus中,访问包含将要运行的其他SQL命令的外部脚本,或者从SQL*Plus spool 命令发送输出到操作系统的文件系统中的文件。 ● 在 PL/SQL 过程中,使用 UTL_FILE 内置程序包读取或写入文本信息;类似地,PL/SQL 过程中的 dbms_output 调用可以生成文本消息和诊断,另一个应用程序可以捕获这些消 息和诊断,并且保存于一个文本文件中。 ● BFILE 数据类型可以引用外部数据。BFILE 数据类型是指向外部二进制文件的指针。 在 BFILE 可以用于数据库中之前,需要使用 create directory 命令创建目录别名,该命 令指定包含存放 BFILE 目标的完整目录路径的前缀。 ● DBMS_PIPE 可以和 Oracle 支持的任何 3GL 语言进行通信并且交换信息,例如 C++、 Ada、Java 或 COBOL。 ● UTL_MAIL 是 Oracle 10g 中新增的程序包,它允许 PL/SQL 应用程序发送电子邮件, 而不需要知道如何使用底层的 SMTP 协议栈。 在使用外部文件作为数据源进行输入或输出时,大量警告将按顺序出现。在使用外部数据 源之前,应该仔细考虑下面的各个方面: ● 数据库数据和外部数据可能经常不同步,这种情况发生在其中某个数据源改变但没有 和另一个数据源同步时。 ● 确保两个数据源的备份发生在几乎相同的时间内,从而确保恢复数据源时能使两个数 据源保持同步。 ● 脚本文件可能包含密码,许多组织禁止在脚本文件中使用普通文本表示任何用户账户。 在这种情况下,操作系统验证可能是比用户验证更好的方法。 ● 应该回顾某些文件的安全性,这些文件位于由每个 DIRECTORY 对象引用的目录中。 引用的操作系统文件的不严格安全性降低了数据库对象上的安全措施。 1.3.11 数据库链接和远程数据库 数据库链接允许 Oracle 数据库引用存储在本地数据库外部的对象。命令 create database link 创建远程数据库的路径,从而可以通过该路径访问远程数据库的对象。数据库链接包装了如下 内容:远程数据库的名称、连接到远程数据库的方法、用于验证远程数据库连接的用户名/密 码组合。在某些方面,数据库链接类似于数据库同义词:数据库链接可以为公有或私有,并且 它提供方便快捷的方法来访问另一个资源集。主要的区别在于,资源在数据库外部而不是相同 第Ⅰ部分 数据库体系结构 22 数据库中,因此需要更多的信息来解决引用问题。另一个区别在于,同义词是对特定对象的引 用,而数据库链接则是定义的路径,用于访问远程数据库中任意数量的对象。 为了在分布式环境中的多个数据库之间建立链接,域中每个数据库的全局数据库名必须不 同。因此,重点是正确分配初始参数 DB_NAME 和 DB_DOMAIN。 为了使数据库链接的使用更为容易,可以将同义词赋给数据库链接,从而使表访问更为透 明,用户不需要知道同义词访问的是本地对象还是分布式数据库上的对象。对象可以移动到不 同的远程数据库,也可以在本地数据库中移动,只要同义词名称保持相同,就可以使对象访问 对用户保持透明。 第 18 章中将进一步介绍如何在分布式环境中权衡远程数据库的数据库链接。 1.4 Oracle 物理存储结构 Oracle 数据库使用磁盘上的大量物理存储结构来保存并管理用户事务中的数据。一些物理 存储结构,例如数据文件、重做日志文件和归档的重做日志文件,保存实际的用户数据。其他 结构,例如控制文件,用于维护数据库对象的状态,而基于文本的警报和跟踪文件包含数据库 中例程事件和错误条件的日志信息。图 1-3 显示了这些物理结构之间的关系,第 1.3 节中已经 介绍了逻辑存储结构。 内存结构 实例 物理数据库结构 逻辑数据库结构 后台进程 数据库 数据文件 控制文件 重做日志文件 数据文件 1 数据文件 2 归档的重做 日志文件 数据文件 3 数据文件 4 数据库 System 表空间 USERS 表空间 SYSAUX 表空间 图 1-3 Oracle 物理存储结构 第 1 章 Oracle 体系结构概述 23 1.4.1 数据文件 每个 Oracle 数据库必须至少包含一个数据文件。一个 Oracle 数据文件对应于磁盘上的一 个物理操作系统文件。Oracle 数据库中的每个数据文件只能是一个表空间中的一个成员,然而 一个表空间可以由许多数据文件组成。 当 Oracle 数据文件用完空间时,它可以自动扩展,只要 DBA 使用 AUTOEXTEND 参数创 建数据文件。通过使用 MAXSIZE 参数,DBA 也可以限制给定数据文件的扩展量。在任何情 况下,数据文件的大小最终都会受到它所驻留的磁盘卷限制。 提示: DBA 通常必须确定是分配一个可以无限自动扩展的数据文件,还是分配许多较小的具有 有限扩展量的数据文件。虽然这两种解决方案的性能比较接近,但使用较多的数据文件,每个 数据文件的大小小于 2GB,可能是更好的选择。可以更容易地移动一些相对较小的文件,并且 一些文件系统会将单个文件的大小限制为 2GB。同时,如果需要临时将一个表空间的所有数据 文件移动到另一个服务器,则更容易发现一些卷,每个卷具有足够的空间来保存一个数据文件, 而不是使用具有足够空间的卷来保存大小为 25GB 的单个数据文件。 数据库中的所有数据最终都驻留在数据文件中,数据文件中频繁访问的块缓存在内存中。 类似地,新的数据块不会立刻写出数据文件,而是在数据库写入程序进程有效时再写入到数据 文件。然而,在用户的事务完成之前,事务的改变将写入到重做日志文件。 1.4.2 重做日志文件 无论何时在表、索引或其他 Oracle 对象中添加、删除或改变数据,都会将一个条目写入到 当前的重做日志文件。每个 Oracle 数据库必须至少有 2 个重做日志文件,因为 Oracle 以循环 方式重复使用重做日志文件。当一个重做日志文件填满重做日志条目时,如果仍然需要实例恢 复,则当前的日志文件被标记为 ACTIVE;如果不需要实例恢复,则标记为 INACTIVE;从文 件开始处重新使用序列中的下一个日志文件,并且将其标记为 CURRENT。 理想情况下,永远不会使用重做日志文件中的信息。然而,如果发生电源故障,或者一些 其他服务器的故障造成 Oracle 实例失败,数据库缓冲区缓存中新添加的或更新的数据块就可能 还没有写入到数据文件中。重新启动 Oracle 实例时,通过前滚操作将重做日志文件中的条目应 用于数据库数据文件,从而将数据库的状态恢复到发生故障时的情况。 为了能够从丢失重做日志组中的一个重做日志文件的情况中恢复,多个重做日志文件的副 本可以存在于不同的物理磁盘上。在本章的后面,您将看到如何多路传输重做日志文件、归档 的日志文件和控制文件,从而确保 Oracle 数据库的可用性和数据完整性。 1.4.3 控制文件 每个 Oracle 数据库至少有一个控制文件,用于维护数据库的元数据(也即,有关数据库自 身物理结构的数据)。控制文件包含创建数据库时的数据库名称、所有数据文件和重做日志文 件的名称和位置。此外,控制文件维护恢复管理器(RMAN)使用的信息,例如持久性 RMAN 设 置和已经在数据库上执行的备份类型。第 13 章中将深入介绍 RMAN。在对数据库结构进行改 动时,有关改动的信息会立刻反映在控制文件中。 第Ⅰ部分 数据库体系结构 24 因为控制文件对数据库操作至关重要,也可以对其进行多路传输。然而,不论多少个控制 文件的副本与一个实例关联,只会指定一个控制文件作为检索数据库元数据目的的主要控制 文件。 alter database backup controlfile to trace 命令是另一种备份控制文件的方法。它产生一个 SQL 脚本,如果由于灾难性的故障而丢失控制文件的所有多路传输二进制版本,可以使用该脚 本重新创建数据库控制文件。 例如,如果数据库需要重命名,或者需要改变各种数据库限制,不重新创建整个数据库就 无法改变这些限制,此时可以使用这种跟踪文件来重新创建控制文件。 1.4.4 归档的日志文件 Oracle 数据库有两种模式:archivelog 和 noarchivelog 模式。当数据库处于 noarchivelog 模 式时,重做日志文件(也称为“联机的重做日志文件”)的循环重用意味着重做条目(前面事务的 内容)在出现磁盘驱动器故障或其他介质相关故障时不再可用。在 noarchivelog 模式中操作可在 发生实例故障或系统崩溃等事件时保护数据库的完整性,因为已经提交但还没有写入到数据文 件的所有事务都可以在联机重做日志文件中找到。 相反,archivelog 模式将填满的重做日志文件发送到一个或多个指定的目的地,并且可以 用于在发生数据库介质故障后的任意给定时间点中重新构造数据库。例如,如果包含数据文件 的磁盘驱动器崩溃,可以将数据库的内容恢复到发生崩溃前的某个时间点,只要在进行备份后 已经生成了数据文件和重做日志文件最近的备份。 对填满的重做日志文件使用多个归档日志目标是 Oracle 高可用性的特性之一,即“Oracle 数据卫士”(Data Guard),更正式的称法为“Oracle 备用数据库”(Standby Database)。即第 14 章 中将详细介绍 Oracle 数据卫士。 1.4.5 初始参数文件 当数据库实例启动时,分配 Oracle 实例的内存,并且打开两种初始参数文件类型中的一种: 基于文本的文件,称为“init.ora”(一般称为“init.ora”或“PFILE”);或者是服务器参 数文件(称为“SPFILE”)。实例首先在操作系统的默认位置(例如,在 Unix 上的$ORACLE_ HOME/dbs)查找 SPFILE:spfile.ora 或 spfile.ora。如果这些文件都不存在,实例查找名为 init.ora 的 PFILE。作为选择,使用 startup 命令可以显式指定用于启动的 PFILE。 无论哪种形式,初始参数文件都可以指定跟踪文件、控制文件、填满的重做日志文件等文 件的位置。它们也设置系统全局区域(SGA)中各种结构的大小限制,以及限制有多少用户可以 同时连接到数据库。 在 Oracle9i 以前,使用 init.ora 文件仍然是指定实例的初始参数的唯一方法。虽然使用文 本编辑器编辑可以很容易地编辑该文件,但有一些缺点。如果在命令行中使用 alter system 命 令改变动态系统参数,DBA 必须记住改变 init.ora 文件,从而新的参数值可以在下一次启动实 例时生效。 SPFILE 使 DBA 可以更容易和更有效地管理参数。如果将 SPFILE 用于运行的实例中,改 变初始参数的任何 alter system 命令都可以自动改变 SPFILE 中的初始参数,或者只改变运行实 例的初始参数,或者两者都改动。不需要编辑 SPFILE,甚至可以不破坏 SPFILE 自身。 第 1 章 Oracle 体系结构概述 25 虽然不可以镜像参数文件或 SPFILE 自身,但可以将 SPFILE 备份到 init.ora 文件,然后使 用方便的操作系统命令或恢复管理器(在 SPFILE 的情况下)备份 Oracle 实例的 init.ora 和 SPFILE。 使用 DBCA 创建数据库时,默认创建 SPFILE。 1.4.6 警报和跟踪日志文件 当产生错误时,Oracle 通常将相关消息写入到警报日志,但在后台进程或用户会话的情况 下,将消息写入到跟踪日志文件。 警报日志文件位于由初始参数 BACKGROUND_DUMP_DEST 指定的目录中,它包含例程 状态消息和错误条件。启动或关闭数据库时,在警报日志中记录一条消息,同时记录不同于默 认值的初始参数列表。此外,DBA 提交的任何 alter database 或 alter system 命令都会被记录。 涉及表空间和它们的数据文件的操作也记录在该文件中,例如添加表空间、删除表空间、以及 添加数据文件到表空间。错误条件,例如用完空间的表空间、损坏的重做日志等,也记录在 此处。 Oracle 实例后台进程的跟踪文件也通过 BACKGROUND_DUMP_DEST 定位。例如,PMON 和 SMON 的跟踪文件在错误发生或 SMON 需要执行实例恢复时将记录一个条目,QMON 的跟 踪文件在它产生新进程时会记录一条消息。 针对单独的用户会话或数据库连接也会创建跟踪文件。这些跟踪文件位于由初始参数 USER_DUMP_DEST 指定的目录中。在两种情况下创建用户进程的跟踪文件:第一种情况是因 为权限问题、用完空间等而在用户会话中产生一些类型的错误。第二种情况中,可以使用命令 alter session set sql_trace=true 显式地创建跟踪文件。针对用户执行的每个 SQL 语句生成跟踪信 息,这样可以在调整用户的 SQL 语句时起到帮助作用。 可以在任何时间删除或重命名警报日志文件,下一次生成警报日志消息时重新创建警报日 志文件。DBA 通常建立一个每天执行的批处理操作(通过操作系统机制或 Oracle 企业管理器的 调度程序),用于重命名和归档警报日志。 1.4.7 备份文件 备份文件可以来自于许多源,例如操作系统的复制命令或 Oracle 恢复管理器(RMAN)。如 果 DBA 执行“冷”备份(查看第 1.7 节以了解关于备份类型的更多细节),备份文件就只是数据 文件、重做日志文件、控制文件、归档的重做日志文件等文件的操作系统副本。 除了数据文件的逐位图像副本(RMAN 中的默认方式),RMAN 还可以生成数据文件、控制 文件、重做日志文件、归档的日志文件以及 SPFILE 的完整备份和不断增加的备份,这些备份 都采用了特殊格式,称为“备份集”,只有 RMAN 可以读取。RMAN 备份集备份通常小于初始 的数据文件,因为 RMAN 没有备份不用的块。 1.4.8 Oracle 管理文件 Oracle 管理文件(OMF)在 Oracle 9i 中引入,通过自动化组成数据库中逻辑结构的数据文件 的创建和删除,OMF 简化了 DBA 的工作。 如果没有 OMF,DBA 可能删除表空间,而忘记删除底层的操作系统文件。这会造成无效 的磁盘资源使用,并且增加不必要的数据文件备份时间,而数据库并不需要这些备份。 第Ⅰ部分 数据库体系结构 26 OMF 非常适合于较小的数据库,这种数据库只有少量的用户和兼职 DBA,并且不需要产 品数据库的优化配置。 1.4.9 密码文件 Oracle 密码文件是磁盘上 Oracle 管理器或软件目录结构中的文件,用于验证 Oracle 系统管 理员执行的任务,例如创建数据库或启动和关闭数据库。通过该文件授予的权限是 SYSDBA 和 SYSOPER 权限。验证其他任何类型的用户在数据库自身中完成,因为可能关闭数据库或没 有安装数据库,在这些情况下就需要另一种形式的管理员验证。 如果密码文件不存在或者已经损坏,可以使用 Oracle 命令行实用程序 orapwd 创建密码文 件。由于要通过这个文件授予非常高的权限,因此应该将该文件存储在安全的目录位置,只有 DBA 和操作系统管理员可以访问该位置。一旦创建这种密码文件,应该将初始参数 REMOTE_LOGIN_PASSWORDFILE 设置为 EXCLUSIVE,允许 SYS 以外的用户使用密码文件。 提示: 创建至少一个不是 SYS 或 SYSTEM 的用户,该用户具有执行每日管理任务的 DBA 权限。 如果有多个 DBA 管理一个数据库,每个 DBA 都应该有自己的、具有 DBA 权限的账户。 作为选择,可以使用 OS 验证完成对 SYSDBA 和 SYSOPER 权限的验证,在这种情况下不 需要创建密码文件,并且应将初始参数 REMOTE_LOGIN_PASSWORDFILE 设置为 NONE。 1.5 多路传输数据库文件 为了最小化丢失控制文件或重做日志文件的可能,数据库文件的多路传输可减少或消除由 于介质故障而造成的数据丢失问题。使用从 Oracle 10g 开始引入的自动存储管理(Automatic Storage Management,ASM)实例可以在某种程度上自动化多路传输。对于更加注重预算的企业, 可以手动多路传输控制文件和重做日志文件。 1.5.1 自动存储管理 使用自动存储管理是一种多路传输解决方案,通过将数据文件、控制文件和重做日志文件 分布在所有可用的磁盘中,这种解决方案可以自动化这些文件的布局。将新的磁盘添加到 ASM 集群时,将数据库文件自动重新分布到所有的磁盘卷,从而优化性能。ASM 集群的多路传输 特性可最小化数据丢失的可能性,并且比将关键文件和备份放在不同物理驱动器上的手工方案 更为有效。 1.5.2 手工的多路传输 即使没有 RAID 或 ASM 解决方案,您仍然可以为关键的数据库文件提供一些保护措施, 方法是设置一些初始参数,并且为控制文件、重做日志文件和归档的重做日志文件提供额外的 位置。 第 1 章 Oracle 体系结构概述 27 1. 控制文件 创建数据库时可以立刻多路传输控制文件,也可以在后面的任意时刻多路传输控制文件, 只需要很少的一些步骤,即可将控制文件复制到多个目的地。最多可以多路传输控制文件的 8 个副本。 无论是在创建数据库时多路传输控制文件,还是在后面多路传输它们,CONTROL_ FILES 的初始参数值都相同。在下面的示例中,多路传输控制文件的 3 个副本: Alter system set control_files = '/u01/oracle/whse2/ctrlwhse1.ctl', '/u02/oracle/whse2/ctrlwhse2.ctl', '/u03/oracle/whse2/ctrlwhse3.ctl', scope=spfile; 如果使用这种参数集创建数据库,则创建 3 个控制文件,并且没有任何额外的步骤。 如果希望添加另一个多路传输位置,需要编辑初始参数文件,将另一个位置添加到 CONTROL_FILES 参数。如果使用 SPFILE 而不是 init.ora 文件,则使用类似于下面的命令来改 变 CONTROL_FILES 参数: alter system set control_files = '/u01/oracle/whse2/ctrlwhse1.ctl, /u02/oracle/whse2/ctrlwhse2.ctl, /u03/oracle/whse2/ctrlwhse3.ctl' scope=spfile; alter system 命令中 SCOPE 其他可能的值是 MEMORY 和 BOTH。指定 SCOPE 为其中任何 一个值都会返回错误,因为不可以针对运行的实例改变 CONTROL_FILES 参数,只有在下一 次重新启动实例时才可以改变。因此,只有 SPFILE 被改变。 无论哪一种情况,下一步都是关闭数据库。将控制文件复制到在 CONTROL_FILES 中指 定的新目的地,并且重新启动数据库。通过查看数据字典视图,可以验证控制文件的名称和 位置: select value from v$spparameter where name='control_files'; 该查询将返回控制文件的每个多路传输副本的一行。此外,视图 V$CONTROLFILE 包含 控制文件的每个副本的一行,并包含相应的状态。 2. 重做日志文件 将多个重做日志文件添加到重做日志文件组中,就可以多路传输重做日志文件。在默认的 Oracle 安装中,创建 3 个重做日志文件。如同您在前面关于重做日志文件的小节中了解的那样, 填满一个日志文件后,按顺序填充下一个日志文件。填满第 3 个日志文件后,重新使用第一个 日志文件。为了将这 3 个重做日志文件改变到一个组中,可以添加一个或多个相等的文件,伴 随每个已有的重做日志文件。创建组后,将重做日志条目同时写入到重做日志文件组中。填满 重做日志文件组时,将重做日志条目写入到下一个组中。图 1-4 显示了如何使用 4 个组多路传 输 4 个重做日志文件,每个组包含 3 个成员。 第Ⅰ部分 数据库体系结构 28 重做日志组 1 重做日志组 2 重做日志组 3 重做日志组 4 LGWR 日志文件开关 LGWR 日志文件开关 LGWR 日志文件开关 成员 1 成员 2 成员 3 成员 1 成员 1 成员 1 成员 2 成员 2 成员 2 成员 3 成员 3 成员 3 物理磁盘 1 物理磁盘 2 物理磁盘 3 LGWR 日志文件开关 图 1-4 多路传输的重做日志文件 添加成员到重做日志组非常简单直观。在 alter database 命令中,指定新文件的名称以及将 要添加到其中的组的名称。创建的新文件的大小与组中其他成员相同: alter database add logfile member '/u05/oracle/dc2/log_3d.dbf' to group 3; 如果填满重做日志文件的速度快于归档它们的速度,一种可行的解决方案是添加另一个重 做日志组。下面的示例显示了如何将第 5 个重做日志组添加到图 1-4 中的重做日志组: alter database add logfile group 5 ('/u02/oracle/dc2/log_3a.dbf', '/u03/oracle/dc2/log_3b.dbf', '/u04/oracle/dc2/log_3c.dbf') size 10m; 重做日志组的所有成员必须具有相同的大小。然而,不同组之间的日志文件大小可以不同。 此外,重做日志组可以有不同的成员数量。在前面的示例中,首先有 4 个重做日志组,添加一 个额外的成员到重做日志组 3(总共 4 个成员),并且添加具有 3 个成员的第 5 个重做日志组。 从 Oracle 10g 开始,您可以使用重做日志文件大小估计顾问(Redo Logfile Sizing Advisor) 来帮助确定重做日志文件的最优尺寸,从而避免过多的 I/O 活动或瓶颈。查看第 8 章以了解使 用重做日志文件大小估计顾问的更多信息。 3. 归档的重做日志文件 如果数据库处于 archivelog 模式,则在重做日志开关循环中可以重新使用重做日志文件之 前,将其复制到指定的位置。 第 1 章 Oracle 体系结构概述 29 1.6 Oracle 内存结构 Oracle 使用服务器的物理内存来保存 Oracle 实例的许多内容:Oracle 可执行代码自身、会 话信息、与数据库关联的单独进程、在进程之间共享的信息(例如数据库对象上的锁)。此外, 内存结构还包含用户和数据字典 SQL 语句,以及最终永久存储在磁盘上的缓存信息,例如来 自于数据库段的块和数据库中已完成事务的相关信息。分配给 Oracle 实例的数据区域称为“系 统全局区域”(System Global Area,SGA)。Oracle 可执行代码驻留在软件代码区域中。此外, 称为“程序全局区域”(Program Global Area,PGA)的区域对于每个服务器和后台进程来说是私 有的,Oracle 为每个进程分配一个 PGA。图 1-5 显示了这些 Oracle 内存结构之间的关系。 数据库缓冲区缓存 (默认大小) KEEP 缓冲池 RECYCLE 缓冲池 数据库缓冲区缓存(大小为 nk) 数据库缓冲区缓存(大小为 nk) 大型池 控制结构 流池 重做日志缓冲区缓存 共享池 保留池 库缓存 共享 SQL 区域 PL/SQL 过 程和程序包 数据字典缓存 固定的 SGA Java 池 软件代码区域 PGA SGA 栈空间 非共享内存 会话信息 排序、散列、合并区域 共享内存 图 1-5 Oracle 逻辑内存结构 1.6.1 系统全局区域 系统全局区域是用于 Oracle 实例的一组共享内存结构,由数据库实例的用户共享。启动 Oracle 实例时,根据在初始参数文件中指定的值或硬编码在 Oracle 软件中的值,为 SGA 分配 内存。控制 SGA 不同部分大小的许多参数都是动态的;然而,如果指定 SGA_MAX_SIZE 参 数,所有 SGA 的全部大小必须不能超出 SGA_MAX_SIZE 的值。如果没有指定 SGA_MAX_ SIZE,但是指定了参数 SGA_TARGET,Oracle 就自动调整 SGA 各组成部分的大小,从而分配 的内存总量等同于 SGA_TARGET。SGA_TARGET 是动态参数,可以在实例运行时改变该参数。 SGA 中的内存以“区组”(granule)为单位进行分配。区组的大小可以为 4MB 或 16MB, 这取决于 SGA 的全部大小。如果 SGA 小于或等于 128MB,区组就是 4MB;否则,区组为 16MB。 在接下来的一些小节中,将介绍 Oracle 如何使用 SGA 中每个部分的重点内容。第 8 章中 将介绍如何调整与这些区域关联的初始参数等更多信息。 第Ⅰ部分 数据库体系结构 30 1. 缓冲区缓存 数据库缓冲区缓存保存来自于磁盘的数据块,这些数据块有的满足最近执行的 select 语句, 有的是通过 DML 语句改变或添加的已修改块。从 Oracle 9i 开始,SGA 中保存这些数据块的内 存区域是动态的。这样做有一定的优点,因为它考虑到了数据库中可能有一些表空间的块大小 不同于默认的块大小。最多具有 5 种不同块大小(一种是默认块大小,最多具有其他 4 种块大 小)的表空间需要自己的缓冲区缓存。因为处理和事务需要每日或每周改变,DB_CACHE_SIZE 和 DB_nK_CACHE_SIZE 可以动态改变,而不需要重新启动实例,从而获得比固定块大小的表 空间更好的性能。 Oracle 可以使用 2 个具有相同块大小的额外缓存作为默认(DB_CACHE_SIZE)块大小:KEEP 缓冲池和 RECYCLE 缓冲池。从 Oracle 9i 开始,这些池独立于 SGA 中的其他缓存分配内存。 创建表时,通过在 STORAGE 子句中使用 BUFFER_POOL_KEEP 或BUFFER_POOL_RECYCLE 子句,可以指定表的数据块驻留在哪个池中。对于一天中频繁使用的表,最好将其放在 KEEP 缓冲池中,从而最小化检索表中块所需的 I/O。 2. 共享池 共享池包含两个主要的子缓存:库缓存和数据字典缓存。共享池的大小由初始参数 SHARED_POOL_SIZE 确定。这是另一个动态参数,可以对其调整大小,只要 SGA 的全部大 小小于 SGA_MAX_SIZE 或 SGA_TARGET。 库缓存 库缓存保存有关针对数据库运行的 SQL 和 PL/SQL 语句的信息。在库缓存中,因 为由所有用户共享,许多不同的数据库用户可以潜在地共享相同的 SQL 语句。 和 SQL 语句自身一起,SQL 语句的执行计划和解析树也存储在库缓存中。第二次由相同 的用户或不同的用户运行同一个 SQL 语句时,由于已经计算了执行计划和解析树,因此可以 改进查询或 DML 语句的执行时间。 如果库缓存过小,则将执行计划和解析树转储到缓存外面,这就需要频繁地将 SQL 语句 重新加载到库缓存中。查看第 9 章以了解监控库缓存效率的方法。 数据字典缓存 数据字典是数据库表的集合,由 SYS 和 SYSTEM 模式拥有,其中包含有 关数据库、数据库结构以及数据库用户的权限和角色的元数据。数据字典缓存保存来自数据字 典的缓存块。数据字典中来自表的数据块经常用于帮助处理用户查询和其他 DML 命令。 如果数据字典缓存太小,对数据字典中信息的请求将造成额外的 I/O。这些 I/O 绑定的数 据字典请求称为“递归调用”,应该通过正确设定数据字典缓存的大小来避免这种请求。 3. 重做日志缓冲区 重做日志缓冲区保存对数据文件中数据块最近的改动。当重做日志缓冲区只有 1/3 已满或 者每隔 3 秒时,将重做日志记录写入到重做日志文件中。一旦将重做日志缓冲区中的条目写入 到重做日志文件,则如果在将改动的数据块从缓冲区缓存写入到数据文件之前实例崩溃,这些 条目就对数据库恢复起着至关重要的作用。只有已经将重做日志条目成功写入到重做日志文 件,才可以认为用户提交的事务完成。 第 1 章 Oracle 体系结构概述 31 4. 大型池 大型池是 SGA 的可选区域。它用于与多个数据库交互的事务、处理执行并行查询的消息 缓冲区、以及 RMAN 备份和恢复操作。如名称所示,大型池可为需要一次分配大型内存块的 操作提供所需的大型内存块。 初始参数 LARGE_POOL_SIZE 控制大型池的大小,这是从 Oracle 9i 版本 2 开始出现的动 态参数。 5. Java 池 Oracle 的 Java 虚拟机(Java Virtual Machine,JVM)使用 Java 池来处理用户会话中的所有 Java 代码和数据。将 Java 代码和数据存储在 Java 池中类似于将 SQL 和 PL/SQL 代码缓存在共享 池中。 6. 流池 作为 Oracle 10g 中新增的池,使用初始参数 STREAMS_POOL_SIZE 可以确定流池的大小。 流池保存用于支持 Oracle 企业版本中 Oracle 流特性的数据和控制结构。Oracle 流管理分布式环 境中数据和事件的共享。如果没有初始化初始参数 STREAMS_POOL_SIZE 或者将其设置为 0, 则从共享池中分配用于流操作的内存,并且最多可以分配共享池 10%的容量。第 18 章将介绍 关于 Oracle 流的更多信息。 1.6.2 程序全局区域 程序全局区域是分配给一个进程并且为该进程私有的内存区域。PGA 的配置取决于 Oracle 数据库的连接配置:共享服务器或专用服务器。 在共享服务器配置中,多个用户共享一个数据库连接,从而最小化服务器上的内存使用率, 但会潜在地影响用户请求的响应时间。在共享服务器环境中,SGA 保存用户的会话信息,而不 是由 PGA 保存。对于大量同时进行的数据库连接,以及很少发生的或短期的请求,共享服务 器环境是理想的环境。 在专用服务器环境中,每个用户进程获得自己的数据库连接,PGA 包含这种配置的会话 内存。 PGA 也包括一个排序区域,当用户请求需要排序、位图合并或散列连接操作时,就会使用 这种排序区域。 从 Oracle9i 开始,通过 PGA_AGGREGATE_TARGET 参数和 WORKAREA_SIZE_POLICY 初始参数,DBA 可以选择所有工作区域的全部大小,并且让 Oracle 管理并分配所有用户进程 之间的内存,从而简化系统管理。 1.6.3 软件代码区域 软件代码区域存储作为 Oracle 实例一部分运行的 Oracle 可执行文件。这些代码区域实际 上是静态的,只有在安装新的软件版本时才会改变。一般来说,Oracle 软件代码区域位于与其 他用户程序隔离的权限内存区域。 第Ⅰ部分 数据库体系结构 32 Oracle 软件代码是严格只读的代码,可以共享安装或非共享安装。当多个 Oracle 实例运行 在相同服务器上和相同的软件版本级别中时,按可共享方式安装 Oracle 软件代码可节省内存。 1.6.4 后台进程 当 Oracle 实例启动时,多个后台进程就会启动。后台进程是设计用于执行特定任务的可执 行代码块。图 1-6 显示了后台进程、数据库和 Oracle SGA 之间的关系。和前台进程对比,例如 SQL*Plus 会话或 Web 浏览器,用户无法看到后台进程的工作情况。SGA 和后台进程结合起来 组成了 Oracle 实例。 RECO PMON SMON 系统全局区域 数据库缓冲区缓存 重做日志 缓冲区 用户进程 用户进程 共享服务器 进程 专用服务器 进程 D000 CKPT ARC0 DBW0 LGWR 脱机存储 设备 控制文件 用户进程 数据文件 重做日志 文件 图注: RECO 恢复器进程 PMON 进程监控器 SMON 系统监控器 CKPT 检查点 ARC0 归档程序 DBW0 数据库写入程序 LGWR 日志写入程序 D000 调度程序进程 图 1-6 Oracle 后台进程 1. SMON SMON 是系统监控器进程。在系统崩溃或实例故障的情况下,由于停电或 CPU 故障,通 过将联机重做日志文件中的条目应用于数据文件,SMON 进程可执行崩溃恢复。此外,在系统 重新启动期间清除所有表空间中的临时段。 SMON 的一个常规任务是合并字典管理的普通表空间中的空余空间。 2. PMON 如果删除用户连接,或者用户进程以其他方式失败,PMON(也称为“进程监控器”)就会 第 1 章 Oracle 体系结构概述 33 进行清除工作。它清除数据库缓冲区缓存以及用户连接使用的其他任何资源。例如,用户会话 可能正在更新表中的某些行,在一行或多行上放置锁。一场雷暴雨袭击了用户办公桌的电力设 置,当工作站的电源关闭时,SQL*Plus 会话消失。期间,PMON 将检测到连接不再存在,并 且执行下面的任务: ● 回滚电源断开时处于进程中的事务。 ● 在缓冲区缓存中标记可用的事务块。 ● 删除表中受影响行上的锁。 ● 从活动进程列表中删除未连接进程的进程 ID。 通过将实例状态的相关信息提供给传入的连接请求,PMON 也和监听器进行交互。 3. DBWn 数据库写入程序(database writer)进程,在 Oracle 的旧版本中也称为 DBWR,将缓冲区缓存 中新增的或改动的数据块(称为“脏块”)写入到数据文件。使用 LRU 算法,DBWn 首先写入最 早的、最小的活动块。作为结果,请求最多的块驻留在内存中,即使它们是脏块。 最多可以启动 20 个 DBWn 进程,DBW0 到 DBW9,以及 DBWa 到 DBWj。通过 DB_WRITER_PROCESS 参数可以控制 DBWn 进程的数量。 4. LGWR LGWR,或称为“日志写入程序”,负责重做日志缓冲区的管理。在具有大量 DML 活动的 实例中,LGWR 是最为活跃的进程。直到 LGWR 成功将重做信息(包括提交记录)写入到重做 日志文件,才认为事务已经完成。此外,直到 LGWR 已经写入重做信息,才可以通过 DBWn 将缓冲区缓存中的脏缓冲区写入到数据文件。 如果分组重做日志文件,并且组中一个多路传输的重做日志文件已经损坏,LGWR 将写入 到剩余的组成员,并且在警报日志文件中记录错误。如果组中的所有成员都不可用,LGWR 进 程就会失败,并且整个实例挂起,直到纠正问题。 5. ARCn 如果数据库处于 ARCHIVELOG 模式,则在重做日志填满并且重做信息开始按顺序填充下 一个重做日志时,归档程序进程或 ARCn 将重做日志复制到一个或多个目的地目录、设备或网 络位置。最理想的情况下,归档进程应在下一次使用填满的重做日志之前完成。否则就会产生 严重的性能问题:用户无法完成它们的事务,直到将条目写入到重做日志文件,并且重做日志 文件还没有准备好接受新的条目,因为它仍然正在写入到归档位置。对于该问题,至少有 3 种 可能的解决方案:使重做日志文件更大一些,增加重做日志组的数量,以及增加 ARCn 进程的数 量。针对每个实例最多可启动 10 个 ARCn 进程,其方法是增加 LOG_ARCHIVE_MAX_ PROCESSES 初始参数的值。 6. CKPT 检查点进程,或 CKPT,可帮助减少实例恢复所需的时间量。在检查点期间,CKPT 更新 控制文件和数据文件的标题,从而反映最近成功的系统改变号(System Change Number,SCN)。 每次进行重做日志文件切换时,自动产生一个检查点。DBWn 进程按照常规写入脏缓冲区,将 第Ⅰ部分 数据库体系结构 34 检查点从实例恢复可以开始的位置提前,从而减少平均恢复时间(Mean Time to Recovery, MTTR)。 7. RECO RECO,或恢复器进程,用于处理分布式事务(包括对多个数据库中的表进行改动的事务) 的故障。如果同时改动 CCTR 数据库和 WHSE 数据库中的表,而在可以更新 WHSE 数据库中 的表之前,两个数据库之间的网络连接失败了,RECO 将回滚失败的事务。 1.7 备份/恢复概述 Oracle 支持许多不同形式的备份和恢复。可以在用户级上管理其中一些备份和恢复,例如 导出和导入,而大多数备份和恢复严格以 DBA 为中心,例如联机或脱机备份以及使用操作系 统命令或 RMAN 实用程序。 第 12 章和第 13 章中将介绍配置和使用这些备份和恢复方法的细节。 1.7.1 导出/导入 在所有 Oracle 硬件和软件平台上,导出命令都是独立的实用程序,在操作系统的命令行提 示符或 GUI 环境中的 Oracle 企业管理器控制台中输入命令 exp,就可以启动导出命令。可以将 导出认为是逻辑备份,因为没有记录表的底层存储特征,而只记录了表的元数据、用户权限和 表数据。根据手边的任务以及是否具有 DBA 权限,使用 exp 命令可以导出数据库中的所有表、 一个或多个用户的所有表、或者特定的表集。 为了根据数据库导出进行恢复,通过运行 imp 命令启动导入命令,该命令获得由导出命令 创建的二进制格式文件,并且将其导入到数据库中,假设导出数据库表中的用户存在于执行导 入命令的数据库中。 使用导出和导入的一个优点在于,在数据库中具有较高权限的用户能够管理自己的备份和 恢复,特别是在开发环境中。Oracle 的各个版本一般都可以读取由导出命令生成的二进制文件, 从而使从 Oracle 旧版本向新版本的少量表的传输非常简单。 导出和导入在本质上是“时间点”备份,如果数据是易变的,则导出和导入就不是最健壮 的备份和恢复解决方案。 在 Oracle 10g 中,Oracle 数据泵(Data Pump)提升了导出和导入操作的性能。导出到外部数 据源最多可以快 2 倍,而导入操作最多可以快 45 倍,因为数据泵导入使用直接路径加载,这 一点不同于传统的导入。此外,从源数据库的导出可以同时导入到目标数据库,而不需要中间 的转储文件,从而节省时间和管理工作。使用带有 expdb 和 impdb 命令的 DBMS_DATAPUMP 程序包可以实现数据泵,它包括大量其他的可管理特性,例如细粒度的对象选择。第 17 章中 提供了关于 Oracle 对象泵的更多信息。 1.7.2 脱机备份 建立数据库物理备份的一种方法是执行脱机备份。为了执行脱机备份,关闭数据库,并且 将所有的数据库相关文件,包括数据文件、控制文件、SPFILE、密码文件等,复制到其他的位 置。一旦复制操作完成,就可以启动数据库实例。 第 1 章 Oracle 体系结构概述 35 脱机备份类似于导出备份,因为它们都是时间点备份,因此在需要最新的数据库恢复并且 数据库不处于 archivelog 模式中时,这些备份都没有什么作用。脱机备份的另一个不足之处在 于执行备份所需的停机时间量,任何需要 24/7 数据库访问的跨国公司通常不会进行脱机备份。 1.7.3 联机备份 如果数据库处于 archivelog 模式,则可以进行数据库的联机备份。可以打开数据库,并且 用户可以使用该数据库,即使当前正在进行备份。进行联机备份的过程非常简单,只要使用 alter tablespace users begin backup 命令将表空间转入备份状态,使用操作系统命令备份表空间中的 数据文件,然后使用 alter tablespace users end backup 命令将表空间转移出备份状态。 1.7.4 RMAN 备份工具恢复管理器,更常见的叫法是 RMAN,从 Oracle 8i 就开始出现了。RMAN 提供 了优于其他备份形式的许多优点。它可以在完整的数据库备份中间只对改动的数据块进行不断 增加的备份,同时数据库在备份期间保持联机。 RMAN 通过以下两种方法跟踪备份:通过备份数据库的控制文件,或者通过存储在另一个 数据库中的恢复目录。对于 RMAN,使用目标数据库的控制文件比较简单,但对于健壮企业备 份方法学,这并不是最佳的解决方案。虽然恢复目录需要另一个数据库来存储目标数据库的元 数据和所有备份的记录,但如果目标数据库中的所有控制文件可能由于灾难性的故障而丢失, 这时就值得采用恢复目录的方法。此外,恢复目录保留历史备份信息,如果将 CONTROL_FILE_ RECORD_KEEP_TIME 的值设置得太低,则可能将这些备份信息重写在目标数据库的控制文 件中。 第 13 章中详细讨论 RMAN。 1.8 安全功能 下面几节中将简要概述 Oracle 10g Database 在数据库中控制并实施安全性的不同方法。关 于数据库对象的小节中将介绍基于用户和模式对象的账户安全性,本部分主要介绍其他安全性 主题。 第 10 章中将深入介绍 Oracle 中的各种安全性功能。 1.8.1 权限和角色 在 Oracle 数据库中,权限用于控制用户可执行的操作以及数据库中对象的访问。控制对数 据库中操作访问的权限称为“系统权限”,而控制对数据和其他对象访问的权限称为“对象 权限”。 为了使 DBA 可以更容易地分配和管理权限,数据库角色将权限结合在一起。换言之,角 色是指定的权限组。此外,角色自身可以赋予角色。 使用 grant 和 revoke 命令可以授予以及取消权限和角色。用户组 PUBLIC 既不是用户也不 是角色,也不可删除该用户组。然而,将权限授予 PUBLIC 时,它们会被授予现在和将来的每 个数据库用户。 第Ⅰ部分 数据库体系结构 36 1. 系统权限 系统权限授予在数据库中执行特定类型操作的权利,例如创建用户、改变表空间、或删除 任意视图。下面是授予系统权限的示例: grant DROP ANY TABLE to SCOTT WITH ADMIN OPTION; 用户 SCOTT 可以删除任意模式中任何一个人的表,with grant option 子句允许 SCOTT 将 授予他的权限授予其他用户。 2. 对象权限 在数据库中的特定对象上可以授予对象权限。最常见的对象权限是用于表的 SELECT、 UPDATE、DELETE 和 INSERT,用 于 PL/SQL 存储对象的 EXECUTE,以及用于授予表上索引 创建权限的 INDEX。在下面的例子中,用户 RJB 可以在 HR 模式的 JOBS 表上执行任意 OML 命令。 grant SELECT, UPDATE, INSERT, DELETE on HR.JOBS to RJB; 1.8.2 审核 为了审核用户对数据库对象的访问,通过使用 audit 命令,可以在指定对象或动作上建立 审核跟踪。可以审核 SQL 语句和对特殊数据库对象的访问,操作的成功或失败(或者两者)可以 记录在审核跟踪表 SYS.AUD$中。 对于每个审核操作,Oracle 创建一个审核记录,其中包括用户名、执行的操作类型、涉及的对 象以及时间标记。各种数据字典视图,例如DBA_AUDIT_TRAIL 和DBA_FGA_AUDIT_TRAIL, 可以较为容易地解释来自原始审核跟踪表 SYS.AUD$的结果。 警告: 过多地对数据库对象进行审核可能会对性能带来负面影响。首先应对关键的权限和对象进 行基础的审核,然后在基础审核表明潜在问题时再扩展审核。 1.8.3 细粒度的审核 Oracle 10g 增强了细粒度审核的功能,并进一步地扩展了审核:在 EMPLOYEE 表上执行 select 语句时,标准审核可以进行检测。细粒度的审核将产生一条包含 EMPLOYEE 表中特定 访问列的审核记录,例如 SALARY 列。 使用 DBMS_FGA 程序包和数据字典视图 DBA_FGA_AUDIT_TRAIL 实现细粒度的审核。 数据字典视图 DBA_COMMON_AUDIT_TRAIL 将 DBA_AUDIT_TRAIL 中的标准审核记录和 细粒度的审核记录结合在一起。 1.8.4 虚拟私有数据库 Oracle 的虚拟私有数据库(Virtual Private Database)特性从 Oracle8i 开始引入,它将细粒度 的访问控制和安全应用程序上下文结合起来。安全策略与数据相关,而不是应用程序,这就确 保了安全规则的实施与数据访问方式无关。 例如,一个医疗应用程序上下文可能根据访问数据的病人标识号返回一个谓词,在 WHERE 子句中使用该谓词来确保从表中检索的数据只是与该病人相关的数据。 第 1 章 Oracle 体系结构概述 37 1.8.5 标号安全性 Oracle 的标号安全性(Label Security)提供了“VPD Out-of-the-Box(预设值)”解决方案,根 据请求访问的用户标号和表自身行上的标号,该解决方案可限制对任何表中行的访问。Oracle 标号安全性管理员不需要任何特殊的编程技巧来将安全性策略标号赋给用户和表中的行。 例如,高粒度的数据安全性方法可以允许应用程序服务提供商(Application Service Provider,ASP)中的 DBA 只创建一个账户可接收应用程序的实例,并且使用标号安全性来限制 每个表中的行只包括单个公司的账户可接收信息。 1.9 实时应用集群 Oracle 的实时应用集群(Real Application Cluster,RAC)特性在以前的 Oracle 版本中称为 Oracle 并行服务器(Parallel Server)选项,它允许不同服务器上的多个实例访问相同的数据库文件。 对于计划中的和意外的断电,RAC 安装提供了非常高的可用性。可以使用新的初始参数 重新启动一个实例,而另一个实例仍然在服务于针对数据库的请求。如果一个硬件服务器由于 一些类型的故障而崩溃,另一个服务器上的 Oracle 实例将继续处理事务,即使从连接到崩溃服 务器的用户看来,这个过程也是透明的,不同之处在于它具有最短的停机时间。 然而,RAC 并不是一种只对软件有要求的解决方案:实现 RAC 的硬件也必须满足特定的 要求。共享数据库应该在支持 RAID 的磁盘子系统上,从而确保存储系统的每个组件都是容错 的。此外,RAC 需要在集群中的节点之间具有高速互连或私有网络,从而使用缓存融合(Cache Fusion)机制支持一个实例到另一个实例的通信和块传输。 图 1-7 显示了具有两个节点的 RAC 安装。第 11 章中将深入介绍如何建立和配置实时应用 集群。 内存 系统全局区域 系统全局区域 内存 高速互连 第二个服务器: 第一个服务器: 后台进程 后台进程 数据库:共享磁盘驱动器 数据库文件 图 1-7 两个节点的实时应用集群(RAC)配置 第Ⅰ部分 数据库体系结构 38 1.10 Oracle 流 作为 Oracle 企业版本的一个组成部分,Oracle 流是 Oracle 基础结构的高级组成部分,它是 实时应用集群的补充。Oracle 流允许数据和事件在同一个数据库中或两个数据库之间平稳地流 动和共享。它是 Oracle 众多高可用性解决方案的一个关键部分,用于配合并增强 Oracle 的消 息队列、数据复制和时间管理功能。第 18 章中将介绍如何实现 Oracle 流的更多信息。 1.11 Oracle 企业管理器 Oracle 企业管理器(Oracle Enterprise Manager,OEM)是很重要的一组工具,用于帮助对 Oracle 基础结构的所有组成部分进行综合性的管理,包括 Oracle 数据库实例、Oracle 应用程序 服务器以及 Web 服务器。如果第三方应用程序存在管理代理,则 OEM 可以在任何与 Oracle 提供目标相同的框架中管理第三方应用程序。 OEM 通过 Netscape 或 Internet Explorer 完全支持 Web,因此任何支持 Netscape 或 IE 的操 作系统平台都可以用于启动 OEM 控制台。 使用具有 Oracle 网格控制(Grid Control)的 OEM 时,需要做的一个关键决定是选择管理仓 库的存储位置。OEM 管理仓库存储在与管理或监控节点分离的数据库中。它集中来自节点和 服务的元数据,并且帮助管理这些节点。应该经常备份管理仓库数据库,并且将该备份与被管 理的数据库隔离。 OEM 的安装提供了大量的“预设”值。当 OEM 安装完成时,已经准备好建立电子邮件通 知,用于向 SYSMAN 或其他任何符合关键条件的电子邮件账户发送消息,并且自动完成初始 目标的发现。 1.12 Oracle 初始参数 Oracle 数据库使用初始参数来配置内存设置、磁盘位置等。有两种方法可用于存储初始参 数:使用可编辑的文本文件和使用服务器端的二进制文件。不管用于存储初始参数的方法是什 么,存在一组已定义的基本初始参数(从 Oracle 10g 开始),每 个 DBA 在创建新的数据库时应该 熟悉这些初始参数。 从 Oracle 10g 开始,初始参数主要分为两个类别:基本初始参数和高级初始参数。因为 Oracle 越来越自动化管理,DBA 每天必须熟悉和调整的参数数量正在不断减少。 1.12.1 基本初始参数 表 1-3 中列出了 Oracle 10g 的基本初始参数,并进行了简要的描述。下面的小节中将给出 进一步的解释,以及与如何设置其中一些参数相关的建议,这取决于硬件和软件环境、应用程 序类型以及数据库中的用户数量。 第 1 章 Oracle 体系结构概述 39 表 1-3 基本初始参数 初 始 参 数 说 明 CLUSTER_DATABASE 启用该节点作为集群的一个成员 COMPATIBLE 允许安装新的数据库版本,同时确保与该参数指定 的版本兼容 CONTROL_FILES 指定该实例的控制文件的位置 DB_BLOCK_SIZE 指定 Oracle 块的大小。这种块大小用于创建数据库 时的 SYSTEM、SYSAUX 和临时表空间 DB_CREATE_FILE_DEST OMF 数据文件的默认位置。如果没有设置 DB_CREATE_ONLINE_LOG_DEST_n,该参数也 用于指定控制文件和重做日志文件的位置 DB_CREATE_ONLINE_LOG_DEST_n OMF 控制文件和联机重做日志文件的默认位置 DB_DOMAIN 数据库驻留在分布式数据库系统中的逻辑域名(例 如,us.oracle.com) DB_NAME 最多 8 个字符的数据库标识符。放置在 DB_DOMAIN 值前面,形成完全限定的名称(例如, marketing.us.oracle.com) DB_RECOVERY_FILE_DEST 恢复区域的默认位置。必须和 DB_RECOVERY_ FILE_DEST_SIZE 一起设置 DB_RECOVERY_FILE_DEST_SIZE 以字节为单位的文件最大大小,该文件用于在恢复 区域位置中的恢复 INSTANCE_NUMBER 在 RAC 安装中,集群中该节点的实例数量 JOB_QUEUE_PROCESSES 允许用于执行工作的最大进程数,范围从 0 到 1000 LOG_ARCHIVE_DEST_n 对于 ARCHIVELOG 模式,最多 10 个位置用于发 送归档的日志文件 LOG_ARCHIVE_DEST_STATE_n 设置对应 LOG_ARCHIVE_DEST_n 地点的可用性 NLS_LANGUAGE 指定数据库的默认语言,包括消息、日和月的名称、 以及排序规则(例如,‘AMERICAN’) NLS_TERRITORY 用于日和月编号的领域名称(例如,‘SWEDEN’、 ‘TURKEY’或‘AMERICA’) OPEN_CURSORS 每个会话开放的最多指针数量 PGA_AGGREGATE_TARGET 分配给实例中所有服务器进程的全部内存 PROCESSES 可以同时连接到 Oracle 的最大操作系统进程数量, SESSIONS 和 TRANSACTIONS 从这个值派生 REMOTE_LISTENER 网络名称,分析该名称可了解 Oracle Net 远程监 听器 第Ⅰ部分 数据库体系结构 40 (续表) 初 始 参 数 说 明 REMOTE_LOGIN_PASSWORDFILE 指定 Oracle 如何使用密码文件,RAC 中必须使用 该参数 ROLLBACK_SEGMENTS 引起联机的私有回滚段名称,如果撤销管理没有用 于事务回滚 SESSIONS 最大会话数量,从而也可表示实例中同时具有的用 户数量。默认值为 1.1*PROCESSES+5 SGA_TARGET 指定所有 SGA 组成部分的全部大小,该参数自动 确定 DB_CACHE_SIZE、SHARED_POOL_SIZE、 LARGE_POOL_SIZE 和 JAVA_POOL_SIZE SHARED_SERVERS 启动实例时分配的共享服务器进程数量 STAR_TRANSFORMATION_ENABLED 执行开始查询时控制查询优化 UNDO_MANAGEMENT 指定撤销管理是否自动化(AUTO) 或手动 (MANUAL)。如果指定 MANUAL,回滚段就用于 撤销管理 UNDO_TABLESPACE 将UNDO_MANAGEMENT设置为AUTO时使用的 表空间 在第 1.13 节中将再次介绍其中的一些参数,并学习设置用于 SGA、文件位置和其他限制 的初始参数。 1. COMPATIBLE COMPATIBLE 参数允许安装较新版本的 Oracle,同时限制新版本的特性集,就像安装了 旧的 Oracle 版本一样。该方法可以很好地用于数据库更新,同时保留与应用程序的兼容性,该 应用程序运行在新的软件版本下就可能会失败。当重做或重写应用程序,使其在新版本的数据 库上工作时,可以重新设置 COMPATIBLE 参数。 使用该参数的缺点在于,没有任何新的数据库应用程序可以利用新的特性,除非将 COMPATIBLE 参数设置为与当前版本相同的值。 2. DB_NAME DB_NAME 指定数据库名的本地部分。该参数最多可为 8 个字符,并且必须以字母字符作 为开始。一旦设置该参数,就不可以在没有重新创建数据库的情况下改变该参数。DB_NAME 记录在数据库的每个数据文件、重做日志文件和控制文件中。在数据库启动时,该参数的值必 须匹配控制文件中记录的 DB_NAME 的值。 3. DB_DOMAIN DB_DOMAIN 指定驻留数据库的网络域的名称。在分布式数据库系统中,DB_NAME 和 DB_DOMAIN 结合起来的值必须唯一。 第 1 章 Oracle 体系结构概述 41 4. DB_RECOVERY_FILE_DEST 和 DB_RECOVERY_FILE_DEST_SIZE 当由于实例故障或介质故障而进行数据库恢复操作时,可以方便地使用闪回恢复区域 (flash recovery area)来存储以及管理与恢复或备份操作相关的文件。从 Oracle 10g 开始,参数 DB_RECOVERY_FILE_DEST 可以是本地服务器上的目录位置、网络目录位置、或者 ASM(自 动存储管理)磁盘区域。DB_RECOVERY_FILE_DEST_SIZE 限制了允许将多少空间分配给恢复 或备份文件。 这些参数都是可选的,但如果指定了这些参数,恢复管理器(RMAN)就可以自动管理需要 备份和恢复操作的文件。这种恢复区域的大小应该足够大,从而可以保存所有数据文件、增加 的 RMAN 备份、联机的重做日志、还没有备份到磁带的归档日志文件、SPFILE 和控制文件的 两个副本。 5. CONTROL_FILES CONTROL_FILES 参数不是必需的参数。如果没有指定该参数,Oracle 将在默认的位置创 建一个控制文件。或者,如果配置 OMF,在由 DB_CREATE_FILE_DEST 或 DB_CREATE_ ONLINE_LOG_DEST_n 指定的位置中创建控制文件。 然而,强烈推荐在单独的物理卷上创建控制文件的多个副本。控制文件对于数据库完整性 至关重要,并且非常小,应该在单独的物理磁盘上创建至少 3 个多路传输的控制文件副本。此 外,应该执行 alter database backup controlfile to trace 命令,用于在形成主要灾难的事件中创建 文本格式的控制文件副本。 下面的示例指定 3 个用于控制文件副本的位置: CONTROL_FILES = (/u01/oracle10g/test/control01.ctl, /u03/oracle10g/test/control02.ctl, /u07/oracle10g/test/control03.ctl) 6. DB_BLOCK_SIZE 参数 DB_BLOCK_SIZE 指定数据库中默认 Oracle 块的大小。在创建数据库时,使用这种 块大小创建 SYSTEM、TEMP 和 SYSAUX 表空间。理想情况下,该参数应与操作系统块大小 的倍数相同,从而提高 I/O 效率。 在 Oracle9i 之前,您可以为 OLTP 系统指定较小的块大小(4KB 或 8KB),并且为 DSS 系统 指定较大的块大小(最多为 32KB)。然而,现在的表空间最多可以有 5 种块大小共存于相同的 数据库中,DB_BLOCK_SIZE 采用较小的值会有很好的效果。然而,一般倾向于使用 8KB 作 为任意数据库的最小值,除非已经在目标环境中严格证明 4KB 的块大小不会造成性能问题。 7. SGA_TARGET Oracle 可以帮助建立“设置它然后忘记它”数据库的另一种方法是,通过指定所有 SGA 组成部分的内存总量的能力。如果指定 SGA_TARGET,参数 DB_CACHE_SIZE、SHARED_ POOL_SIZE、LARGE_POOL_SIZE和JAVA_POOL_SIZE由自动共享内存管理(Automatic Shared Memory Management,ASMM)自动确定其大小。如果设置了 SGA_TARGET,并手工指定这 4 个参数中任意一个的大小,那么 ASMM 将使用手工指定大小的参数作为最小值。 第Ⅰ部分 数据库体系结构 42 一旦实例启动,自动确定大小的参数可以动态增加或减少,只要没有超出参数 SGA_MAX_SIZE 指定的值。参数 SGA_MAX_SIZE 指定整个 SGA 的上限,不可以超出或改变 这个值,除非重新启动实例。 不论如何指定 SGA 的大小,都需要确保服务器中有足够可用的空余物理内存来保存 SGA 的组成部分和所有后台进程,否则将会产生过多的分页,从而影响性能。 8. DB_CACHE_SIZE 和 DB_nK_CACHE_SIZE DB_CACHE_SIZE 指定 SGA 中用于保存默认大小块的区域大小,这些块包括来自于 SYSTEM、TEMP 和 SYSAUX 表空间的块。如果一些表空间的块大小不同于 SYSTEM 和 SYSAUX 表空间的块大小,最多可以定义 4 个其他的缓存。n 的值可以是 2、4、8、16 和 32, 如果 n 的值与默认块大小相同,对应的 DB_nK_CACHE_SIZE 参数就非法。虽然这个参数不是 基本初始参数,但在从具有不同于 DB_BLOCK_SIZE 的块大小的另一个数据库中传送表空间 时,该参数就成为非常基本的初始参数。 包括多个块大小的数据库具有非常明显的优点。处理 OLTP 应用程序的表空间可以有较小 的块大小,而具有数据仓库表的表空间则可以有较大的块大小。然而,在为这些缓存大小分配 内存时需要注意,不要将过多的内存分配给一个缓存大小,因为这会影响到分配给另一个缓存 大小的内存。从 Oracle9i 开始,Oracle 的缓冲区缓存顾问(Buffer Cache Advisory)特性在视图 V$DB_CACHE_ADVICE 中监控每个缓存大小的缓存利用率,从而帮助 DBA 指定这些内存区 域的大小。第 8 章中将介绍缓冲区缓存顾问特性的更多信息。 9. SHARED_POOL_SIZE、LARGE_POOL_SIZE 和 JAVA_POOL_SIZE 参数 SHARED_POOL_SIZE、LARGE_POOL_SIZE 和 JAVA_POOL_SIZE 分别用于确定共 享池、大型池和 Java 池的大小,如果指定了 SGA_TARGET 初始参数,则 Oracle 自动设置这 些参数。第 8 章中将介绍手动调整这些区域的更多信息。 10. PROCESSES PROCESSES 初始参数的值表示可以同时连接到数据库的进程总量,包括后台进程和用户 进程。PORCESSES 的良好起点可以是后台进程数 15 加上期望的并发用户数,对于较小的数据 库,50 是良好的起点,因为将 PROCESSES 参数设置过大几乎不会带来多少额外的系统开销。 11. UNDO_MANAGEMENT 和 UNDO_TABLESPCAE Oracle9i 中引入了自动撤销管理(Automatic Undo Management),它为所有的撤销操作(除了 SYSTEM 回滚段)指定同一个撤销表空间,在将 UNDO_MANAGEMENT 参数设置为 AUTO 时, 自动处理所有的撤销管理。 DBA 要做的任务是确定撤销表空间的大小。V$UNDOSTAT 等数据字典视图和撤销顾问 (Undo Advisor)可帮助 DBA 调整撤销表空间的大小。您可以创建多个撤销表空间,例如,一个 较小的撤销表空间每天白天联机以处理相对小的事务卷,一个较大的撤销表空间整夜联机以处 理批量工作和长期运行的查询,这种查询加载数据仓库并且需要事务一致性。任意给定时间内, 只有一个撤销表空间有效。 第 1 章 Oracle 体系结构概述 43 1.12.2 高级初始参数 高级初始参数包括没有列在本书中的其他初始参数,在 Oracle 10g 的第一版中总共有 255 个初始参数。设置基本初始参数时,Oracle 实例可自动设置并调整大多数高级初始参数。在第 1.13 节中将介绍其中一些高级初始参数。 1.13 软件安装 虽然 Oracle 的安装软件越来越易于使用,但打开 CD 盒并立刻开始安装仍然是一件非常诱 人的事情。虽然体验一些新的数据库特性是很好的,但执行成功的安装需要更多详细的计划, 从而避免许多重复的工作,甚至是一个月后的重新安装。虽然 Oracle Database 10g 安装的完整 细节超出了本书的范围,但本节将介绍 Oracle 安装的基础:使用 Oracle 通用安装程序(Oracle Universal Installer,OUI)以及使用 create database 命令进行手动数据库安装的基本模板。在任何 情况下,针对您的特定平台仔细阅读安装指南是成功 Oracle 数据库部署的另一个关键之处。下 面是在开始安装前应该解决的问题: ● 决定本地数据库名以及哪个域包含这个数据库。在初始参数 DB_NAME 和 DB_DOMAIN 中设置这些名称。 ● 对于第一个使用数据库的项目,估计表和索引的数量以及它们的大小,从而估计超出 Oracle SYSTEM 表空间以及相关的 Oracle 软件和工具的磁盘空间。 ● 计划服务器磁盘上物理数据文件的位置,从而最大化性能和可恢复性。物理磁盘越多 越好。如果将 RAID 和网络附加存储(Network Attached Storage,NAS)区域用于数据文 件,则应考虑使用 OMF 管理数据文件的放置。 ● 回顾并理解基本初始参数,如果没有立刻使用 SPFILE,则计划在实际操作之前使用 SPFILE。 ● 选择数据库字符集,以及一个可选的字符集。虽然可以很容易地默认安装字符集,但 可能需要考虑到数据库用户位于何处以及他们的语言需求。只要新的字符集是已有字 符集的超集,则可以在安装后改变字符集。 ● 决定默认数据库块的最佳大小。如果没有重新安装数据库,则不可以在后面改变由 DB_BLOCK_SIZE 定义的默认块大小。虽然这个决定对将来的数据库扩展并不是至关 重要,因为 Oracle 可以支持具有多个块大小的表空间,但具有不正确大小的默认块大 小将减少使用 SYSTEM、TEMP 或 SYSAUX 表空间进行操作的性能。 ● 确保对所有非管理用户分配一个非 SYSTEM 的表空间作为他们的默认表空间。任何用 户对象都不应该存储在 SYSTEM 表空间中。 ● 为了便于管理事务撤销信息,必须使用自动撤销管理。对于提高 DBA 和用户的生产效 率,撤销表空间所需的额外空间是值得投资的。 ● 计划备份和恢复策略。决定数据库备份的频率,使用多种方法备份数据库。在选择备 份策略时,需要回答的一个关键问题是,可以承受的数据库停机时间为多长?如果数 据库只在夜间处理批量工作,则每星期进行一次完全备份和每天进行增加的备份或许 是很好的方法。如果在数据库前台运行的是一个网站,该网站销售装饰品给全世界的 顾客,是一个全天候的网站。该网站停机所造成的损失是每分钟 6 个价位,可以证明 。并且已经创建了启动数据库,将在具有 DBCA 的相同服务器上创建并配置第二个数据库 示确定数据库大小和配置数据库所需的参数。下面小节中的安装步骤假定已经完成软件安装, 在软件安装的过程中,数据库配置助手(Database Configuration Assistant,DBCA)接管并提 或恢复管理器的网格控制仓库的良好候选选项。 建立服务器环境,同时帮助回顾 Oracle 10g 的任何新特性。启动数据库也可以作为企业管理器 强烈推荐在安装期间提示时创建启动数据库。创建启动数据库是很好的方法,可确保正确 版本、标准版本或个人版本。 在服务器安装期间,可以从前面小节给出的列表中选择 Oracle Database 10g 的版本:企业 分和客户端的组成部分。您也可以从初始 OUI 屏幕上卸载任何 Oracle 产品。 Oracle 通用安装程序(OUI)用于安装并管理所有 Oracle 组成部分,包括服务器端的组成部 1.13.2 使用 OUI 安装 Oracle 软件 SESSIONS_WARNING。 用户数量。因此,在 Oracle 10g 中不赞成使用 LICENSE_MAX_SESSIONS 和 LICENSE_ 授权。因此,DBA 应该使用初始参数 LICENSE_MAX_USERS 指定可以在数据库中创建的最大 从 Oracle 10g 开始,只能为指定的用户或 CPU 授权 Oracle Database,而不再有并发的用户 环境。 ● 个人版本 允许开发将运行在标准或企业版本上的应用程序。该版本不可以用于产品 器最多只有 2 个 CPU。 ● 标准版本 1 该版本提供与标准版本相同的特性,除了实时应用集群被限制为单个服务 时应用集群,但是额外的增件部分,例如 Oracle 标号安全性,不可以添加到标准版本。 ● 标准版本 该版本提供企业版本所包含特性的良好子集,包括最多 4 个全部 CPU 的实 Mining)。 间操作)、实时应用集群、Oracle OLTP、Oracle 标号安全性、以及 Oracle 数据挖掘(Data (Flashback Database)之类的特性,并且允许添加额外的授权功能,例如 Oracle Spatial(空 ● 企业版本ٛ 这是 Oracle 数据库中包括最多特性和可扩展的版本。它包括闪回数据库 无论在何种软件和硬件平台上安装 Oracle,可以执行的安装类型都是相同的: 1.13.1 授权和安装选项概述 增长和发展。第 5 章中介绍了如何成功计划大型数据库开发项目。 成功的初始软件安装是第一步。随着用户采用新的业务需求和应用程序,数据库也在不断 支持请求,下载补丁,下载白皮书,并且搜索存在故障的数据库。 通过 Web 浏览器就可以维持数据库正常运行。通过 Metalink,您可以提交支持请求,搜索其他 才是成功安装和部署的关键。使用 Oracle 的 Metalink(http://metalink.oracle.com)意味着您只需要 购买 Oracle 数据库软件的许可证是良好的开始,但具有 Web 支持的 Oracle 技术支持合同 的联机版本。使用 OTN 不需要支付任何费用,只要在该站点上注册即可。 http://otn.oracle.com,其中具有大量信息,包括白皮书、免费工具、示例代码和“Oracle Magazine” 有必要熟悉两个重要的网站。Oracle 技术网络(Oracle Technology Network,OTN)的网址是 要的。 在 Oracle 实时应用集群(RAC)环境和用户灾难恢复的数据卫士中的投资是完全有必 第Ⅰ部分 数据库体系结构 44 第 1 章 Oracle 体系结构概述 45 注意: 从 Oracle 10g 开始,DBCA 可以配置实时应用集群环境中的节点。 1.13.3 使用 DBCA 创建数据库 在操作系统命令提示符中,通过输入 dbca 启动 DBCA。在下面的小节中,将为创建数据 库期间显示的界面提供额外的提示和指南。 1. DBCA 选项 初始的欢迎屏幕后,提供了 4 个选项供选择: ● Create a Database 该选项非常直观,使用模板作为起点,从头开始创建一个新的数 据库。 ● Configure Database Options in a Database 可以改变已有数据库安装的一些系统参 数,例如从专用数据库模式改为共享数据库模式。 ● Delete a Database 该选项也很直观,并且非常危险!它将关闭数据库,并且删除与 该数据库关联的所有数据文件和控制文件。如果没有使用操作系统验证,则需要 SYS 或 SYSTEM 密码来继续进行该选项。 ● Manage Template 该选项允许添加、修改或删除模板。在 DBCA 会话期间,一旦已 经收集所有的数据库参数,就可以选择将设置保存为模板。在许多情况下,Oracle 提 供的预定义模板并不是当前环境的最佳选择,其作用在于节省时间,把数据库选项存 储为模板,供将来的 DBCA 会话使用。 2. 选择数据库模板 在图 1-8 中,介绍了可用的模板列表。如果在前面的 DBCA 会话中创建了自己的模板,这 些模板也会出现在该屏幕上。 模板选择如下: ● Custom Database 如果已经执行了许多安装,并且预先知道了数据库所需的所有选 项的值,则可以使用该选项。如果正在从头开始创建新模板,或者对于数据库配置有 很多特殊的需求,则该选项是很不错的选择。 ● Data Warehouse 该模板用于下列数据库环境,用户执行大量的复杂查询,这些查询 需要连接许多大型表以进行报告、预测和分析。 ● General Purpose 如果还不确定如何计划使用数据库,或者需要驻留具有分析和事务 处理需求的用户,则可以选择该模板。 ● Transaction Processing 在全天候的环境中,用户数量很多,事务也很多,但都很 短,并且大部分操作是创建和更新,此时应使用该模板。 在当前安装中,选择 General Purpose 模板。它将数据仓库和 OLTP 环境的特性结合到一个 数据库中,如果必须使用这种用于两种环境的数据库,则可以使用该选项。然而,理想情况下, 应该针对用户类型和数据库上的事务配置并调整创建的数据库。 第Ⅰ部分 数据库体系结构 46 图 1-8 数据库模板选择 3. Database Identification(数据库标识) 在 DBCA 的步骤 3 中,标识实例名称以及全局数据库名称。如果输入完全限定的数据库 名称,它将使用直到第一个句点的所有字符作为实例名称,或者 Oracle 系统标识符(System Identifier,SID)。图 1-9 显示了 Database Identification 界面。 图 1-9 Database Identification 屏幕 注意 SID、实例名称和数据库之间的区别。在服务器上可能有一个或多个数据库,每个数 据库可能有一个或多个实例正在打开数据库。使用相同数据库的实例名必须唯一。在服务器上, 如果有多个实例具有相同名称(但打开不同的数据库),与这些实例关联的 SID 必须唯一。 提示: 如果在将来需要改变全局数据库名,必须使用 alter database 命令来改变它,此外还必须在 初始参数文件中改变它。创建数据库时,全局数据库名存储在数据字典中。 除非已存在域,否则就使用默认的域名.world。请和系统管理员协商,了解是否应该使用 特殊的全局数据库名。 第 1 章 Oracle 体系结构概述 47 4. Management Options(管理选项) 如图 1-10 所示,下一个界面指定了可用的数据库管理选项。如果希望建立 Web 服务,从 而使用支持 Web 的 Oracle 企业管理器控制该数据库,则选中第一个复选框。如果网络上运行 网格控制管理服务(在以前的 Oracle 版本中,称为“企业管理器储存库代理”),则可以选择指 定哪个管理服务将控制该数据库。 如果没有任何可用的网格控制管理服务,则可以使用数据库控制(Database Control)本地管 理数据库。在数据库控制选项中,通过指定电子邮件地址和发送电子邮件消息的邮件服务器名 称,可以指定将警报、警告和其他数据库通知发送到何处。如果希望建立自动的每日备份,可 以指定每天进行备份的具体时间。 图 1-10 Database Management Options 屏幕 5. Database Credentials(数据库凭证) 在图 1-11 中,可以为管理用户账户提供初始密码。安装后,确保创建至少一个具有 DBA 权限的账户,使用该账户(而不是 SYS 或 SYSTEM)进行每日的管理任务。 图 1-11 Database Credentials 屏幕 第Ⅰ部分 数据库体系结构 48 如果希望使用与 SYS、SYSTEM、DBSNMP 和 SYSMAN 账户不同的密码,可以在该界面 上进行这项工作。安装的后期,已经创建数据库后,将有机会为在一般安装中创建的近 30 个 用户账户改变密码。 6. Storage Options(存储选项) 数据库可以使用各种不同的方法来存储数据文件、控制文件和重做日志文件。如果有专门 用于另一个数据库实例进行磁盘空间管理的资源,则选择 ASM。管理 ASM 的实例非常轻便, 一般情况下,它将使用不超过 64MB 的 RAM。如果处于实时应用集群环境中,并且没有可用 的集群文件系统(例如 OCFS),则选择 Raw Devices(裸设备)。图 1-12 显示了 Storage Options 界 面上的这些选项。 图 1-12 Storage Options 屏幕 7. File Locations(文件位置) 如图 1-13 所示,下一个界面可用于选择数据文件、控制文件和重做日志文件所在的位置, 以及归档、备份和恢复的位置。可以使用模板提供的位置,为所有文件提供自己的单独位置, 或者配置该数据库的 OMF(Oracle 管理文件)。无论是哪种情况,都可以选择在后面的步骤中微 调这些位置。 闪回恢复区域是 Oracle 10g 中的新增内容。这是磁盘上专用的位置,与数据库操作文件的 位置隔离,包含来自于 RMAN 的备份文件。强烈推荐使用闪回恢复区域,这样 RMAN 就可以 更容易地管理备份和恢复操作。本章前面提及,应确保闪回恢复区域足够大,可以保存所有数 据文件、增加的备份、控制文件、SPFILE 以及仍然在磁盘上的归档重做日志文件的至少两个 副本。图 1-14 显示了指定闪回恢复区域位置及其默认大小的界面。 第 1 章 Oracle 体系结构概述 49 图 1-13 Database File Locations 屏幕 也可以启用 archivelog 模式,并且指定归档重做日志文件的位置。推荐停止归档,直到已 经安装数据库,因为归档会增加数据库创建的时间。在启用并运行数据库后,可以很容易地在 init.ora 或 SPFILE 中直接改变 archivelog 模式的参数。 图 1-14 Recovery Configuration and Locations 屏幕 8. Database Component(数据库组成部分) 在 DBCA 会话的步骤 9 中,需要安装示例模式。强烈推荐安装示例模式,许多指导和学 习指南都依赖于数据库中的示例模式。示例模式也可以用于演示数据库中几乎所有的可用数据 类型和构造的示例中,范围从位图索引到集群索引和对象类型。图 1-15 中显示的界面允许指 定示例模式的安装。该界面上的第二个选项卡提供了一些选择,可用于指定创建数据库后针对 该数据库需要运行的其他脚本,例如为已有应用程序、特殊用户账户等创建表空间的脚本。 第Ⅰ部分 数据库体系结构 50 图 1-15 选择示例模式安装 注意: 出于安全性和性能原因,不应该在产品数据库中安装示例模式。 如果选择现在不安装示例模式,则在创建数据库后,可以使用目录$ORACLE_HOME /demo/schema 中的脚本创建示例模式。 9. Initialization Parameters(初始参数) 图 1-16 到图 1-19 中的界面允许 DBA 调整数据库的关键初始参数。在本章前面的小节中, 描述了许多 DBA 需要理解的基本初始参数。在接下来的内容中,将这些参数和输入在屏幕上 的值链接起来。 图 1-16 Initialization Parameters, Memory 选项卡 第 1 章 Oracle 体系结构概述 51 图 1-16 显示了 Initialization Parameters 屏幕的 Memory 选项卡。如果选择 Typical 或选择 Custom 下的 Shared Memory Management Automatic,Oracle 将对用于 SGA 和后台进程的内存 进行假设。即使在 Typical 配置中默认设置了许多参数,您仍然可以指定多少服务器的内存应 该用于 Oracle,这取决于操作系统使用了多少内存,以及是否有其他任何应用程序将和 Oracle 一起运行在这个服务器上。 由于 Java Pool 和 Large Pool 是可选项,因此可以将其设置为 0,从而将更多的内存提供给 Shared Pool 或 Buffer Cache。然而,即使数据库只有一个 Java Stored Procedure,Java Pool 的值 也必须至少是数据库中一个区组的大小:4MB 或 16MB,但推荐至少 20MB。 图 1-17 允许指定数据库的默认块大小,以及同时连接到 Oracle 进程总量,这对应于 PROCESSES 初始参数。 Block Size 参数的值为 4KB 比较合适,最好为 8KB,只要这个值是操作系统块大小的倍数 即可。确保数据库块大小正确无误并不像以前的 Oracle 版本中一样至关重要,因为数据库中的 其他表空间可以有不同于默认块大小的块大小。 图 1-17 Initialization Parameters, Sizing 选项卡 如果 Oracle Server 不是运行在 Shared Server 模式中,则每个用户连接都是专用连接,此时 应确保将 Processes 设置得足够高,可以包括所有预期的数据库连接和至少 15 个后台进程。 DBCA 中的下一个界面指定数据库的语言参数。除非有跨国组织并且对于数据库终端用户 有特殊的语言需求,否则根据服务器设置,默认的 Database Character Set 和 National Character Set 将是比较合适的选项。图 1-18 显示了 NLS 相关的参数。 下一个界面允许指定用户如何连接到数据库:通过专用的数据库连接或通过 Shared Server 环境。如果选择 Shared Server 模式,则可以编辑 Shared Server 环境的一些细节,例如使用什 么协议以及每个调度程序应该分配多少连接。在图 1-19 中,选择了 Shared Server 模式,具有 两个可用的 Shared Server 进程,用于处理来自于调度程序的连接请求。 第Ⅰ部分 数据库体系结构 52 图 1-18 Initialization Parameters, Character Sets 选项卡 图 1-19 Initialization Parameters, Connection Mode 选项卡 现在仍然位于 Initialization Parameters 界面上,通过单击 All Initialization Parameters 按钮, 可以微调初始参数的值。图 1-20 显示了如何修改 SGA_TARGET 或其他参数的值,即使在前面 的界面中已经隐式定义了这些参数。 第 1 章 Oracle 体系结构概述 53 图 1-20 编辑 Initialization Parameters 列表 10. Database Storage(数据库存储) 在 DBCA Database Storage 屏幕上,可以回顾并修订控制文件、数据文件和重做日志文件 的位置,同时可以多路传输控制文件并创建重做日志文件组。 图 1-21 显示了如何将控制文件多路传输到 3 个不同的磁盘位置。该界面上控制文件的名 称和位置可确定初始参数文件或 SPFILE 中 CONTROL_FILES 的值。 图 1-21 Database Storage 屏幕 第Ⅰ部分 数据库体系结构 54 11. Creation Options(创建选项) 在图 1-22 中,准备创建数据库。此时,可以使用在前面界面中提供的信息并将其保存到 模板中。如果没有疑问,则应将其保存为模板。保存模板所需的存储空间较小,通过运行 DBCA, 可以很容易地在以后删除它。 图 1-22 数据库和模板创建选项 创建数据库前,显示了模板的 HTML 小结,如图 1-23 所示,您可以选择将这份报告保存 为 HTML 文件并归档。 图 1-23 HTML 安装小结 第 1 章 Oracle 体系结构概述 55 12. 完成安装 在 HTML Summary 界面上单击 OK 按钮后,DBCA 执行任务以创建数据库并启动实例。 第一次启动数据库时将运行标准脚本集,包括创建示例模式的脚本,以及在前面指定的任何自 定义脚本。图 1-24 显示了执行初始任务的 DBCA。 图 1-24 创建并启动 Oracle 实例 一旦初始和创建脚本已经完成,将会显示一个小结界面,如图 1-25 所示,其中给出了该 安装的日志文件的位置。推荐回顾该日志文件以确保在安装期间没有任何意外的错误。您也应 该使用该数据库的其他文档保存这个日志文件,它也可作为将来安装的基础。 图 1-25 DBCA 小结 启动并运行刚才创建的 Oracle 实例,您可以选择解锁在这次安装期间创建的其他账户,并 且选择为它们分配密码。 1.13.4 手工创建数据库 在一些情况下,倾向于手工创建数据库,而不是使用 DBCA。例如,DBA 可能必须在 20 个不同的服务器上创建相同的数据库,或者数据库可能需要 create database 命令中的一些参数, 第Ⅰ部分 数据库体系结构 56 而使用 DBCA 无法调整这些参数。Oracle 提供了一个示例数据库创建脚本,可以自定义进行手 工安装。作为选择,DBA 可以使用 DBCA 将数据库脚本保存到文件中,可以在后面编辑该文 件,并且在 SQL*Plus 命令行中运行该文件。 下面是手工创建数据库所需的基本步骤。其中一些步骤与操作系统或平台相关,在介绍时 将说明这些区别。在尝试手工安装之前,确保回顾具体平台的安装指南。例如,在 Windows 下,需要运行实用程序 oradim.exe 以创建 Oracle 后台进程,并且设置相关的注册表值。 (1) 决定数据库的目录结构,推荐在将文件放置在磁盘上时遵守 Oracle 的优化灵活体系结 构(Optimal Flexible Architecture,OFA)。查看第 3 章和第 4 章以了解关于 OFA 的更多 信息。 (2) 选择一个 Oracle SID,用于区分该实例与运行在该服务器上的其他实例。Oracle SID 经常与在 DB_NAME 初始参数中指定的数据库名相同。在 Windows 命令提示符中, 可以输入下面的命令: set ORACLE_SID=rjbdb 而在 Unix 下面,可以使用 export ORACLE_SID=rjbdb 或 setenv ORACLE_SID=rjbdb 这取决于默认的命令解释器。 (3) 建立将权限用户连接到数据库的验证方法。如果希望 Oracle 验证权限用户,则可以使 用 orapwd 命令行实用程序创建密码文件,并且将初始参数 REMOTE_LOGIN_ PASSWORDFILE 设置为 EXCLUSIVE。如果正在使用操作系统验证,则不需要使用 密码文件,设置 REMOTE_LOGIN_PASSWORDFILE 为 NONE。 (4) 创建初始参数文件,并且将其放置在平台的默认位置,至少是安装的最初位置。在 Unix 下,默认位置是$ORACLE_HOME/dbs。在 Windows,该位置为$ORACLE_HOME/database。 下面是 Oracle 支持的初始文件的示例: # Cache and I/O DB_BLOCK_SIZE=4096 DB_CACHE_SIZE=20971520 # Cursors and Library Cache CURSOR_SHARING=SIMILAR OPEN_CURSORS=300 # Diagnostics and Statistics BACKGROUND_DUMP_DEST=/u01/oracle10g/admin/rjbdb/bdump CORE_DUMP_DEST=/u01/oracle10g/admin/rjbdb/cdump TIMED_STATISTICS=TRUE USER_DUMP_DEST=/u01/oracle10g/admin/rjbdb/udump # Control File Configuration 第 1 章 Oracle 体系结构概述 57 CONTROL_FILES=(/u01/oracle10g/prod/rjbdb/control01.ctl, /u02/oracle10g/prod/rjbdb/control02.ctl, /u03/oracle10g/prod/rjbdb/control03.ctl) # Archive LOG_ARCHIVE_DEST_1='LOCATION=/u06/oracle10g/oradata/rjbdb/archive' # New log archive format. If compatibility 10.0 and up, # this is enforced. LOG_ARCHIVE_FORMAT=%t_%s_%r.dbf # The following parameter is deprecated in 10iR1 # LOG_ARCHIVE_START=TRUE # Shared Server # Starts shared server if set > 0. SHARED_SERVERS=2 # Uncomment and use first DISPATCHERS parameter # below when your listener is # configured for SSL # (listener.ora and sqlnet.ora) # DISPATCHERS = "(PROTOCOL=TCPS)(SER=MODOSE)", # "(PROTOCOL=TCPS)(PRE=oracle.aurora.server.SGiopServer)" DISPATCHERS="(PROTOCOL=TCP)(SER=MODOSE)", "(PROTOCOL=TCP)(PRE=oracle.aurora.server.SGiopServer)", (PROTOCOL=TCP) # Miscellaneous COMPATIBLE=10.0.0 DB_NAME=rjbdb # Distributed, Replication and Snapshot DB_DOMAIN=rjbdba.com REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE # Network Registration INSTANCE_NAME=rjbdb # Pools JAVA_POOL_SIZE=31457280 LARGE_POOL_SIZE=1048576 SHARED_POOL_SIZE=52428800 # Processes and Sessions PROCESSES=150 # Redo Log and Recovery FAST_START_MTTR_TARGET=300 # Resource Manager RESOURCE_MANAGER_PLAN=SYSTEM_PLAN # Sort, Hash Joins, Bitmap Indexes SORT_AREA_SIZE=524288 # Automatic Undo Management 第Ⅰ部分 数据库体系结构 58 UNDO_MANAGEMENT=AUTO UNDO_TABLESPACE=undotbs (5) 使用 SQL*Plus 连接到实例,如下所示: sqlplus /nolog connect SYS/ password as sysdba 注意,当实例本身存在时,则不能对其进行操作,因为还没有启动数据库。 (6) 创建服务器参数文件(SPFILE)。如果初始文件在默认位置中,下面的命令将创建 SPFILE: create spfile from pfile; (7) 使用下面的命令启动实例: startup nomount 注意,因为还没有创建数据库,当前只有使用 startup 命令。 (8) 提交 create database 语句。下面是具体示例: CREATE DATABASE rjbdb USER SYS IDENTIFIED BY paris703 USER SYSTEM IDENTIFIED BY tyler12 LOGFILE GROUP 1 ('/u02/oracle10g/oradata/rjbdb/redo01.log') SIZE 100M, GROUP 2 ('/u04/oracle10g/oradata/rjbdb/redo02.log') SIZE 100M, GROUP 3 ('/u06/oracle10g/oradata/rjbdb/redo03.log') SIZE 100M MAXLOGFILES 5 MAXLOGMEMBERS 5 MAXLOGHISTORY 1 MAXDATAFILES 100 MAXINSTANCES 1 CHARACTER SET US7ASCII NATIONAL CHARACTER SET AL16UTF16 DATAFILE '/u01/oracle10g/oradata/rjbdb/system01.dbf' SIZE 325M REUSE EXTENT MANAGEMENT LOCAL SYSAUX DATAFILE '/u01/oracle10g/oradata/rjbdb/sysaux01.dbf' SIZE 325M REUSE DEFAULT TABLESPACE tbs_1 DEFAULT TEMPORARY TABLESPACE tempts1 TEMPFILE '/u01/oracle10g/oradata/rjbdb/temp01.dbf' SIZE 20M REUSE UNDO TABLESPACE undotbs DATAFILE '/u02/oracle10g/oradata/rjbdb/undotbs01.dbf' SIZE 200M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED; (9) 该示例中有些事情不值得做。我们显式设置了 SYS 和 SYSTEM 的密码,如果在这儿 没有指定,则它们将分别默认为 change_on_install 和 manager。 (10) 每个重做日志文件组只有一个成员,一旦产生数据库,应该多路传输这些重做日志文 件组。因为使用初始参数文件中的 UNDO_TABLESPACE 参数指定了撤销表空间,需 要在这儿创建该表空间,否则实例将不会启动。 第 1 章 Oracle 体系结构概述 59 (11) 在 create database 命令成功完成后,打开该数据库。 (12) 为用户、索引和应用程序创建额外的表空间。 (13) 使用提供的脚本 catalog.sql 和 catproc.sql 构建数据字典视图。脚本 catalog.sql 根据数 据字典表、动态性能视图和大多数视图的公有同义词创建视图。对组 PUBLIC 授予视 图的只读访问。脚本 catproc.sql 建立 PL/SQL。 (14) 使用冷备份或恢复管理器备份数据库。如果在部署的早期阶段产生数据库故障,您可 以有完整的、正在运行的数据库来后退到产生故障的位置,而不必从头开始重新创建 数据库。
还剩56页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 6 金币 [ 分享pdf获得金币 ] 2 人已下载

下载pdf

pdf贡献者

li_mj77

贡献于2012-11-24

下载需要 6 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf