PARTV-Oracle实例架构-Oracle数据库实例

13. Oracle数据库实例

13.1. Oracle数据库实例简介

数据库实例是一组内存结构,用于管理数据库文件。数据库是一组由CREATE DATABASE语句创建的磁盘上的物理文件。实例管理其关联的数据并服务于数据库的用户。

每个运行的Oracle数据库都至少与一个Oracle数据库实例相关联。由于实例存在于内存中,而数据库存在于磁盘上,因此实例可以不依赖数据库而存在,数据库也可以不依赖实例而存在。

13.1.1. 数据库实例结构

当实例启动时,Oracle数据库会分配一个名为系统全局区(SGA)的内存区域,并启动一个或多个后台进程。SGA有多种用途,包括以下内容:

  • 维护多个进程和线程同时访问的内部数据结构
  • 缓存从磁盘读取的数据块
  • 在写入在线重做日志文件之前缓冲重做数据
  • 存储SQL执行计划

SGA由Oracle进程共享,这些进程包括服务器进程和后台进程,运行在单个计算机上。Oracle进程与SGA的关联方式根据操作系统的不同而有所变化。

数据库实例包括后台进程。服务器进程以及在这些进程中分配的进程内存也存在于实例中。即使服务器进程终止,实例也会继续运行。图13-1显示了Oracle数据库实例的主要组成部分。

13.1.2. 数据库实例配置

您可以在以下两种互斥的配置中运行Oracle数据库:

  • 单实例配置:数据库与实例之间存在一对一的关系。
  • Oracle Real Application Clusters(Oracle RAC)配置:数据库与实例之间存在一对多的关系。图13-2显示了可能的数据库实例配置。

在单实例配置中,每个数据库仅由一个数据库实例管理。而在Oracle RAC配置中,一个数据库可以由多个实例共同管理,这些实例分布在不同的节点上,以提供高性能和高可用性。

无论是在单实例配置还是Oracle RAC配置中,数据库实例一次只能与一个数据库关联。您可以启动一个数据库实例并将其装载(与实例关联)到一个数据库上,但不能同时将同一个实例装载到两个数据库上。

注意:除非另有说明,本章讨论的是单实例数据库配置。

在同一台计算机上,可以同时运行多个实例,每个实例访问自己的数据库。例如,一台计算机可以托管两个不同的数据库:prod1和prod2。一个数据库实例管理prod1,而另一个独立的实例管理prod2。

13.1.2.1. 实例持续时间

一个实例在用STARTUP命令创建时开始,并在被终止时结束。在这段时间内,实例只能与一个数据库关联。此外,实例只能装载一次数据库,关闭一次数据库,并且只能打开一次数据库。在数据库被关闭或关闭后,您必须启动一个不同的实例来装载和打开这个数据库。
表13-1展示了数据库实例尝试重新打开它之前关闭的数据库。

13.1.2.2. 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。

13.2. 实例启动与关闭概述

数据库实例提供用户访问数据库的途径。本节解释了实例和数据库可能的状态。

13.2.1. 实例概述与数据库启动

在典型的用例中,您手动启动一个实例,然后装载并打开数据库,使其对用户可用。您可以使用SQL*Plus的STARTUP命令、Oracle Enterprise Manager(企业管理器)或SRVCTL实用程序来执行这些步骤。图13-3展示了数据库如何从关闭状态过渡到打开状态。

当数据库从关闭状态过渡到打开状态时,会经历以下阶段:

  1. 实例启动,未装载数据库:实例已启动,但尚未与数据库关联。"如何启动实例"(第13-6页)解释了这个阶段。

  2. 数据库装载:实例已启动,并通过读取其控制文件(参见"控制文件概述"第11-10页)与数据库关联。数据库对用户关闭。"如何装载数据库"(第13-6页)解释了这个阶段。

  3. 数据库打开:实例已启动,并与打开的数据库关联。数据文件中包含的数据可供授权用户访问。"如何打开数据库"(第13-7页)解释了这个阶段。

13.2.1.1. 具有管理员权限的连接

数据库启动和关闭是强大的管理选项,仅限于使用管理员权限连接到Oracle数据库的用户。普通用户无法控制Oracle数据库的当前状态。

根据操作系统的不同,以下条件之一为用户建立管理员权限:

  • 用户的操作系统权限允许他或她使用管理员权限进行连接。
  • 用户被授予SYSDBA或SYSOPER系统权限,并且数据库使用密码文件通过网络对数据库管理员进行身份验证。

SYSDBA和SYSOPER是特殊的系统权限,即使数据库未打开,也能访问数据库实例。这些权限的控制超出了数据库本身。

当您使用SYSDBA系统权限连接时,您位于SYS拥有的模式中。当您以SYSOPER身份连接时,您位于公共模式中。SYSOPER权限是SYSDBA权限的一个子集。

13.2.1.2. 实例如何启动

当Oracle数据库启动一个实例时,它执行以下基本步骤:

  1. 在平台特定的默认位置搜索服务器参数文件,如果没有找到,则搜索文本初始化参数文件(使用SPFILE或PFILE参数指定STARTUP会覆盖默认行为)。
  2. 读取参数文件以确定初始化参数的值。
  3. 根据初始化参数设置分配SGA。
  4. 启动Oracle后台进程。
  5. 打开警告日志和跟踪文件,并将所有显式参数设置以有效的参数语法写入警告日志。

在这个阶段,没有数据库与实例关联。需要NOMOUNT状态的场景包括数据库创建以及某些备份和恢复操作。

13.2.1.3. 数据库如何挂载

实例装载数据库以将数据库与该实例关联。为了装载数据库,实例获取初始化参数CONTROL_FILES中指定的数据库控制文件的名称并打开这些文件。Oracle数据库读取控制文件以找到它在打开数据库时将尝试访问的数据文件和在线重做日志文件的名称。

在装载的数据库中,数据库是关闭的,并且只能由数据库管理员访问。管理员可以在完成特定的维护操作时保持数据库关闭。然而,数据库不适用于正常操作。

如果Oracle数据库允许多个实例同时装载同一个数据库,则初始化参数CLUSTER_DATABASE的设置可以使数据库对多个实例可用。数据库的行为取决于设置:

  • 如果第一个装载数据库的实例的CLUSTER_DATABASE为false(默认),则只有这个实例可以装载数据库。
  • 如果第一个实例的CLUSTER_DATABASE为true,则如果其他实例的CLUSTER_DATABASE参数设置为true,它们也可以装载数据库。可以装载数据库的实例数量受到在创建数据库时指定的预定最大值的限制。

13.2.1.4. 数据库如何打开

打开已装载的数据库使其可以进行常规数据库操作。任何有效的用户都可以连接到打开的数据库并访问其信息。通常,数据库管理员会打开数据库以供一般使用。

当您打开数据库时,Oracle数据库执行以下操作:

  • 打开除了撤消表空间之外的表空间中的在线数据文件。
    • 如果在数据库之前关闭时某个表空间处于离线状态(参见第12-35页的“在线和离线表空间”),那么当数据库重新打开时,该表空间及其对应的数据文件将处于离线状态。
  • 获取一个撤消表空间。如果存在多个撤消表空间,则初始化参数UNDO_TABLESPACE指定要使用的撤消表空间。如果未设置此参数,则选择第一个可用的撤消表空间。
  • 打开在线重做日志文件。

只读模式 默认情况下,数据库以读写模式打开。在这种模式下,用户可以更改数据,在在线重做日志中生成重做记录。或者,您可以以只读模式打开数据库,以防止用户事务修改数据。

注意:默认情况下,物理备用数据库以只读模式打开。参见《Oracle Data Guard概念和管理员指南》。

只读模式限制数据库访问为只读事务,这些事务不能写入数据文件或在线重做日志文件。然而,数据库可以执行恢复或更改数据库状态的操作,而无需生成重做记录。例如,在只读模式下:

  • 数据文件可以离线和在线。但是,您不能使永久表空间离线。
  • 可以恢复离线数据文件和表空间。控制文件保持可用于更新数据库状态的信息。
  • 使用CREATE TEMPORARY TABLESPACE语句创建的临时表空间是读写的。
  • 可以继续向操作系统审计跟踪、跟踪文件和警告日志写入。

数据库文件检查 如果实例尝试打开数据库时,任何数据文件或重做日志文件不存在,或者文件存在但未通过一致性测试,则数据库会返回错误。可能需要进行介质恢复。

13.2.2. 数据库概述与实例关闭

在典型的用例中,您会手动关闭数据库,以便在执行维护或其他管理任务时使其对用户不可用。您可以使用SQL*Plus的SHUTDOWN命令或企业管理器来执行这些步骤。图13-4显示了从打开状态到一致关闭的进展。

当打开的数据库一致地关闭时,Oracle数据库自动执行以下步骤:

  1. 数据库关闭:数据库已装载,但在线数据文件和重做日志文件已关闭。"如何关闭数据库"解释了这个阶段。
  2. 数据库卸载:实例已启动,但不再与数据库的控制文件关联。"如何卸载数据库"解释了这个阶段。
  3. 数据库实例关闭:数据库实例不再启动。"如何关闭实例"解释了这个阶段。

在实例故障或SHUTDOWN ABORT时,Oracle数据库不会经历上述所有步骤,这些情况会立即终止实例。

13.2.2.1. 关闭模式

具有SYSDBA或SYSOPER权限的数据库管理员可以使用SQL*Plus SHUTDOWN命令或企业管理器关闭数据库。SHUTDOWN命令有选项来决定关闭行为。表13-2总结了不同关闭模式的行为。

可能的SHUTDOWN语句有:

  • SHUTDOWN ABORT
    这种模式适用于紧急情况,比如当其他关闭方式都不成功时。这种关闭模式是最快的。然而,随后打开这个数据库可能需要更长的时间,因为必须执行实例恢复以使数据文件一致。

注意:因为SHUTDOWN ABORT不会对打开的数据文件进行检查点,所以在数据库可以重新打开之前,需要进行实例恢复。其他关闭模式在数据库重新打开之前不需要实例恢复。

  • SHUTDOWN IMMEDIATE
    这种模式通常是继SHUTDOWN ABORT之后最快的。Oracle数据库会终止任何正在执行的SQL语句并断开用户连接。活动事务被终止,未提交的更改被回滚。

  • SHUTDOWN TRANSACTIONAL
    这种模式阻止用户开始新的事务,但会等待所有当前事务完成后才关闭。根据当前事务的性质,这种模式可能需要相当长的时间。

  • SHUTDOWN NORMAL
    这是关闭的默认模式。数据库会等待所有连接的用户断开连接后才关闭。

13.2.2.2. 数据库如何被关闭

数据库关闭操作在数据库关闭过程中是隐含的。操作的性质取决于数据库关闭是正常还是异常。

在正常关闭期间数据库如何关闭
当数据库作为SHUTDOWN的一部分关闭(除了ABORT选项外),Oracle数据库将SGA中的数据写入数据文件和在线重做日志文件。接下来,数据库关闭在线数据文件和在线重做日志文件。任何离线表空间的离线数据文件已经关闭。当数据库重新打开时,任何处于离线状态的表空间仍然保持离线状态。

在这个阶段,数据库已关闭,无法进行正常操作。数据库关闭后控制文件仍然保持打开状态。

在异常关闭期间数据库如何关闭
如果发生SHUTDOWN ABORT或异常终止,则打开数据库的实例会立即关闭并关闭数据库。Oracle数据库不会将SGA缓冲区中的数据写入数据文件和重做日志文件。随后重新打开数据库需要实例恢复,Oracle数据库会自动执行此操作。

数据库如何卸载
数据库关闭后,Oracle数据库会卸载数据库以将其与实例解关联。数据库卸载后,Oracle数据库会关闭数据库的控制文件。此时,实例仍然保留在内存中。

实例如何关闭
数据库关闭的最后步骤是关闭实例。当数据库实例关闭时,SGA会从内存中移除,后台进程会被终止。在不寻常的情况下,实例的关闭可能不会干净利落。内存结构可能不会被从内存中移除,或者某个后台进程可能不会被终止。当存在前一个实例的残留物时,随后实例的启动可能会失败。在这种情况下,您可以通过移除前一个实例的残留物然后启动新实例,或者在SQL*Plus中发出SHUTDOWN ABORT语句或使用企业管理器来强制新实例启动。

13.3. 检查点概述

检查点(checkpoint)是在一致的数据库关闭、实例恢复和Oracle数据库操作中的一个重要机制。术语“检查点”有以下相关含义:

  • 检查点位置的数据结构:它指示检查点位置,即实例恢复必须开始的重做流中的SCN(系统更改编号)。检查点位置由数据库缓冲区高速缓存中最老的脏缓冲区决定。检查点位置作为指向重做流的指针,并存储在控制文件和每个数据文件的头部。

  • 将数据库缓冲区高速缓存中修改过的数据库缓冲区写入磁盘:这是检查点过程中的一个动作,确保了数据的一致性和持久性。

13.3.1. 检查点目的

Oracle数据库使用检查点来实现以下目标:

  • 减少实例或介质故障时恢复所需的时间:通过定期将脏缓冲区写入磁盘,检查点帮助减少恢复过程中需要重做的量。
  • 确保缓冲区高速缓存中的脏缓冲区定期写入磁盘:这有助于保持数据的持久性,即使在系统故障的情况下。
  • 确保在一致的关闭过程中所有已提交的数据写入磁盘:这确保了数据库的完整性和一致性,防止数据丢失。

13.3.2. Oracle数据库初始化检查点的时间

检查点进程(CKPT)负责将检查点写入数据文件头部和控制文件。检查点在多种情况下发生。例如,Oracle数据库使用以下类型的检查点:

  • 线程检查点
    数据库在特定目标之前将某个特定线程通过重做修改的所有缓冲区写入磁盘。数据库中所有实例上的线程检查点集合是一个数据库检查点。线程检查点在以下情况下发生:

    • 一致的数据库关闭
    • ALTER SYSTEM CHECKPOINT语句
    • 在线重做日志切换
    • ALTER DATABASE BEGIN BACKUP语句
  • 表空间和数据文件检查点
    数据库在特定目标之前将所有通过重做修改的缓冲区写入磁盘。表空间检查点是数据文件检查点的集合,每个表空间中的数据文件各有一个。这些检查点在多种情况下发生,包括将表空间设置为只读或正常离线、缩小数据文件或执行ALTER TABLESPACE BEGIN BACKUP。

  • 增量检查点
    增量检查点是一种线程检查点,部分目的是避免在在线重做日志切换时写入大量块。DBWn(数据库写入进程)至少每三秒钟检查一次是否有工作要做。当DBWn写入脏缓冲区时,它会推进检查点位置,导致CKPT将检查点位置写入控制文件,但不会写入数据文件头部。

其他类型的检查点包括实例和介质恢复检查点以及在删除或截断模式对象时的检查点。

13.4. 实例恢复概述

实例恢复是将在线重做日志中的记录应用到数据文件中,以重建最近一次检查点之后所做的更改的过程。当管理员尝试打开一个之前不一致关闭的数据库时,实例恢复会自动进行。

13.4.1. 实例恢复目的

实例恢复确保在实例故障后数据库处于一致的状态。由于Oracle数据库管理数据库更改的方式,数据库的文件可能会处于不一致的状态。重做线程是实例生成的所有更改的记录。单实例数据库有一个重做线程,而Oracle RAC数据库有多个重做线程,每个数据库实例一个。当事务提交时,日志写入器(LGWR)将内存中的剩余重做条目和事务SCN写入在线重做日志。然而,数据库写入器(DBW)进程在最高效的时候将修改过的数据块写入数据文件。因此,未提交的更改可能暂时存在于数据文件中,而已提交的更改尚未存在于数据文件中。如果打开数据库的实例失败,无论是因为SHUTDOWN ABORT语句还是异常终止,那么可能会出现以下情况:

  • 事务提交的数据块未写入数据文件,只出现在在线重做日志中。这些更改必须重新应用到数据库中。
  • 数据文件包含在实例失败时尚未提交的更改。这些更改必须回滚以确保事务一致性。

实例恢复仅使用在线重做日志文件和当前在线数据文件来同步数据文件,并确保它们是一致的。

13.4.2. Oracle数据库执行实例恢复的时间

是否需要实例恢复取决于重做线程的状态。当数据库实例以读写模式打开时,重做线程在控制文件中被标记为打开,在实例一致关闭时被标记为关闭。如果控制文件中重做线程被标记为打开,但没有活动的实例持有与这些线程对应的队列,那么数据库需要实例恢复。

Oracle数据库在以下情况下会自动执行实例恢复:

  • 数据库在单实例数据库或Oracle RAC数据库的所有实例失败后首次打开。这种形式的实例恢复也称为崩溃恢复。Oracle数据库一起恢复终止实例的在线重做线程。
  • Oracle RAC数据库的一些但不是所有实例失败。实例恢复由配置中的一个存活实例自动执行。SMON后台进程执行实例恢复,自动应用在线重做。不需要用户干预。

13.4.3. 检查点对于数据库实例恢复的重要性

实例恢复使用检查点来确定必须应用到数据文件的更改。检查点位置保证每个提交的更改(其SCN低于检查点SCN)都被保存到数据文件中。

图13-5描述了在线重做日志中的重做线程。

在实例恢复期间,数据库必须应用检查点位置和重做线程末尾之间发生的更改。如图13-5所示,某些更改可能已经被写入数据文件。然而,只有SCN低于检查点位置的更改才保证在磁盘上。

13.4.4. 实例恢复的阶段

实例恢复的第一阶段称为高速缓存恢复或前滚,涉及将在线重做日志中记录的所有更改重新应用到数据文件。由于在线重做日志中记录了回滚数据,前滚操作也会重新生成相应的撤消段。

前滚通过遍历所有必要的在线重做日志文件来将数据库向前推进时间。前滚完成后,数据块包含在线重做日志文件中记录的所有已提交更改。这些文件也可能包含未提交的更改,这些更改要么在故障前已保存到数据文件中,要么是在高速缓存恢复期间被记录在在线重做日志中并引入的。

前滚完成后,任何未提交的更改都必须被撤销。Oracle数据库使用检查点位置,确保每个提交的更改(其SCN低于检查点SCN)都保存在磁盘上。Oracle数据库应用撤消块来回滚在故障前写入或在高速缓存恢复期间引入的未提交更改。这个阶段称为回滚或事务恢复。

图13-6说明了前滚和回滚,这两个步骤是从前滚数据库实例故障中恢复所必需的。

Oracle数据库可以根据需要同时回滚多个事务。所有在故障时处于活动状态的事务都被标记为已终止。新事务不必等待SMON进程来回滚已终止的事务,它们可以自己回滚单个块以获取所需的数据。

13.5. 参数文件概述

要启动数据库实例,Oracle数据库必须读取服务器参数文件(推荐使用)或文本初始化参数文件(这是遗留实现)。这些文件包含配置参数的列表。

要手动创建数据库,您必须使用参数文件启动一个实例,然后发出CREATE DATABASE命令。因此,即使数据库本身不存在,实例和参数文件也可以存在。

13.5.1. 初始化参数

初始化参数是影响实例基本操作的配置参数。实例在启动时从文件中读取初始化参数。

Oracle数据库提供了许多初始化参数,以优化其在不同环境中的操作。只有少数这些参数需要显式设置,因为在大多数情况下默认值是足够的。

13.5.1.1. 初始化参数的功能组

大多数初始化参数属于以下功能组之一:

  • 命名实体的参数:如文件或目录。
  • 设置进程、数据库资源或数据库本身的限制的参数
  • 影响容量的参数:例如SGA(系统全局区)的大小(这些参数称为变量参数)。

变量参数对数据库管理员特别重要,因为他们可以使用这些参数来提高数据库性能。

13.5.1.2. 基本和高级初始化参数

初始化参数分为两组:基本和高级。

在大多数情况下,您只需要设置和调整大约30个基本参数,就可以获得合理的性能。基本参数设置诸如数据库名称、控制文件位置、数据库块大小和撤消表空间等特性。在极少数情况下,为了获得最佳性能,可能需要修改高级参数。高级参数使经验丰富的数据库管理员能够调整Oracle数据库的行为,以满足独特的要求。Oracle数据库在随数据库软件提供的初始参数文件中提供值,或由数据库配置助手为您创建(见第18-4页的“数据库安装和配置工具”)。您可以编辑这些Oracle提供的初始化参数,并根据配置和调整数据库的计划添加其他参数。对于参数文件中未包含的相关初始化参数,Oracle数据库提供默认值。

13.5.2. 服务器参数文件

服务器参数文件

服务器参数文件是由Oracle数据库管理的初始化参数存储库。服务器参数文件具有以下关键特征:

  • 数据库只有一个服务器参数文件。此文件必须位于数据库主机上。
  • 服务器参数文件只能由Oracle数据库写入和读取,不能由客户端应用程序操作
  • 服务器参数文件是二进制的,不能通过文本编辑器修改

存储在服务器参数文件中的初始化参数是持久的。在数据库实例运行时对参数所做的任何更改都可以在实例关闭和启动之间持久保存。

服务器参数文件消除了维护多个客户端应用程序的文本初始化参数文件的需要。服务器参数文件最初是使用CREATE SPFILE语句从文本初始化参数文件构建的。也可以直接由数据库配置助手创建。

13.5.3. 文本初始化参数文件

文本初始化参数文件是一个包含初始化参数列表的文本文件。这种类型的参数文件是参数文件的传统实现方式,具有以下关键特征:

  • 在启动或关闭数据库时,文本初始化参数文件必须位于连接到数据库的客户端应用程序所在的主机上
  • 文本初始化参数文件是基于文本的,不是二进制的
  • Oracle数据库可以读取但不能写入文本初始化参数文件。要更改参数值,您必须使用文本编辑器手动修改文件
  • 通过ALTER SYSTEM更改的初始化参数值仅对当前实例有效。您必须手动更新文本初始化参数文件并重新启动实例,更改才会生效

文本初始化参数文件包含一系列键值对,每行一个。例如,初始化参数文件的一部分可能如下所示:

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所示。服务器参数文件解决了参数文件泛滥的问题。

13.5.4. 修改初始化参数的值

您可以调整初始化参数以修改数据库的行为。将参数分类为静态或动态决定了它们可以如何被修改。表13-3总结了它们之间的差异。

静态参数包括DB_BLOCK_SIZEDB_NAMECOMPATIBLE。动态参数分为会话级参数和系统级参数,会话级参数只影响当前用户会话,而系统级参数影响数据库和所有会话。例如,MEMORY_TARGET是系统级参数,而NLS_DATE_FORMAT是会话级参数(参见第19-10页的“特定区域设置”)。参数更改的范围取决于更改何时生效。当实例使用服务器参数文件启动时,您可以使用ALTER SYSTEM SET语句按如下方式更改系统级参数的值:

  • SCOPE=MEMORY
    更改只适用于数据库实例。如果数据库关闭并重新启动,更改将不会保留。

  • SCOPE=SPFILE
    更改被写入服务器参数文件,但不影响当前实例。因此,更改在实例重新启动之前不会生效。

注意:在更改Oracle数据库参考中描述为不可修改的参数值时,您必须指定SPFILE。

  • SCOPE=BOTH
    更改同时被写入内存和服务器参数文件。这是数据库使用服务器参数文件时的默认范围。

数据库将初始化参数的新值和旧值打印到警告日志中。作为预防措施,数据库验证基本参数的更改,以防止非法值被写入服务器参数文件。

13.6. 诊断文件概述

Oracle数据库包括一个故障诊断基础设施,用于预防、检测、诊断和解决数据库问题。问题包括关键错误,如代码缺陷、元数据损坏和客户数据损坏。

高级故障诊断基础设施的目标如下:

  • 主动检测问题
  • 在检测到问题后限制损害和中断
  • 减少问题的诊断和解决时间
  • 简化客户与Oracle支持的互动

13.6.1. 自动诊断仓库

自动诊断仓库(ADR)

自动诊断仓库(ADR)是一个基于文件的存储库,用于存储数据库诊断数据,如跟踪文件、警告日志和健康监控报告。ADR的关键特性包括:

  • 统一的目录结构
  • 一致的诊断数据格式
  • 统一的工具集

这些特性使得客户和Oracle支持能够在多个Oracle实例、组件和产品中关联和分析诊断数据。

ADR位于数据库外部,这使得Oracle数据库能够在物理数据库不可用时访问和管理ADR。实例可以在创建数据库之前创建ADR。

13.6.1.1. 问题和事件

ADR主动跟踪数据库中的关键错误,即数据库中的关键错误。关键错误表现为内部错误,如ORA-600或其他严重错误。每个问题都有一个问题关键字,这是一个描述问题的文本字符串。

当一个问题多次发生时,ADR会为每次出现创建一个有时间戳的事件。一个事件通过一个数字事件ID唯一标识。当一个事件发生时,ADR会向企业管理器发送一个事件警报。关键错误的诊断和解决通常从事件警报开始。

由于一个问题在短时间内可能生成许多事件,ADR在达到某些阈值后对事件生成应用洪水控制。受洪水控制的事件会生成一个警告日志条目,但不会生成事件转储。通过这种方式,ADR在不使系统因诊断数据过载的情况下通知您关键错误正在进行中。

13.6.1.2. ADR结构

ADR基础是ADR根目录。ADR基础可以包含多个ADR主目录,每个ADR主目录是一个Oracle产品或组件实例的所有诊断数据(跟踪、转储、警告日志等)的根目录。例如,在具有共享存储和ASM的Oracle RAC环境中,每个数据库实例和每个ASM实例都有自己的ADR主目录。

图13-8说明了数据库实例的ADR目录层次结构。在此层次结构中,可以存在其他Oracle产品或组件(如ASM或Oracle Net Services)的ADR主目录,它们位于同一个ADR基础下。

正如以下Linux示例所示,当您在创建数据库之前使用唯一的SID和数据库名称启动一个实例时,Oracle数据库默认会将ADR作为主机文件系统中的目录结构创建出来。SID和数据库名称构成了ADR主目录中文件路径的一部分。

Example 131 Creation of 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
Database Buffers Redo Buffers
92276176 bytes 50331648 bytes 2547712 bytes
SQL> SELECT NAME, VALUE FROM V$DIAG_INFO; 
NAME                     VALUE
---------------------    -------------------------------------------------
Diag Enabled             TRUE
ADR Base                 /u01/oracle/log
ADR Home                 /u01/oracle/log/diag/rdbms/dbn/osi
Diag Trace               /u01/oracle/log/diag/rdbms/dbn/osi/trace
Diag Alert               /u01/oracle/log/diag/rdbms/dbn/osi/alert
Diag Incident            /u01/oracle/log/diag/rdbms/dbn/osi/incident
Diag Cdump               /u01/oracle/log/diag/rdbms/dbn/osi/cdump
Health Monitor           /u01/oracle/log/diag/rdbms/dbn/osi/hm
Default Trace File       /u01/oracle/log/diag/rdbms/dbn/osi/trace/osi_ora_10533.trc 
Active Problem Count     0 
Active Incident Count    0

13.6.2. 警告日志

每个数据库都有一个警告日志,这是一个包含数据库消息和错误的时间顺序日志的XML文件。警告日志的内容包括:

  • 所有内部错误(ORA-600)、块损坏错误(ORA-1578)和死锁错误(ORA-60)
  • 管理操作,如DDL语句和SQL*Plus命令STARTUP、SHUTDOWN、ARCHIVE LOG和RECOVER
  • 与共享服务器和调度器进程功能相关的几个消息和错误
  • 物化视图自动刷新期间的错误

Oracle数据库使用警告日志作为在企业管理器GUI中显示信息的替代方法。如果管理操作成功,Oracle数据库会将一条消息写入警告日志,标记为"completed",并附上时间戳。

当您首次启动数据库实例时,即使尚未创建数据库,Oracle数据库也会在图13-8所示的警告子目录中创建一个警告日志。以下示例显示了纯文本警告日志的一部分:

Fri Jun 19 17:05:34 2011 
Starting ORACLE instance (normal) 
LICENSE_MAX_SESSION = 0 
LICENSE_SESSIONS_WARNING = 0 
Shared memory segment for instance monitoring created 
Picked latch-free SCN scheme 2 
Autotune of undo retention is turned on. 
IMODE=BR 
ILAT =12 
LICENSE_MAX_USERS = 0 
SYS auditing is disabled 
Starting up ORACLE RDBMS 
Version: 11.2.0.0.0. 
Using parameter settings in client-side pfile
. 
. 
.
System parameters with nondefault values: 
db_name = "my_test"
Fri Jun 19 17:05:37 2011 
PMON started with pid=2, OS id=10329 
Fri Jun 19 17:05:37 2011 
VKTM started with pid=3, OS id=10331 at elevated priority 
VKTM running at (20)ms precision 
Fri Jun 19 17:05:37 2011 
DIAG started with pid=4, OS id=10335

13.6.3. 追踪文件

跟踪文件是一个包含用于调查问题的诊断数据的管理文件。此外,跟踪文件可以为调整应用程序或实例提供指导,详见第18-20页的“性能诊断和调整”。

13.6.3.1. 跟踪文件的类型

每个服务器和后台进程可以定期写入与之关联的跟踪文件。这些文件包含有关进程环境、状态、活动和错误的信息。SQL跟踪设施也创建跟踪文件,提供有关个别SQL语句的性能信息。要为客户端标识符、服务、模块、操作、会话、实例或数据库启用跟踪,您必须执行DBMS_MONITOR包中的适当过程,或使用Oracle企业管理器。

转储是特殊类型的跟踪文件。与跟踪倾向于是连续的诊断数据输出不同,转储通常是对事件(如事件)的一次性诊断数据输出。当事件发生时,数据库会将一个或多个转储写入为该事件创建的事件目录。事件转储的文件名中也包含事件编号。

13.6.3.2. 跟踪文件的位置

ADR将跟踪文件存储在跟踪子目录中,如图13-8所示。跟踪文件的名称依赖于平台,并使用扩展名.trc。通常,数据库后台进程跟踪文件名称包含Oracle SID、后台进程名称和操作系统进程号。RECO进程的跟踪文件示例是mytest_reco_10355.trc。服务器进程跟踪文件名称包含Oracle SID、字符串ora和操作系统进程号。服务器进程跟踪文件名称的示例是mytest_ora_10304.trc。

有时跟踪文件有相应的跟踪映射(.trm)文件。这些文件包含有关跟踪文件的结构信息,并用于搜索和导航。

posted @   脆皮老弟  阅读(59)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示