Oracle 数据库实例简介
数据库实例是一组用于管理数据库文件的内存结构。
数据库是一组由 CREATE DATABASE 语句在磁盘上创建的物理文件。由实例管理其关联的数据,并为数据库用户提供服务。
每个正在运行的 Oracle 数据库至少与一个 Oracle 数据库实例相关联。因为实例存在于内存中,而数据库存在于磁盘上,所以实例可以在没有数据库时而存在,数据库也可以在没有实例时存在。
Oracle 实例结构
当实例启动时,Oracle 数据库分配一个叫做系统全局区(SGA)的内存区域,并启动一个或多个后台进程。
SGA 用于以下几个目的:
- 维护由很多进程和线程同时访问的内部数据结构
- 缓存从磁盘中读取的数据块
- 缓冲重做数据,然后再将其写入联机重做日志文件
- 存储 SQL 执行计划
SGA 由运行在一台单一计算机上的多个 Oracle 进程共享,包括服务器进程和后台进程。Oracle 进程与 SGA 相关联的方式会因不同的操作系统而有所不同。
数据库实例包括多个后台进程。服务器进程和在这些的进程中分配的进程内存也存在于实例中。当服务器进程终止时,实例仍会继续运行。
下图显示 Oracle 数据库实例的主要组件。
数据库实例配置
Oracle 数据库运行在单实例配置或 Oracle 实际应用程序集群(Oracle RAC)配置中。这些配置是互斥的。
在单实例配置中,数据库和实例之间存在一对一关系。在 Oracle RAC 中,数据库与实例之间存在一对多关系。
下图显示了这两种可能的数据库实例配置。
无论是在单实例还是在 Oracle RAC 配置中,一个数据库实例在同一时刻只与一个数据库相关联。您可以启动一个实例,并装载(与实例相关联)一个数据库,但不能同时将两个数据库装载到同一实例。
在同一台计算机上可以同时运行多个实例,每个实例访问其自己的数据库。例如,一台计算机可以承载两个完全不同的数据库:prod1 和 prod2。一个数据库实例管理 prod1,而另一个实例管理 prod2。
读/写实例和只读实例
每个数据库实例都是读/写或只读的。
默认的读/写数据库实例可以处理 DML,并支持来自客户机应用程序的直接连接。相反,只读数据库实例可以处理查询,但不支持修改 DML(更新、删除、插入和合并)或直接客户机连接。
在以前的版本中,所有数据库实例(除非访问了备用数据库)都是读/写的。从 Oracle Database 12c Release 2(12.2)开始,只读和读/写实例可以在一个数据库中共存。这种配置对于同时查询和修改数据的并行 SQL 语句非常有用,因为读/写和只读实例都可以查询,而读/写实例可以修改。
与读/写实例不同,只读实例具有以下特征:
- 只能打开已被读/写实例打开的数据库
- 禁用许多后台进程,包括不需要的检查点和归档进程
- 可以挂载一个禁用的重做线程或一个没有任何 online redo log 的线程
要将实例指定为只读,请将 INSTANCE_MODE 初始化参数设置为 READ_ONLY。参数的默认值是 READ_WRITE。
实例的持续时间
实例在使用 STARTUP 命令创建时开始,在终止时结束。
这此期间,实例能且只能与一个数据库相关联。此外,该实例只能装载数据库一次,关闭数据库一次、打开数据库一次。在数据库已关闭后,您必须启动一个不同实例来装载并打开此数据库。
下表说明了一个数据库实例试图重新打开一个之前已关闭的数据库。
语句 | 说明 |
---|---|
|
STARTUP 命令创建一个实例,它会装载并打开数据库。 |
JUN-18-14 13:14:48
|
此查询显示当前实例的启动时间。 |
|
在这一阶段,唯一选择的是关闭实例,结束此实例的生命周期。 |
|
STARTUP 命令创建一个新的实例,装载并打开数据库。 |
JUN-18-14 13:16:40
|
此查询显示当前实例的启动时间。不同的开始时间显示此实例不同于之前已关闭数据库的那个实例。 |
数据库实例标识符
多个数据库实例可以驻留在一个主机上。因此,必须有指定要访问哪个实例的方法。
Oracle Optimal Flexible Architecture (OFA)规则是一组配置指导原则,用于确保Oracle的安装组织良好。本节中的示例采用了OFA体系结构。
Oracle Base 目录
Oracle Base 目录存储 Oracle 产品的二进制文件。
Oracle Base 目录是 Oracle 数据库安装所有者的数据库主目录。主机上可以安装许多 Oracle 数据库,也可以安装许多 Oracle 数据库软件。
下面的例子显示了操作系统用户帐户 Oracle 的 Base 基本目录:
/u01/app/oracle
在前面的路径中,/u01/ 是挂载点,/u01/app/ 是应用软件的子树。
Oracle Home 目录
Oracle Home 是 Oracle 数据库的软件位置。
必须为每次 Oracle 数据库软件的新安装指定一个新的 Oracle 主目录。默认情况下,Oracle 主目录是 Oracle Base (ORACLE_BASE)目录树中的派生目录。
您可以在同一台主机上,在同一个 Oracle 库中的不同 Oracle 主目录中,不止一次地安装这个版本,或者数据库软件的早期版本。不同版本、不同用户帐户拥有的多个数据库可以同时共存。
下面的示例显示了三个不同 Oracle Home 的完整路径名,它们都位于相同的 Oracle Base 目录 /u01/app/oracle/ 中:
/u01/app/oracle/product/12.1.0/dbhome_1
/u01/app/oracle/product/12.1.0/dbhome_2
/u01/app/oracle/product/18.0.0/dbhome_1
Oracle Base (/u01/app/oracle/) 后面的路径名部分包括产品发布号(例如 12.1.0)和 Oracle Home 相对应的目录(例如 dbhome_1)。/u01/app/oracle/product/12.1.0/ 目录包含两个单独的 Oracle Home: dbhome_1 和 dbhome_2。
从 Oracle Database 18c 开始,您可以创建一个只读 Oracle Home 作为软件映像。只读 Oracle Home 存储二进制文件等静态文件。Oracle Base Home (ORACLE_BASE_HOME)目录位于 ORACLE_BASE/homes/home_name 中,它存储特定于 Oracle Home 的动态文件。Oracle Base 配置目录(ORACLE_BASE_CONFIG)存储特定于实例的动态文件,它由 Oracle Base 中的所有 Oracle Base 共享。
在下面的例子中,第一个路径是只读 Oracle Home,第二个路径是这个 Oracle Home 的 Oracle Base Home:
/u01/app/oracle/product/18.0.0/ro_dbhome_1
/u01/app/oracle/homes/ro_dbhome_1
Oracle 系统标识符 (SID)
系统标识符 (SID) 是特定主机上的某个 Oracle 数据库实例的唯一名称。
在 UNIX 及 Linux 上,Oracle 数据库使用 SID 和 Oracle Home 的值来创建一个指向共享内存的键。此外,SID 在默认情况下用于定位参数文件,并使用参数文件来进一步定位其它相关文件,如数据库控制文件等。
在大多数的平台上,由 ORACLE_SID 环境变量设置 SID,而 ORACLE_HOME 变量设置 Oracle Home。当客户端要连接到实例时,可以在 Oracle Net 连接中指定 SID,或使用网络服务名称。Oracle 数据库将服务名称转换为一个 ORACLE_HOME 和 ORACLE_SID 。
传统的读写 Oracle Home 包含特定于实例的文件。但是,当 Oracle Home 是只读时,特定于实例的文件单独存储在 Oracle Base 中。在这两种情况下,名称包含 SID 的文件都位于 Oracle 基本配置目录(ORACLE_BASE_CONFIG)的 dbs 子目录中。由于这种分离,用户可以使用现有只读 Oracle Home 中的软件创建数据库,然后使用新的只读 Oracle Home 中的软件启动该数据库的实例。
实例启动和关闭概述
数据库实例提供了用户对数据库的访问。实例和数据库可以处于不同的状态。
实例和数据库启动概述
典型的,您手动启动一个实例,然后装载并打开数据库,使其对用户可用。您可以使用 SQL*Plus 的 STARTUP 命令、Oracle 企业管理器(企业管理器)、或 SRVCTL 实用程序来执行这些步骤。
使用 Oracle Net 开启数据库实例,以下情况必须属实:
- 数据库被一个 Oracle Net 监听器静态注册。
- 您的客户机使用 SYSDBA 权限连接到数据库。
监听器创建一个专用服务器,该服务器可以启动数据库实例。
下图显示了数据库从关闭状态一步步推进到打开的状态。
当数据库从关闭状态推进到打开状态时,会经历以下几个阶段:
阶段 | Mount 状态 | 描述 | 详见 |
---|---|---|---|
1 | 启动实例,但未装载数据库 | 实例已启动,但尚未与某个数据库相关联。 | “How an Instance Is Started” |
2 | mount 数据库 | 实例已启动,并且通过读取控制文件,来与数据库相关联。数据库对用户是关闭的。 | “How a Database Is Mounted” |
3 | 打开数据库 | 实例已启动,并与一个打开的数据库相关联。授权的用户可以访问数据文件中包含的数据。 | “How a Database Is Opened” |
具有管理员权限的连接
数据库启动和关闭是功能强大的管理选项,仅限于能以管理员权限连接到 Oracle 数据库的用户来使用。
一般用户对 Oracle 数据库的当前状态不具有控制权。取决于不同的操作系统,使用下列条件之一来建立用户的管理员权限:
- 用户的操作系统权限使其能够使用管理员权限来连接。
- 用户被授予了特殊的系统权限,数据库通过网络使用密码文件对数据库管理员进行身份验证。
如下特殊的系统权限允许进入数据库实例,尽管数据库没有打开:
- SYSDBA
- SYSOPER
- SYSBACKUP
- SYSDG
- SYSKM
对上述权限的控制位于数据库本身之外。当您使用 SYSDBA 系统权限连接到数据库时,您处于 SYS 拥有的模式中。当您作为 SYSOPER 连接时,您处于公共模式中。SYSOPER 权限是 SYSDBA 权限的子集。
实例是如何启动的
当 Oracle 数据库启动一个实例时,它是分阶段进行的。
各阶段如下:
- 在特定于平台的默认位置搜索服务器参数文件,如果未找到 ,则搜索一个初始化参数文本文件(为 STARTUP 指定 SPFILE 或 PFILE 参数将覆盖该默认行为)
- 读取参数文件,以确定初始化参数值
- 基于初始化参数设置,分配 SGA
- 启动 Oracle 后台进程
- 打开警报日志和跟踪文件,并以有效的参数语法将所有显式参数设置写入警报日志中
这一阶段还没有数据库与该实例相关联。需要 NOMOUNT 状态的场景包括创建数据库和某些备份与恢复操作。
数据库是如何装载的
由实例装载数据库,以将数据库与该实例相关联。
为装载数据库,该实例获取由 CONTROL_FILES 初始化参数指定的数据库控制文件名称,并打开文件。Oracle 数据库读取控制文件,以查找数据文件和联机重做日志文件的名称,当打开数据库时,它会尝试访问这些文件。
在一个已装载的数据库中,该数据库是关闭的,且只有数据库管理员可以访问。管理员可以在完成某些特定的维护操作时保持数据库关闭。但是,数据库此时还不可用于常规操作。
如果 Oracle 数据库允许多个实例同时装载同一数据库,则 CLUSTER_DATABASE 初始化参数设置可以使数据库可用于多个实例。数据库的行为取决于其设置:
- 如果装入数据库的第一个实例的 CLUSTER_DATABASE 为 false(默认),则仅此实例可以装入数据库。
- 如果第一个实例的 CLUSTER_DATABASE 为 true,则其他实例在其 CLUSTER_DATABASE 参数也设置为 true 时可以装载数据库。可以装载数据库的实例数量决定于在创建数据库时指定的预定最大值。
数据库是如何打开的
打开一个已装载的数据库,使其可用于常规的数据库操作。
任何有效的用户可以连接到打开的数据库,并访问其信息。通常,由数据库管理员打开数据库,使其可用于一般用途。
在打开数据库时,Oracle 数据库执行下列操作:
- 打开除撤消表空间之外的其他的表空间中的联机数据文件
如果在之前数据库关闭时,某个表空间是脱机的,则该表空间及其相应的数据文件,在重新打开数据库时,仍将处于脱机状态。 - 获取一个撤消表空间
如果存在多个撤消表空间,则由 UNDO_TABLESPACE 初始化参数指定要使用的撤消表空间。如果尚未设置此参数,则会选择第一个可用的撤消表空间。 - 打开联机重做日志文件
只读模式
默认情况下,数据库打开为读/写模式。在这种模式下,用户可以对数据作出更改,并在联机重做日志中生成重做。或者,也可以打开为只读模式,以防止数据被用户事务修改。
只读模式限制数据库访问只能为只读事务,也就无法写入到数据文件或联机重做日志文件。但是,数据库能执行恢复,或更改数据库状态但不生成重做的操作。例如,在只读模式:
- 数据文件可以被脱机和联机。但是,你不能将永久表空间脱机。
- 脱机数据文件和表空间是可以恢复的
- 控制文件仍然可用,以更新有关数据库的状态。
- 使用 CREATE TEMPORARY TABLESPACE 语句创建的临时表空间是可读/写的。
- 可以继续往操作系统写入审计文件、跟踪文件、和警报日志。
数据文件检查
当实例尝试打开数据库时,如果任何数据文件或重做日志文件不存在,或者虽然文件存在,但一致性测试失败,则数据库将返回一个错误。此时可能需要介质恢复。
数据库和实例关闭概述
举一个典型的使用案例,您手动关闭数据库以执行维护或其他管理任务,这将使数据库对用户不可用。您可以使用 SQL*Plus 的 SHUTDOWN 命令或企业管理器来执行这些步骤。
下图显示从打开状态推进到一致关闭的过程。
当一致地关闭打开的数据库时,Oracle 数据库自动执行以下步骤。
阶段 | Mount 状态 | 描述 | 详见 |
---|---|---|---|
1 | 数据库关闭 | 数据库仍处于装载状态,但数据文件和联机重做日志文件已被关闭。 | “How a Database Is Closed” |
2 | 数据库 umount | 实例仍处于启动状态,但已不再与数据库的控制文件相关联。 | “How a Database Is Unmounted” |
3 | 数据库实例关闭 | 数据库实例不再处于启动状态。 | “How an Instance Is Shut Down” |
当实例失败或遭遇 SHUTDOWN ABORT 时,Oracle 数据库不会经历之前这些所有步骤,而只是立即终止该实例。
关闭模式
具有 SYSDBA 或 SYSOPER 权限的数据库管理员,可以使用 SQL*Plus 的 SHUTDOWN 命令或企业管理器来关闭数据库。SHUTDOWN 命令有几个决定关闭行为的选项。
下表总结了在各种不同关闭模式下的行为。
数据库行为 | ABORT | IMMEDIATE | TRANSACTIONAL | NORMAL |
---|---|---|---|---|
允许新用户连接 | 否 | 否 | 否 | 否 |
将等待,直到当前会话结束 | 否 | 否 | 否 | 是 |
将等待,直到当前事务结束 | 否 | 否 | 是 | 是 |
执行一个检查点,并关闭打开的文件 | 否 | 是 | 是 | 是 |
可能的几种 SHUTDOWN 语句选项是:
- SHUTDOWN ABORT
此模式用于紧急情况,如其他形式的关闭方式都未能成功时。这种模式的关闭是最快的。但是,随后打开该数据库可能时间会显著增加,因为必须执行实例恢复以使数据文件一致。
因为 SHUTDOWN ABORT 不对打开的数据文件执行检查点操作,所以在重新打开数据库之前,必须进行实例恢复。对于其他的关闭模式,在数据库重新打开之前不需要进行实例恢复。 - SHUTDOWN IMMEDIATE
这种模式通常是除 SHUTDOWN ABORT 之外最快的关闭模式了。Oracle 数据库终止任何正在执行的 SQL 语句,并断开用户连接。所有活动事务都将终止,并回滚所有未提交的更改。 - SHUTDOWN TRANSACTIONAL
这种模式可以防止用户启动新事务,但在关闭之前会等待所有的当前事务完成。这种模式可能会花费相当长的时间,这取决于当前事务的特征。 - SHUTDOWN NORMAL
这是默认的关闭模式。在关闭之前数据库会等待所有连接的用户断开连接。
数据库是如何关闭的
数据库的关闭操作是在数据库停机中的一个隐含步骤。该操作的性质取决于数据库停机是正常还是非正常的。
正常停机过程中是如何关闭数据库的
当数据库作为 SHUTDOWN 的一部分(不使用 ABORT 选项)而关闭时,Oracle 数据库将 SGA 中的数据写入数据文件和联机重做日志文件。
之后,数据库关闭联机数据文件和联机重做日志文件。脱机表空间中的任何脱机数据文件是本来就是已关闭的。当重新打开数据库时,任何本来脱机的空间仍然保持脱机状态。
这一阶段中,该数据库是关闭的,且无法进行正常操作访问。在数据库关闭后,控制文件仍保持打开状态。
非正常关机过程中是如何关闭数据库
如果执行了 SHUTDOWN ABORT,或出现异常终止,则打开数据库的实例会关闭,并在瞬间将数据库停机。
非正常关机时,Oracle 数据库不会将 SGA 缓冲区中的数据写入数据文件和重做日志文件。随后重新打开数据库需要实例恢复,这将由 Oracle 数据库自动执行。
数据库是如何卸载的
数据库关闭之后,Oracle 将数据库卸载,并解除与实例的关联。
数据库卸载后,Oracle 数据库关闭数据库的控制文件。这个时候,实例仍将保留在内存中。
实例是如何关闭的
关闭数据库的最后一步是关闭实例。当数据库实例关闭时,SGA 被从内存中移除,且后台进程都将被终止。
在异常情况下,实例可能并未干净地关闭。内存结构可能未从内存中删除,或某个后台进程可能未被终止。当之前的实例存在残留物时,后续的实例启动可能会失败。在这样的情况下,为强制启动一个新实例,您可以通过删除之前实例的残留物并启动一个新实例、或发出 SHUTDOWN ABORT 语句。
在某些情况下,进程清理本身可能会遇到错误,这可能导致进程监视器(PMON)或实例的终止。动态初始化参数 INSTANCE_ABORT_DELAY_TIME 指定延迟内部生成的实例失败的时间。这种延迟给了你一个回应的机会。当延迟终止启动时,数据库将向警报日志写入一条消息。在某些情况下,通过允许隔离某些数据库资源,实例可以避免终止。
检查点概述
检查点是进行一致的数据库关闭、实例恢复、和 Oracle 数据库通用操作的关键机制。
术语具有如下相关含义:
- 指示检查点位置的一个数据结构,该位置是在重做流中实例恢复必须开始处的 SCN
检查点位置是由数据库缓冲区高速缓存中最旧的脏缓冲区来确定的。检查点位置作为一个指向重做流的指针,并存储在控制文件中,和在每个数据文件头中。 - 将数据库缓存中已修改的数据库缓冲区写入到磁盘中
检查点的目的
Oracle 数据库使用检查点来实现多个目标。
目标包括:
- 减少实例失败或介质故障情况下恢复所需的时间
- 确保数据库定期将缓冲区缓存中的脏缓冲区写入磁盘
- 确保数据库在一致关闭过程中将所有已提交的数据写入磁盘
Oracle 数据库何时启动检查点
检查点进程(CKPT)负责将检查点写入数据文件头和控制文件。
检查点会在多种情况下发生。例如,Oracle 数据库使用以下类型的检查点:
- 线程检查点
数据库将某个确定目标之前、被某个特定的重做线程所修改的所有缓冲区写入磁盘。数据库中所有实例的线程检查点的集合即为数据库检查点。线程检查点在下列情况下发生:- 一致的数据库关闭
- ALTER SYSTEM CHECKPOINT 语句
- 联机重做日志切换
- ALTER DATABASE BEGIN BACKUP 语句
- 表空间和数据文件的检查点
数据库将某个确定目标之前、被重做线程所修改的所有缓冲区写入磁盘。表空间检查点是一组数据文件检查点,每个数据文件检查点对表空间中的某个数据文件做检查点操作。这些检查点发生在很多情况下,包括将一个表空间变为只读、将表空间脱机、收缩数据文件、或执行 ALTER TABLESPACE BEGIN BACKUP 等。 - 增量检查点
增量检查点是一种线程检查点,部分原因是为了避免在联机重做日志切换时写入大量的块。DBWn 至少每隔三秒会进行检查以确定是否有工作要做。当 DBWn 将脏缓冲区写入磁盘时, 它会向前推进检查点位置,导致 CKPT 将检查点位置写入控制文件,而不是数据文件头。
其他类型的检查点包括实例和介质恢复检查点,和删除或截断模式对象时的检查点。
实例恢复概述
实例恢复是将联机重做日志中的记录应用到数据文件,以重建最近检查点之后所做更改的过程。
当管理员尝试打开一个之前以不一致方式关闭的数据库时,会自动执行实例恢复。
实例恢复的目的
实例恢复可确保数据库在一个实例失败后仍能回到一个一致的状态。由于 Oracle 数据库对数据文件更改的管理方式所致,数据库的文件可以处于不一致的状态。
redo 线程是对实例生成的所有更改的记录。单实例数据库拥有一个 redo 线程,而一个 Oracle RAC 数据库拥有多个 redo 线程——每个数据库实例有一个。
当事务提交时,日志写入器 (LGWR) 将内存中的重做条目和事务 SCN 同时写入联机重做日志。但是,数据库写入器 (DBWn) 进程只在最有利的时机将已修改的数据块写入数据文件。由于这个原因,未提交的更改可能会暂时存在于数据文件中,而已提交的更改也可能还不在数据文件中。
如果某个打开的数据库的实例失败,或者由于 SHUTDOWN ABORT 语句或异常终止,则可能会导致下列情况:
- 由某事务已提交的数据块更新还未写入数据文件,而仅写入了联机重做日志中。这些更改必须重新应用到数据库。
- 数据文件包含实例失败时尚未提交的更改。这些更改必须回滚,以确保事务一致性。
实例恢复只使用联机重做日志文件和当前在线的数据文件,以同步数据文件,并确保它们一致。
Oracle 数据库何时执行实例恢复
是否需要实例恢复取决于重做线程的状态。
在数据库实例被打开为读/写模式时,重做线程在控制文件中被标记为打开,而当实例被一致关闭时,重做线程被标记为关闭。如果重做线程在控制文件中被标记为打开,但没有活动的实例持有对应于这些线程的线程队列,则数据库将需要实例恢复。
Oracle 数据库在以下情况下自动执行实例恢复:
- 单实例数据库或 Oracle RAC 数据库的所有实例失败后第一次打开数据库。这种形式的实例恢复也称为崩溃恢复。Oracle 数据库一起恢复所有已终止实例的联机重做线程。
- 只是 Oracle RAC 数据库中的某些、但不是所有实例失败。实例恢复将由配置中的某个存活实例自动进行。
SMON 后台进程自动执行实例恢复并应用联机重做记录。而不需要任何用户干预。
实例恢复检查点的重要
实例恢复使用检查点来确定必须将哪些更改应用到数据文件。检查点位置始终保证所有比其 SCN 低的检查点所对应的已提交更改都已保存到数据文件。
下图描述了联机重做日志中的重做线程。
实例恢复期间,数据库必须应用检查点位置和重做线程结尾之间发生的更改。如图 13-5 所示,某些更改可能已经写入数据文件。但是,只有其 SCN 低于检查点位置的更改,才保证已被写到了磁盘上。
实例恢复阶段
实例恢复的第一阶段称为缓存恢复或前滚,这涉及将联机重做日志中记录的所有更改重新应用到数据文件。
因为回滚数据记录在联机重做日志中,前滚也会重新生成相应的撤消段。前滚会遍历各个必要的联机重做日志,以将数据库推进到一个更前的一致时间点。前滚之后,数据块包含记录在联机重做日志文件中的所有已提交更改。这些文件可能还包含未提交的更改,要么是在实例失败前保存到数据文件中的,或者是在缓存恢复过程中引入的。
前滚之后,任何未提交的更改必须被撤消。Oracle 数据库使用检查点位置,保证每个低于其 SCN 的已提交更改都已保存到磁盘。Oracle 数据库应用撤消块,以回滚数据块中在实例失败前写入的或缓存恢复过程中引入的未提交更改。这一阶段称为回滚或事务恢复。
下图说明了前滚和回滚,这是恢复数据库实例失败的两个必要步骤。
Oracle 数据库可以根据需要同时回滚多个事务。实例失败时的所有活动事务被标记为终止。新事务可以自己回滚个别块以获取所需的数据,而不必等待 SMON 进程来回滚这些已终止的事务。
参数文件的概述
要启动数据库实例,Oracle 数据库必须读取一个(推荐的)服务器参数文件或一个(传统的)文本初始化参数文件。这些文件包含配置参数的列表。
要手动创建一个数据库,必须用一个参数文件启动实例,然后发出 CREATE DATABASE 命令。因此,即使数据库本身还不存在,实例和参数文件即可以存在。
初始化参数
初始化参数是会影响实例基本操作的配置参数。实例在启动时从一个文件读取初始化参数。
Oracle 数据库提供了许多初始化参数,以优化其在不同环境中的操作。只需要显式设置几个参数,因为其默认值通常情况下是足够的。
初始化参数的功能分组
初始化参数分为不同的功能组。
大多数初始化参数属于以下一组:
- 名字条目参数,如文件或目录
- 限制设置参数,如进程、数据库资源、或数据库本身等
- 影响容量的参数,如 SGA 的大小(这些参数也称为可变参数)
数据库管理员可能会对可变参数特别感兴趣,因为他们可以使用这些参数来提高数据库性能。
基本和高级的初始化参数
初始化参数可以分为两组:基本的和高级的。
通常,你只需设置和调整大约 30 个基本参数,就可以获得还不错的性能。基本参数设置的特性包括数据库名称、控制文件的位置、数据库的块大小和撤消表空间等。
在某些情况下,为获得最佳性能,可能需要修改高级参数。启用高级参数可以使专家级 DBA 能够调整 Oracle 数据库以满足某些特殊需求。
Oracle 数据库软件自带的初始化参数文件提供了一些初级参数值,或者你也可以通过数据库配置助手来产生这些值。您可以编辑这些 Oracle 提供的初始化参数并添加其他参数,这取决于您的配置,以及你计划如何优化数据库。对于初始化参数文件中不包含的有关参数,Oracle 数据库提供默认值。
服务器参数文件
服务器参数文件是初始化参数的一个存储库。
服务器参数文件具有以下主要特征:
- 只有 Oracle 数据库能读写服务器参数文件。
- 对于一个数据库,只存在一个服务器参数文件。此文件必须驻留在数据库主机上。
- 务器参数文件是二进制的,且不能使用文本编辑器修改。
- 存储在服务器参数文件中的初始化参数是永久性的。数据库实例正在运行时对参数所做的任何更改,可以跨实例关闭和启动而存在。
服务器参数文件消除了为多个客户端应用程序维护多个文本初始化参数文件的需要。服务器参数文件最初可以从一个文本初始化参数文件,使用 CREATE SPFILE 语句来生成。也可以直接由数据库配置助手创建。
文本初始化参数文件
文本初始化参数文件是一个文本文件,其中包含初始化参数的列表。
这是一种旧式参数文件,具有以下关键特征:
- 当启动或关闭数据库时,文本初始化参数文件必须驻留在连接到该数据库的客户端应用程序相同的主机上。
- 文本初始化参数文件是基于文本的,而非二进制。
- Oracle 数据库可以读取,但不能写入文本初始化参数文件。若要更改参数值,必须使用文本编辑器手动更改文件。
- 通过 ALTER SYSTEM 对初始化参数值所做的更改,仅在当前实例中有效。您必须手动更新文本初始化参数文件,并重新启动实例以使更改生效。
文本初始化参数文件包含一系列 key=value 对,每行一个。例如,某个初始化参数文件中的一部分看起来如下所示:
db_name=sample
control_files=/disk1/oradata/sample_cf.dbf
db_block_size=8192
open_cursors=52
undo_management=auto
shared_pool_size=280M
pga_aggregate_target=29M
.
.
.
为了说明文本参数文件可能产生的可管理性问题,假定您使用计算机 clienta 和 clientb,并且必须能够从其中任何一台计算机上使用 SQL*Plus 启动数据库。在这种情况下,必须存在两个独立的文本初始化参数文件,每台计算机上一个,如图 13-7 所示。服务器参数文件解决了分散的参数文件问题。
修改初始化参数的值
您可以修改初始化参数,以调整数据库行为。将其按静态或动态参数的分类,确定了应如何修改它们。
下表总结了的其中的差异。
特征 | 静态 | 动态 |
---|---|---|
需要修改(文本或服务器)参数文件 | 是 | 否 |
在设置生效之前数据库实例需要重启 | 是 | 否 |
在 《Oracle Database Reference》 初始化参数条目中被描述为可修改 | 否 | 是 |
仅对数据库或实例可修改 | 是 | 否 |
静态参数包括 DB_BLOCK_SIZE、DB_NAME 、和 COMPATIBLE 等。动态参数可分为会话级参数和系统级参数,会话级参数只影响当前的用户会话,而系统级参数影响数据库及所有会话。例如,MEMORY_TARGET 是一个系统级参数,而 NLS_DATE_FORMAT 是一个会话级参数。
参数更改的范围取决于更改何时生效。若实例是用服务器参数文件启动的,则可以使用 ALTER SYSTEM SET 语句更改系统级参数的值,如下所示:
- SCOPE=MEMORY
更改只应用于数据库实例。如果数据库关闭并重新启动,更改将不会保留。 - SCOPE=SPFILE
更改应用于服务器参数文件,但不会影响当前实例。因此,所做的更改不会生效,直到重新启动该实例。 - SCOPE=BOTH
Oracle 数据库将更改写入内存和服务器参数文件。当数据库使用服务器参数文件时,这是默认的范围。
数据库会在警报日志中输出初始化参数的旧值和新值。作为一项预防措施,数据库会验证对基本参数的更改,以防止非法值被写入到服务器参数文件中。
诊断文件概述
Oracle 数据库包括一个故障可诊断性基础设施,以预防、检测、诊断、并解决各种数据库问题。这些问题包括如代码错误、元数据损坏和客户数据损坏等严重错误。
这个先进的故障可诊断性基础设施的目标如下:
- 主动检测问题
- 在检测到问题后,限制破坏和中断
- 减少问题诊断和解决时间
- 通过支持对跟踪文件进行分区、允许用户定义每个块的大小和要保留的最大块数,以及在达到用户指定的磁盘空间限制后禁用跟踪,从而改进了可管理性
- 简化客户与 Oracle 支持的交互
自动诊断存储库
自动诊断存储库(ADR)是一个基于文件的存储库,存储了如跟踪文件、警报日志和健康监测报告等数据库诊断数据。
ADR 的关键特征包括:
- 统一的路径结构
- 一致的诊断数据格式
- 统一的工具集
上述特性使得客户和 Oracle 支持部门能跨多个 Oracle 实例、组件、和产品对诊断数据进行关联和分析。
ADR 处于数据库之外,这使得即便物理数据库不可用时,也可以访问和管理 ADR。在创建数据库之前,其实例就可以创建 ADR。
问题和事件
ADR 主动跟踪数据库中的严重错误问题。
严重错误通常显示为内部错误,如 ORA-600 或其他严重错误。每个问题有一个问题键,它是一个描述此问题的文本字符串。
当一个问题出现多次时,ADR 为每次发生的错误创建一个带时间戳的事件。事件由一个数字事件 id 唯一标识。当事件发生时,ADR 发送一个事件警报到企业管理器中。对严重错误的诊断和解决,通常从一个事件警报开始。
因为一个问题可以在短时间内生成许多事件,ADR 在达到某些阈值时,将对事件生成应用防洪控制措施。防洪受控事件将生成一个警报日志条目,但不会生成事件转储。这样一来,ADR 会通知您正在发生一个严重错误,而不会在系统中产生过量诊断数据。
ADR 结构
ADR base 是 ADR 的根目录。
ADR base 可能包含多个 ADR home,每个 ADR home 是一个 Oracle 产品或组件实例的所有的诊断数据的根目录,包括跟踪、转储和警报日志等等。例如,在有共享存储和 Oracle ASM 的 Oracle RAC 环境中,每个数据库实例和每个Oracle ASM 实例都有自己的 ADR Home。
图 13-8 说明了数据库实例的 ADR 目录层次结构。其他 Oracle 产品或组件(如 Oracle ASM 或 Oracle 网络服务)的 ADR Home 也可以存在于此层次结构中,在相同的 ADR base 之下。
如下的 Linux 示例显示,当你在创建一个数据库之前,使用一个唯一的 SID 和数据库名称启动一个实例时,Oracle 数据库在主机文件系统中会将 ADR 默认创建为一个目录结构。SID 和数据库名称形成 ADR Home 中的文件路径名称的一部分。
例 13-1 创建 ADR
% setenv ORACLE_SID osi
% echo "DB_NAME=dbn" > init.ora
% sqlplus / as sysdba
.
.
.
Connected to an idle instance.
SQL> STARTUP NOMOUNT PFILE="./init.ora"
ORACLE instance started.
Total System Global Area 146472960 bytes
Fixed Size 1317424 bytes
Variable Size 92276176 bytes
Database Buffers 50331648 bytes
Redo Buffers 2547712 bytes
SQL> COL NAME FORMAT a21
SQL> COL VALUE FORMAT a60
SQL> SELECT NAME, VALUE FROM V$DIAG_INFO;
NAME VALUE
--------------------- --------------------------------------------------------
Diag Enabled TRUE
ADR Base /d1/3910926111/oracle/log
ADR Home /d1/3910926111/oracle/log/diag/rdbms/dbn/osi
Diag Trace /d1/3910926111/oracle/log/diag/rdbms/dbn/osi/trace
Diag Alert /d1/3910926111/oracle/log/diag/rdbms/dbn/osi/alert
Diag Incident /d1/3910926111/oracle/log/diag/rdbms/dbn/osi/incident
Diag Cdump /d1/3910926111/oracle/log/diag/rdbms/dbn/osi/cdump
Health Monitor /d1/3910926111/oracle/log/diag/rdbms/dbn/osi/hm
Default Trace File /d1/3910926111/oracle/log ... osi/trace/osi_ora_6825.trc
Active Problem Count 0
Active Incident Count 0
警报日志
每个数据库都有一个警报日志,它是一个 XML 文件,其中包含按时间排序的数据库信息和错误的日志。
警报日志的内容包括如下:
- 所有的内部错误 (ORA-600)、块损坏错误(ORA-1578)、和死锁错误 (ORA-60)
- 管理性操作,如 DDL 语句和 STARTUP、SHUTDOWN、ARCHIVE LOG 和 RECOVER 等 SQL*Plus 命令
- 几个与共享服务器和调度器进程的功能有关的消息和错误
- 物化视图自动刷新过程中的错误
Oracle 数据库使用警报日志作为在企业管理器 GUI 中显示信息的一种替代。如果管理操作成功,则 Oracle 数据库向警报日志写入一条带有时间戳的“已完成” 消息。
如图 13-8 所示,当您首次启动一个数据库实例,即使其数据库尚未创建,Oracle 数据库会在 alert 子目录中创建一个警报日志。这个文件是 XML 格式的。trace 子目录包含一个纯文本的警告日志,其中的一部分出现在下面的示例中:
Fri Nov 02 12:41:58 2014
SMP system found. enable_NUMA_support disabled (FALSE)
Starting ORACLE instance (normal)
CLI notifier numLatches:3 maxDescs:189
LICENSE_MAX_SESSION = 0
LICENSE_SESSIONS_WARNING = 0
Initial number of CPU is 2
Number of processor cores in the system is 2
Number of processor sockets in the system is 2
Shared memory segment for instance monitoring created
Picked latch-free SCN scheme 3
Using LOG_ARCHIVE_DEST_1 parameter default value as /disk1/oracle/dbs/arch
Autotune of undo retention is turned on.
IMODE=BR
ILAT =10
LICENSE_MAX_USERS = 0
SYS auditing is disabled
NOTE: remote asm mode is local (mode 0x1; from cluster type)
Starting up:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, Advanced Analytics and Real Application Testing options.
.
.
.
Using parameter settings in client-side pfile
System parameters with nondefault values:
processes = 100
sessions = 172
如例 13-1 所示,通过查询 V$DIAG_INFO 来定位警报日志。
DDL 日志
DDL 日志具有与告警日志相同的格式和基本行为,但只包含 DDL 语句和详细信息。数据库将 DDL 信息写入自己的文件,以减少告警日志中的混乱。
DDL 日志记录 DDL 文本,可以选择添加补充信息。每个 DDL 语句都有一条日志记录。DDL 日志存储在 ADR home 的 log/ddl 子目录中。
跟踪文件
跟踪文件是一个文件,其中包含用于调查问题的诊断数据。此外,跟踪文件也可以为优化应用程序或实例提供指导。
跟踪文件的类型
每个服务器和后台进程可以定期写入一个关联的跟踪文件。这些文件包括进程环境、状态、活动和错误等信息。
SQL 跟踪设施还会为单个 SQL 语句创建跟踪文件,以提供性能信息。可以通过各种方式启用对客户机标识符、服务、模块、操作、会话、实例或数据库的跟踪。例如,您可以在 DBMS_MONITOR 包或 set event 中执行适当的过程。
跟踪文件的位置
ADR 将跟踪文件存储在 trace 子目录中。跟踪文件的名称取决于其运行平台,并使用扩展名.trc。
通常,数据库后台进程的跟踪文件名称中包含 Oracle SID、后台进程名称和操作系统进程号。RECO 进程的跟踪文件的一个示例是 mytest_reco_10355.trc。
服务器进程跟踪文件名称包含 Oracle SID、字符串 ora 和操作系统进程号。服务器进程跟踪文件名称的一个示例是 mytest_ora_10304.trc。
有时跟踪文件有相应的跟踪位图 (.trm) 文件。这些文件包含跟踪文件的相关结构信息,并用于搜索和导航。
跟踪文件分割
当跟踪文件大小受到限制时,数据库可以自动将其最多分割为五个段。段是独立的文件,它们具有与活动跟踪文件相同的名称,但是附加了段号,如 ora_1234_2.trc 中所示。
每个段通常是 MAX_DUMP_FILE_SIZE 设置的限制的 20%。当所有段的合并大小超过限制时,数据库将删除最老的段(尽管从来没有删除第一个段,它可能包含关于进程初始状态的相关信息),然后创建一个新的空段。
诊断转储
诊断转储文件是一种特殊类型的跟踪文件,它包含关于状态或结构的详细时间点信息。
跟踪往往是诊断数据的连续输出。相反,转储通常是响应事件的诊断数据的一次性输出。
跟踪转储和事故
大多数转储都是由事故引起的。
当发生事故时,数据库将一个或多个转储写入为该事件创建的事故目录。事故转储还包含文件名中的事故号。
在事故创建期间,应用程序可以将堆或系统状态转储作为操作的一部分。在这种情况下,数据库将转储名称附加到事故文件名,而不是默认的跟踪文件名。例如,由于进程中的事故,数据库创建文件 prod_ora_90348.trc。事故中的转储生成文件 prod_ora_90348_incident_id.trc,其中 incident_id 是事件的数字 ID。作为事故的一部分创建的堆转储操作生成堆转储文件 prod_ora_90348_incident_id_dump_id。其中 dump_id 是跟踪转储的数字 ID。