图文详解oracle数据库体系结构

本篇文章给大家带来了关于Oracle的相关知识,其中主要介绍了数据库体系结构的相关问题,Oracle DB 服务器由一个Oracle DB以及一个或多个数据库实例组成,实例由内存结构和后台进程构成

    本篇文章给大家带来了关于Oracle的相关知识,其中主要介绍了数据库体系结构的相关问题,Oracle DB 服务器由一个Oracle DB以及一个或多个数据库实例组成,实例由内存结构和后台进程构成,希望对大家有帮助。

推荐教程:《Oracle教程》

概述

Oracle DB 服务器由一个 Oracle DB 以及一个或多个数据库实例组成。实例由内存结构和后台进程构成。每当启动一个实例时,都会分配一个称为系统全局区 (SGA) 的共享内存区,并启动后台进程。 数据库包括物理结构和逻辑结构。由于物理结构和逻辑结构是分开的,因此管理数据的物理存储时不会影响对逻辑存储结构的访问。在这里插入图片描述 Oracle 实例使用内存结构和进程来管理和访问数据库。所有内存结构都存在于构成数据库服务器的那些计算机的主内存中。进程是在这些计算机的内存中运行的作业。进程被定义为操作系统中可运行一系列步骤的“控制线程”或机制。

内存结构

在这里插入图片描述 Oracle实例有两个关联的基本内存结构: 1、系统全局区 (SGA) 称为 SGA 组件的共享内存结构组,这些组件包含一个 Oracle DB实例的数据和控制信息。 SGA 由所有服务器和后台进程共享。 SGA 中存储的数据示例包括高速缓存的数据块和共享 SQL 区域。 SGA 是包含实例的数据和控制信息的内存区。 SGA 包含以下数据结构: • 数据库缓冲区高速缓存: 用于缓存从数据库中检索到的数据块 • 重做日志缓冲区: 用来缓存用于实例恢复的重做信息,直到可以将其写入磁盘中存储的物理重做日志文件 • 共享池: 用于缓存可在用户间共享的各种结构 • 大型池: 为某些大型进程(例如 Oracle 备份和恢复操作)和 I/O 服务器进程提供大型内存分配的可选区域。 • Java 池: 用于 Java 虚拟机 (JVM) 中特定于会话的所有 Java 代码和数据 • 流池: Oracle Streams 使用它来存储捕获和应用操作所需的信息

2、程序全局区 (PGA) 包含某个服务器进程或后台进程的数据及控制信息的内存区域。 PGA 是 Oracle DB 在服务器进程或后台进程启动时创建的非共享内存。服务器进程对PGA 的访问是互斥的。每个服务器进程和后台进程都具有自己的 PGA。 程序全局区 (PGA) 是一个内存区,其中包含每个服务器进程的数据及控制信息。 Oracle 服务器进程为客户机请求提供服务。每个服务器进程都有自己专用的 PGA,其 PGA 在服务器进程启动时创建,对 PGA 的访问权限仅限于该服务器进程,并且只能由代表该服务器进程的 Oracle 代码对 PGA 进行读写。

Oracle DB 使用初始化参数来创建和管理内存结构。管理内存的最简单的方法是允许数据库自动管理和优化内存。要做到这一点(以下操作适用于大多数平台),只需设置目标内存大小初始化参数 (MEMORY_TARGET) 和最大内存大小初始化参数(MEMORY_MAX_TARGET)。

数据库缓冲区高速缓存

在这里插入图片描述 数据库缓冲区高速缓存是 SGA 的一部分,用于存放从数据文件读取的数据块的副本。并行连接到实例的所有用户共享对数据库缓冲区高速缓存的访问。 Oracle DB 用户进程第一次需要特定数据片段时,将在数据库缓冲区高速缓存中搜索数据。 如果该进程在高速缓存中找到数据(称为高速缓存命中),则直接从内存中读取数据。如果进程在高速缓存中找不到数据(称为高速缓存未命中),则在访问数据之前,必须将磁盘上的数据文件中的数据块复制到高速缓存中的缓冲区中。高速缓存命中时访问数据要比高速缓存未命中时访问数据快。 高速缓存中的缓冲区由一个复杂算法管理,该算法组合使用最近最少使用 (LRU) 列表和停靠计数机制。

重做日志缓冲区

在这里插入图片描述 重做日志缓冲区是 SGA 中的循环缓冲区,用于存放有关对数据库所做更改的信息。此信息存储在重做条目中。重做条目包含重建(或重做)由 DML、 DDL 或内部操作对数据库进行的更改所需的信息。如果需要,将使用重做条目进行数据库恢复。 服务器进程更改缓冲区高速缓存时,系统会生成重做条目,并将生成的重做条目写入SGA 中的重做日志缓冲区。重做条目占用缓冲区中连续的顺序空间。 LGWR 后台进程将重做日志缓冲区写入磁盘上的活动重做日志文件(或文件组)中。

共享池

在这里插入图片描述 SGA 的共享池部分包含库高速缓存、数据字典高速缓存、 SQL 查询结果高速缓存、PL/SQL 函数结果高速缓存、并行执行消息的缓冲区以及控制结构。 “数据字典”是数据库表和视图(它们包含有关数据库、数据库结构及其用户的参考信息)的集合。在 SQL 语句语法分析期间, Oracle DB 会频繁访问数据字典。该访问操作对于Oracle DB 的持续操作来说至关重要。 Oracle DB 对数据字典的访问十分频繁,因此在内存中指定了两个特殊的位置来存放字典数据。 一个区域称为“数据字典高速缓存”,也称为“行高速缓存”,因为它以行的形式存放数据,而不是以缓冲区的形式存放数据(缓冲区用于存放完整的数据块)。内存中的另一个用于存放字典数据的区域称为“库高速缓存”。所有 Oracle DB 用户进程都共享这两个高速缓存以便访问数据字典信息。 Oracle DB 使用共享 SQL 区域(以及 PGA 中保留的专用 SQL 区域)来表示它所运行的每个 SQL 语句。 Oracle DB 可识别两个用户执行相同 SQL 语句的情况,从而为这些用户重用共享 SQL 区域。 “共享 SQL 区域”包含给定 SQL 语句的语法分析树和执行计划。 Oracle DB 通过为多次运行的 SQL 语句使用一个共享 SQL 区域来节省内存。当许多用户运行同一个应用程序时,同一 SQL 语句通常会多次运行。 对新的 SQL 语句进行语法分析时, Oracle DB 会从共享池中分配内存,以便在共享 SQL区域中存储该语句。该内存的大小取决于语句的复杂性。 Oracle DB 处理 PL/SQL 程序单元(过程、函数、程序包、匿名块和数据触发器)的方式与它处理单个 SQL 语句的方式十分相似。 Oracle DB 分配一个共享区域以存放程序单元在经过语法分析和编译之后的形式。 Oracle DB 分配一个专用区域,以便存放特定于运行程序单元的会话的值,包括局部变量、全局变量和程序包变量(也称为“程序包实例化”),并且存放用于执行 SQL 的缓冲区。如果多个用户运行同一个程序单元,则所有用户都使用同一个共享区域,但维护其各自专用 SQL 区域的单独副本,以便存放特定于其自身会话的值。 PL/SQL 程序单元中包含的单个 SQL 语句的处理方式与其它 SQL 语句的处理方式类似。 无论这些 SQL 语句在 PL/SQL 程序单元中的来源如何,它们都使用共享区域来存放其语法分析表示,并且为运行语句的每个会话使用一个专用区域。 SQL 查询结果高速缓存和 PL/SQL 函数结果高速缓存是 Oracle Database 11g 中新增的功能。 它们共享相同的基础结构,出现在相同的动态性能 (V$) 视图中,并且使用所提供的同一程序包进行管理。 查询的结果和查询片段的结果可以高速缓存在“ SQL 查询结果高速缓存”的内存中。这样,数据库可以在以后执行这些查询和查询片段时使用高速缓存结果进行回答。由于从SQL 查询结果高速缓存中检索结果要比重新运行查询快得多,因此将频繁运行的查询的 结果缓存起来可以大大提高这些查询的性能。 如果计算的输入是 PL/SQL 函数发出的一个或若干个参数化查询,则有时会使用该函数来返回计算结果。在某些情况下,这些查询访问很少更改的数据(与调用函数的频率相比)。 可以在 PL/SQL 函数的源文本中包括语法,以请求将函数结果缓存在“ PL/SQL 函数结果高速缓存”中,并且在表列表中的表遇到 DML 时清除高速缓存(以确保正确无误)。

大型池

在这里插入图片描述 数据库管理员可以配置称为“大型池”的可选内存区,以便为以下对象提供大型内存分配: • 共享服务器的会话内存和 Oracle XA 接口(在事务处理与多个数据库交互时使用) • I/O 服务器进程 • Oracle DB 备份和还原操作 通过从大型池中为共享服务器、 Oracle XA 或并行查询缓冲区分配会话内存, Oracle DB可以主要使用共享池来缓存共享 SQL,并避免由于收缩共享 SQL 高速缓存而导致的性能开销。 此外,用于 Oracle DB 备份和还原操作、 I/O 服务器进程以及并行缓冲区的内存以数百 KB的缓冲区进行分配。与共享池相比,大型池可以更好地满足此类大型内存请求。 大型池没有 LRU 列表。它与共享池中的保留空间不同,后者与从共享池中分配的其它内存使用相同的 LRU 列表。

java池和流池

在这里插入图片描述 存储 JVM 中所有特定于会话的 Java 代码和数据的服务器内存使用 Java 池内存。 Java 池内存的使用方式有多种,具体取决于 Oracle DB 的运行模式。 Java 池指导统计信息提供了用于 Java 的库高速缓存内存的相关信息,并预测 Java 池大小的变化如何影响语法分析速率。当 statistics_level 设置为 TYPICAL 或更高值时,将在内部打开 Java 池指导。关闭该指导时,将重置这些统计信息。 流池由 Oracle Streams 独占使用。流池存储缓冲的队列消息,并且为 Oracle Streams 捕获进程和应用进程提供内存。 除非对流池进行专门配置,否则其大小从零开始。当使用 Oracle Streams 时,池大小会根据需要动态增长。

程序全局区(PGA)

在这里插入图片描述 程序全局区 (PGA) 是一个专用内存区,其中包含服务器进程的数据及控制信息。每个服务器进程都有独立的 PGA。 PGA 只能由相应的服务器进程访问,并且只有代表该服务器进程的 Oracle 代码可以读取它。开发人员的代码不能访问 PGA。 每个 PGA 都包含堆栈空间。在专用服务器环境中,连接到数据库实例的每个用户都有单独的服务器进程。对于这种类型的连接, PGA 包含一个名为用户全局区 (UGA) 的内存细分部分。 UGA 包括以下部分: • 游标区,用于存储游标的运行时信息 • 用户会话数据存储区,用于存储有关会话的控制信息 • SQL 工作区,用于处理 SQL 语句,其中包括: