Oracle DBA

Oracle DB 架构

主要组件概述

  • Oracle 服务器:Oracle 服务器中有多个文件、进程和内存结构;但是,在处理 SQL 语句时,并非所有方法都使用它们。有些用于提高数据库的性能,确保在发生软件或硬件错误时可以恢复数据库,或执行维护数据库所需的其他任务。Oracle 服务器由 Oracle 实例和 Oracle 数据库组成。

  • Oracle 实例:Oracle 实例是后台进程和内存结构的组合。必须启动实例才能访问数据库中的数据。每次启动实例时,都会分配一个系统全局区域 (SGA) 并启动 Oracle 后台进程。后台进程代表调用进程执行功能。它们整合了原本由为每个用户运行的多个 Oracle 程序处理的功能。后台进程执行输入/输出 (I/O) 并监视其他 Oracle 进程,以提供更高的并行性,从而提高性能和可靠性。

  • Oracle 数据库:Oracle 数据库由操作系统文件(也称为数据库文件)组成,这些文件为数据库信息提供实际的物理存储。数据库文件用于确保数据保持一致,并且可以在实例发生故障时恢复。

  • 其他密钥文件:非数据库文件用于配置实例、对特权用户进行身份验证以及在发生磁盘故障时恢复数据库。

  • 用户和服务器进程:用户和服务器进程是执行 SQL 语句时涉及的主要进程;但是,其他进程可以帮助服务器完成 SQL 语句的处理。

  • 其他进程:Oracle 中的其他选项也存在许多其他进程,例如高级队列、实际应用程序群集、共享服务器、高级复制等。这些过程在各自的课程中讨论。

Oracle Instance

Oracle 实例由系统全局区域 (SGA) 内存结构和用于管理数据库的后台进程组成。实例是使用特定于每个操作系统的方法标识的。实例一次只能打开和使用一个数据库。

建立连接和会话

连接到Oracle Instance

用户启动 SQL*Plus 等工具开发的应用程序。此应用程序或工具作为用户进程执行。

当用户登录到 Oracle 服务器时,将在运行 Oracle 服务器的计算机上创建一个服务器进程

服务器进程代表客户端上运行的用户进程与 Oracle 实例通信。服务器进程代表用户执行 SQL 语句。

连接

连接是用户进程和 Oracle 服务器之间的通信路径。数据库用户可以通过以下三种方式之一连接到 Oracle 服务器:

  1. 用户登录到运行 Oracle 实例的操作系统,并启动访问该系统上的数据库的应用程序或工具。通信路径是使用主机操作系统上可用的进程间通信机制建立的。
  2. 用户在本地计算机上启动应用程序或工具,并通过网络连接到运行 Oracle 实例的计算机。在这种称为客户端-服务器(C/S)的配置中,网络软件用于在用户和 Oracle 服务器之间进行通信。
  3. 在三层连接中,用户的计算机通过网络与应用程序或网络服务器通信,应用程序或网络服务器通过网络连接到运行 Oracle 实例的计算机。例如,用户在网络上的计算机上运行浏览器,以使用驻留在 NT 服务器上的应用程序,该应用程序从 UNIX 主机上运行的 Oracle 数据库中检索数据。

会话

会话是用户与 Oracle 服务器的特定连接。会话在 Oracle 服务器验证用户时开始,在用户注销或异常终止时结束。对于给定的数据库用户,如果用户同时从许多工具、应用程序或终端登录,则可能出现许多并发会话。除了某些专用的数据库管理工具外,启动数据库会话需要 Oracle 服务器可供使用。

注意:此处介绍的连接类型(用户和服务器进程之间存在一对一的对应关系)称为专用服务器连接。使用共享服务器配置时,多个用户进程可以共享服务器进程。

Oracle Database

数据库的一般用途是存储和检索相关信息。Oracle 数据库具有逻辑结构和物理结构。数据库的物理结构是数据库中的一组操作系统文件。

Oracle 数据库由三种文件类型组成。

  • 数据文件(Data files): 包含数据库中实际数据

  • 重做日志(Redo logs): 包含对数据库所做的更改的记录,以便在发生故障时恢复数据

  • 控制文件(Control files): 包含维护和验证数据库完整性所需信息

其他关键文件结构
Oracle 服务器还使用不属于数据库的其他文件:

  1. 参数文件(parameter file)定义了 Oracle 实例的特征。例如,它包含调整 SGA 中某些内存结构大小的参数。
  2. 密码文件(password file)对有权启动和关闭 Oracle 实例的用户进行身份验证。
  3. 存档的重做日志文件(Archived redo log files)是从介质故障中恢复可能需要的重做日志文件的脱机副本。

Physical Structure

Oracle 数据库的物理结构仅包含三种类型的文件:

  1. 数据文件
  2. 重做日志文件
  3. 控制文件

Memory Structure

  1. 系统全局区域 (SGA):在实例启动时分配,是 Oracle 实例的基本组件
  2. 程序全局区域 (PGA):在服务器进程启动时分配

系统全局区(SGA)

它用于存储由数据库进程共享的数据库信息。它包含Oracle服务器的数据和控制信息,并被分配在Oracle所在的计算机的虚拟内存中。

SGA 的大小由几个初始化参数确定。对 SGA 大小影响最大的参数是:

  • DB_CACHE_SIZE:标准块的缓存大小。
  • LOG_BUFFER:为重做日志缓冲区缓存分配的字节数。
  • SHARED_POOL_SIZE:专用于共享 SQL 和 PL/SQL 的区域的大小(以字节为单位)。
  • LARGE_POOL_SIZE:大型游泳池的大小;默认值为零。

由下面几个内存区域组成:

  • Shared pool
  • Database buffer cache
  • Redo log buffer cache
  • Large pool(optional)
  • Java pool (optional)

Shared pool

存储最近的执行的 SQL 语句和最近使用的数据定义(DD)

由两部分组成:

  1. Library cache (LRU,SQL,PL/SQL)
  2. Data dictionary cache ()

调整

1
ALTER SYSTEM SET SHARED_POOL_SIZE = 64M;

Database Buffer Cache

数据库缓冲缓存存储数据副本,即已从数据文件中检索的块。
获取和更新数据时,它可以极大地提高性能。
它通过最近最少使用的 (LRU) 算法进行管理。
DB_BLOCK_SIZE确定主块大小。

处理查询时,Oracle 服务器进程会在数据库缓冲区缓存中查找所需的任何块。如果在数据库缓冲区高速缓存中找不到该块,服务器进程将从数据文件中读取该块,并将副本放在数据库缓冲区高速缓存中。由于对同一块的后续请求可能会在内存中找到该块,因此请求可能不需要物理读取。Oracle 服务器使用最近最少使用的算法来老化最近未访问的缓冲区,以便为数据库缓冲区缓存中的新块腾出空间。

调整大小
缓冲区缓存中每个缓冲区的大小等于 Oracle 块的大小,由 DB_BLOCK_SIZE 参数指定。
数据库缓冲区高速缓存由用于缓冲池和多个块大小的独立子高速缓存组成。
参数 DB_BLOCK_SIZE 确定用于 SYSTEM 表空间的主块大小。
三个参数定义缓冲区缓存的大小:

  1. DB_CACHE_SIZE:仅调整默认缓冲区缓存大小的大小,它始终存在且不能设置为零。
  2. DB_KEEP_CACHE_SIZE:调整保留缓冲区缓存的大小,该缓存用于在内存中保留可能重复使用的块。
  3. DB_RECYCLE_CACHE_SIZE:调整回收缓冲区缓存的大小,用于从内存中消除重用变化不大的块。

可以使用标准块大小和最多四个非标准块大小创建 Oracle 数据库。非标准块大小可以具有介于 2 KB 和 32 KB 之间的任何 2 次方值。

1
ALTER SYSTEM SET DB_CACHE_SIZE = 96M;

DB_CACHE_ADVICE 收集统计信息以预测不同的缓存大小行为

Redo Log Buffer Cache

重做日志缓冲区缓存记录所有对数据库数据块进行的更改

其主要目的是恢复。
中记录的更改称为重做条目(redo entries)。
重做条目包含用于重建或重做更改的信息。

重做日志缓冲区缓存是一个循环缓冲区,其中包含对数据文件块所做的更改。此信息存储在重做条目中。重做条目包含在通过插入、更新、删除、创建、更改或删除操作进行更改之前重新创建数据所需的信息。

大小由下式定义:
LOG_BUFFER

Large pool

当用户通过共享服务器进行连接时,Oracle 需要在共享池中分配额外的空间,用于存储有关用户进程、调度程序和服务器之间连接的信息。Large pool 减轻了shared pool内区域的负担。共享池不必放弃内存来缓存 SQL 分析树,转而使用共享服务器会话信息、I/O 以及备份和恢复进程。性能提升来自共享 SQL 缓存的增加和收缩带来的开销的减少。

调整大型池的大小
大型池的大小以 LARGE_POOL_SIZE 参数定义的字节为单位。

Java pool

如果安装和使用 Java,则为必需。

它在数据库表中的存储方式与PL/SQL大致相同。

它的大小由 JAVA_POOL_SIZE 参数调整。

PGA

Program Global Area
程序全局区域或进程全局区域 (PGA) 是一个内存区域,其中包含单个服务器进程或单个后台进程的数据和控制信息。

PGA 在创建进程时分配,在进程终止时解除分配。与由多个进程共享的 SGA 相比,PGA 是一个仅由一个进程使用的区域。

在专用服务器配置中,PGA 包括以下组件:

  • 排序区域:用于处理 SQL 语句可能需要的任何排序
  • 会话信息:包括会话的用户权限和性能统计信息
  • 游标状态:指示会话当前使用的 SQL 语句处理阶段
  • 堆栈空间:包含其他会话变量
    注: 使用共享服务器配置时,其中一些结构存储在 SGA 中。
    如果使用共享服务器配置,则多个用户进程可以共享服务器进程。
    如果创建了大型池,则结构将存储在大型池中;否则,它们将存储在共享池中。

Oracle Process

  • 用户进程:在数据库用户请求连接到 Oracle 服务器时启动
  • 服务器进程:连接到 Oracle 实例,并在用户建立会话时启动。
  • 后台进程:启动 Oracle 实例时可用

用户进程

需要从数据库请求信息的数据库用户必须首先与 Oracle 服务器建立连接。
使用数据库接口工具(如 SQL*Plus)请求连接,并开始用户进程。
用户进程不直接与 Oracle 服务器交互。
相反,它通过用户帐户接口 (UPI) 生成调用,该接口创建会话并启动服务器进程。

服务器进程

是与甲骨文服务器直接交互的程序

  1. 它完成生成的调用并返回结果。
  2. 可以是专用服务器或共享服务器。

用户建立连接后,将启动服务器进程来处理用户进程请求。
服务器进程可以是专用服务器进程,也可以是共享服务器进程。
在专用服务器环境中,服务器进程处理单个用户进程的请求。一
旦用户进程断开连接,服务器进程就会终止。
在共享服务器环境中,服务器进程处理多个用户进程的请求。
服务器进程使用 Oracle 程序接口 (OPI) 与 Oracle Server通信。

后台进程

Oracle 体系结构有五个必需的后台进程:

  1. DBWn
  2. PMON
  3. CKPT
  4. LGWR
  5. SMON

除了必需列表之外,Oracle 还有许多可选的后台进程,这些进程在使用其选项时启动。

以下是一些可选后台进程的列表:

  • RECO:恢复器
  • QMNn:高级排队
  • ARCn:存档器
  • LCKn:RAC 锁管理器 — 实例锁
  • LMON:RAC DLM 监视器 — 全局锁
  • LMDn:RAC DLM 监视器 — 远程锁定
  • CJQ0:快照刷新
  • Dnnn:调度程序
  • SNNN:共享服务器
  • Pnnn:并行查询从属

数据库写进程 (DBWn)

服务器进程在缓冲区缓存中记录对回滚和数据块的更改。
DBWn 将数据库缓冲区缓存中的脏缓冲区写入数据文件。
它确保数据库缓冲区缓存中提供足够数量的可用缓冲区(当服务器进程需要从数据文件中读取块时可以覆盖的缓冲区)。
数据库性能得到提高,因为服务器进程仅在缓冲区高速缓存中进行更改。

DBWn 延迟写入数据文件,直到发生以下事件之一:

  • 检查点
  • 脏缓冲区数达到阈值
  • 进程在扫描可用缓冲区时扫描指定数量的块No free buffers
  • 发生超时
  • 实际应用程序群集环境中的 ping 请求
  • 将普通表空间或临时表空间置于脱机状态
  • 将表空间置于只读模式
  • 删除或截断表
  • ALTER TABLESPACE tablespace name BEGIN BACKUP

Log Writer (LGWR)

在以下情况下,LGWR 会执行从重做日志缓冲区缓存到重做日志文件的顺序写入:

  • 当事务提交时
  • 当重做日志缓冲区缓存已满三分之一时
  • 当重做日志缓冲区缓存中的更改记录超过 1 MB 时
  • 在 DBWn 之前,将数据库缓冲区缓存中修改的块写入数据文件
  • 每 3 秒一次。
  • 由于恢复需要重做,因此 LGWR 仅在将重做写入磁盘后确认提交。
  • LGWR 还可以调用 DBWn 来写入数据文件。
    注意:DBWn 不会写入联机重做日志(online redo logs)。

System Monitor (SMON)

如果 Oracle 实例出现故障,SGA 中尚未写入磁盘的任何信息都将丢失。
例如,操作系统故障会导致实例故障。实例丢失后,后台进程 SMON 会在重新打开数据库时自动执行实例恢复。

实例恢复包括以下步骤:

  1. 前滚以恢复尚未记录在数据文件中但已记录在联机重做日志中的数据。由于实例故障期间 SGA 丢失,此数据尚未写入磁盘。在此过程中,SMON 读取重做日志文件,并将重做日志中记录的更改应用于数据块。由于所有已提交的事务都已写入重做日志,因此此过程将完全恢复这些事务。
  2. 打开数据库,以便用户可以登录。未被未恢复的事务锁定的任何数据都立即可用。
  3. 回滚未提交的事务。它们在访问锁定数据时由 SMON 或单个服务器进程回滚。

SMON 还执行一些空间维护功能:
它合并或合并数据文件中可用空间的相邻区域。
它解除分配临时段以将其作为数据文件中的可用空间返回。
临时段用于在 SQL 语句处理期间存储数据。

Process Monitor (PMON)

事务恢复

后台进程 PMON 在进程失败后通过以下方式清理:

  1. 回滚用户的当前事务
  2. 释放所有当前持有的表锁或行锁
  3. 释放用户当前保留的其他资源
  4. 重新启动失效调度程序

Checkpoint (CKPT)

当 Oracle 后台进程 DBWn 将 SGA 中所有已修改的数据库缓冲区(包括已提交和未提交的数据)写入数据文件时,会发生称为检查点的事件。

实施检查点的原因如下:

  1. 检查点确保内存中频繁更改的数据块定期写入数据文件。由于 DBWn 的LRU算法,频繁更改的数据块可能永远不会符合最近最少使用的块的条件,因此,如果未发生检查点,则可能永远不会写入磁盘。
  2. 由于检查点之前的所有数据库更改都已记录在数据文件中,因此如果需要实例恢复,则不再需要将检查点之前的重做日志条目应用于数据文件。因此,检查点非常有用,因为它们可以加快实例恢复。

在检查点,将写入以下信息:

  • 检查点编号到数据文件头中
  • 检查点编号、日志序列号、存档的日志名称和系统更改编号到控制文件中。
  • CKPT 不会将数据块写入磁盘或将块重做到联机重做日志。
    注: 不应将 CKPT 过程与管理重做日志文件课程中讨论的检查点操作混淆。

Archiver (ARCn)


存档程序进程
所有其他后台进程都是可选的,具体取决于数据库的配置;
但是,其中之一 ARCn 对于在磁盘丢失后恢复数据库至关重要。
当联机重做日志文件填满时,Oracle 服务器开始写入下一个联机重做日志文件。
从一个重做日志切换到另一个重做日志的过程称为日志切换。
ARCn 进程在每个日志切换时启动已填充日志组的备份或存档。
它会自动存档联机重做日志,然后才能重用日志,以便保留对数据库所做的所有更改。
这使 DBA 能够将数据库恢复到故障点,即使磁盘驱动器已损坏也是如此。

存档重做日志文件
DBA 必须做出的重要决策之一是将数据库配置为在 ARCHIVELOG 或 NOARCHIVELOG 模式下运行。

  1. NOARCHIVELOG 模式:在 NOARCHIVELOG 模式下,每次发生日志切换时,都会覆盖联机重做日志文件。
    LGWR 不会覆盖重做日志组,直到该组的检查点完成。
    这可确保在发生实例崩溃时可以恢复已提交的数据。
    在实例崩溃期间,只有 SGA 丢失。
    没有磁盘丢失,只有内存。
    例如,操作系统崩溃会导致实例崩溃。
  2. ARCHIVELOG 模式:如果数据库配置为在存档日志模式下运行,
    则必须先存档已填充联机重做日志文件的非活动组,然后才能再次使用它们。
    由于对数据库所做的更改记录在联机重做日志文件中,
    因此数据库管理员可以使用数据文件的物理备份和存档的联机重做日志文件来恢复数据库,
    而不会因任何单点故障(包括磁盘丢失)而丢失任何已提交的数据。
    通常,生产数据库配置为在 ARCHIVELOG 模式下运行。

Logical Structure

逻辑结构层次结构如下:

  1. Oracle DB是一组表空间(Tablespace)。
  2. 表空间可以由一个或多个(Segment)组成。
  3. (Extent)组成。
  4. 逻辑块(Block)组成。
  5. 块是读取和写入操作的最小单位。

SQL执行过程

SQL -> 连接器 -> 语法分析器 -> 语义分析与优化器 -> 执行引擎

执行DML

  1. 连接到实例
  2. 处理 DML 语句
    1. 解析与用于处理查询的解析阶段相同。
    2. 执行需要额外的处理才能进行数据更改。
  3. DML 执行阶段
    1. 如果数据和回滚块尚未在缓冲区缓存中,则服务器进程会将它们从数据文件读取到缓冲区缓存中。
    2. 服务器进程对要修改的行放置锁。回滚块用于存储数据的先前映像,以便在必要时可以回滚 DML 语句。
    3. 数据块记录数据的新值。
    4. 服务器进程将之前的图像记录到撤消块并更新数据块。这两项更改都是在数据库缓冲区高速缓存中完成的。缓冲区缓存中任何更改的块都将标记为脏缓冲区。也就是说,缓冲区与磁盘上的相应块不同。
    5. 处理 DELETE 或 INSERT 命令使用类似的步骤。DELETE 的前面图像包含已删除行中的列值,插入项的前面图像包含行位置信息。
  4. 查询返回行
  5. DML 语句记录更改
  6. 提交可确保事务恢复

执行 SELECT

  1. 搜索共享池
  2. 验证语句
  3. 验证数据源
  4. 获取锁
  5. 检查权限
  6. 解析语句
  7. 执行语句
  8. 从游标获取值