Code前端首页关于Code前端联系我们

Oracle架构简析:Instance(实例)和Database(数据库)

terry 2年前 (2023-09-26) 阅读数 47 #数据库

Oracle的体系结构浅析:Instance(实例)和Database(数据库)

Oracle架构一般分为两部分:Instance(实例)和)ⶶDatabase(数据库)ⶶ。

如图1所示:

Oracle的体系结构浅析:Instance(实例)和Database(数据库)

图1 Oracle数据库架构

我们通常所说的oracle Server(Oracle Server)由Oracle实例和Oracle数据库组成,如图2所示:

Oracle的体系结构浅析:Instance(实例)和Database(数据库)

图2 Oracle Server

Oracle Instance实例主要包括SGA和一些后台进程(例如:PMON、SMON、DBWR、LGWR、CKPT等)。

SGA

SGA包含6个基本组件:共享池(库缓存、数据字典缓存)、数据库缓存、日志重做缓存、Java池、大池、流池。

下面将介绍这6个基本组件的功能。

1)共享区

  • 共享区是用于解析语法、编译和执行SQL和PL/SQL程序的内存区域。
  • 共享池由Library Cache、Data Dictionary Cache和Server Result Cache组成。

它们的作用是什么?

Library Cache:SQL 和 PL/SQL 的解析位置,存储已编译和解析的 SQL 和 PL/SQL 语句的内容,可供所有用户共享。

* 下次运行相同的SQL语句时,不需要解析,立即从库缓存中执行。

* 库缓冲区的大小决定了 SQL 语句编译和解析的频率,从而决定了性能。

* 库缓存包含两部分:SQL 共享池和 PL/SQL 共享池。

数据字典缓存:存储数据库中使用的重要数据字典信息。

* 数据字典是使用频率最高的,几乎所有的操作都需要查询数据字典。目前需要缓存来加速数据字典的访问,需要的时候可以访问内存。

* 数据字典缓存中的信息包括数据库文件、表、索引、列、用户、权限和其他数据库对象。

服务器结果缓冲区:存储服务器端 SQL 结果集和 PL/SQL 函数的返回值。

看完上面的解释,你可能会觉得有点抽象,所以下面我用一个例子来解释一下。

假设客户端发送的命令如下:

1

SELECT ename, sal ❝‶FROM♸ emp WHERE empno=7788 ;

如果这条语句是第一次录入数据库,则需要进行分析。分析过程分为硬分析和软分析。

  • 硬分析:检查语法、语义、权限、分析绑定变量等。最终生成执行计划;
  • 软分析:根据执行计划具体执行。如果是select语句,执行时返回一个结果集。如果是更新或删除命令,则不需要返回结果集。

库缓存将此 SQL 语句和执行计划加载到其中。
加载这些东西有什么作用?
下次您写出完全相同的句子(具有完全相同的标点符号、大小写和空格)时,无需进行硬分析。

快速问答:
如果此时客户端输入另一个命令:

1

select ❙mename, sal emp kde员工编号=7788;

你猜,这句话还需要分析吗?
答案:是的。

小提示:注意命令必须完全相同,以免解析。标点符号、大小写、空格等。它们一定是完全一样的!这就是经常写作的好处的体现。

前面说过,如果是select命令,执行时会返回一个结果集。结果集存储在哪里?

1

选择 重命名,sal zemp ❝其中empno= 7788;

执行该命令返回的结果集将存储在服务器的结果缓存中。

2)数据库缓存

  • 数据库缓存用于存储从磁盘数据文件读取的数据,由所有用户共享。
  • 服务器进程(server process)将加载的数据存储在缓冲存储器中。当后续请求需要数据时,可以在内存中找到,不需要从磁盘读取。

小记:逻辑读取速度(从内存读取)比物理读取速度(从磁盘读取)快一万倍,所以最好想办法尽可能从内存读取。
由此可见,缓冲内存的大小直接影响读取数据库的速度。

例如,当用户访问表中的一条记录时,数据库收到请求后,首先查看数据库缓存中是否存在该数据库表记录。如果需要的记录存在,则直接从内存中读取。将记录返回给用户(有效提高访问速度),否则只能从磁盘读取。

继续看上面的例子:

1

select mename, sal ❀zem❙‶❙‶whereempno=7788;

命令及其执行计划缓存在库中,但转储中包含的数据缓存在数据库中。

快速问答:
数据库缓存如何工作?

这是关于数据库缓存的设计思想。
块存储在磁盘上。文件有文件号,块也有块号。
访问磁盘上的块并不意味着CPU收到指令后直接访问磁盘。相反,它首先将块加载到内存数据库缓存中,生成副本,然后在内存中执行查询或添加、删除和编辑。复制进入运行。如图3所示。
另外,如果是添加或删除操作,操作后会产生脏块。脏块会在适当的时间写回到磁盘上的原始位置。请注意,它们不会立即注销。

您可能会问为什么不现在回信呢?
因为:
(1)减少物理IO;
(2) 可以共享。如果稍后访问该块,逻辑上可以直接将其读入内存。

Oracle的体系结构浅析:Instance(实例)和Database(数据库)
图3 访问数据块

快速问答:
为什么我们需要通过内存来访问数据块,而不是CPU直接访问磁盘?
答:因为相对于CPU来说,IO速度太低了。 CPU速度比IO速度快100万倍?如果CPU直接访问磁盘,会造成大量的IO等待,CPU利用率会很低。因此,使用速度相当(CPU速度比内存速度快100倍)的内存作为缓存,可以有效减少物理IO,提高CPU利用率。

然而,这里就出现了问题。如前所述,查询或添加、删除和编辑对内存中的副本进行操作。当增删改查产生脏块时,它们不会立即写回磁盘。

快速问答:
我们想象一下,当数据库缓存中存储了大量的脏块,这些脏块以后不会被写回磁盘时,系统出现故障(例如断电) )突然发生,内存中的数据丢失。此时磁盘上的块仍然存储着修改前的旧数据。这不是让之前的修改失效了吗?
如何保持事务一致性?
答:如果我们能够存储发送的记录,一旦缓存数据库中的数据发生变化,我们就可以立即就地写入并记录下来,不就能够保证事务的一致性了吗?

小提示:断电后实例将消失,实例内存中存储的数据将丢失。这就需要重做日志缓冲区发挥它的作用。

3)重做日志缓冲区

  • 日志条目(Redo Entries)记录所有数据库修改信息(包括DML和DDL)。一个重做条目记录数据库更改以用于数据库恢复目的。
  • 日志条目首先在日志缓冲区中生成。日志缓冲区较小,以字节为单位,并且极其重要。
  • 一旦数据库缓存中的数据发生更改,就会立即写入重做日志缓存。当Redo Log Buffer在内存中保留一定时间后,会被写入磁盘,然后归档(3级结构)。

4) 大区域(可选)

为大型后台进程操作分配的内存空间,与共享区域管理不同,主要用于共享服务
服务器会话内存、RMAN 备份与恢复、并行查询等..

5) Java Pool(可选)

为 Java 虚拟机和应用程序分配的内存空间,包括会话指定的所有 JAVA 代码和数据。

6) 流池(可选)

为流处理分配的内存空间。流技术的目的是为了在不同的数据库之间共享数据,
因此,它只对使用流数据库功能的系统才重要。

后台进程

在正式介绍后台进程之前,我们先简单介绍一下Oracle进程类型。

Oracle进程有三种类型:

  • 用户进程

客户端需要连接服务器,运行在客户端的进程就是用户进程,一般分为三种形式(sql*plus、应用程序、网络方法(OEM))。

  • 服务器进程

用户进程无法直接访问Oracle。它必须通过相应的服务器进程访问实例,然后访问数据库。
当用户登录Oracle服务器时,用户进程和服务器进程建立连接。

  • 后台进程

Oracle实例的重要组成部分。这将在下面详细解释。

小附录:
连接和会话
连接是指Oracle客户端与后台和后台进程(服务器进程)创建的TCP连接。如图4所示:

Oracle的体系结构浅析:Instance(实例)和Database(数据库)

图4 连接

连接过程可简单描述如下:

1.首先建立TCP连接,Oracle会验证用户身份,进行安全审计等;
2.通过后,Oracle Server进程将允许客户端使用Oracle提供的服务;
3. 当Oracle连接建立后,就表示会话已经开始。连接断开后,Session打开后就消失了。

会话和连接相辅相成。会话信息将存储在 Oracle 数据字典中。
在图5中,您可以直观地看到连接和会话之间的区别。

Oracle的体系结构浅析:Instance(实例)和Database(数据库)

图5 连接与会话

后台进程(background process)主要包括:SMON(系统监控进程)、PMON(监控进程)、DBWR(数据库写入进程)、LGWR程序进程(日志写入)、CKPT(检查点过程)。

1)PMON(进程监视器)

PMON 的主要功能如下:

  • 监视各个 Oracle 后台进程是否正常,如果发现异常进程,将其删除并重新生成进程。
  • (注意:当用户进程断开连接时,服务器进程如果还保留着但仍然占用空间,则毫无用处。PMON 会定期检查服务器进程,如果无法连接到用户进程,PMON 会收回服务器进程过程中,空间会恢复PGA,里面的锁也会恢复。)
  • 观察空闲会话是否达到阈值。
  • 动态注册和监控。

2)SMON(系统监视器)

SMON 的主要功能如下:

  • 当 Oracle 在运行过程中突然出现故障时,需要在下次启动时恢复实例(Instance Recovery)。 SMON负责全面监控实例的恢复情况; 当Oracle在运行中突然崩溃时,下次Oracle实例启动时,SMON会清理其中一些未释放的资源;
  • SMON 还会在某些事务失败时清理它们;内存空间非常分散(连续),需要SMON来整合这个分散的空间;
  • 释放不再使用的临时段(Segment)。

3)DBWR(数据库写入器)

DBWn 是 Oracle 中要求最高的进程。主要功能如下:

  • 将脏块(Dirty Buffer)从数据库缓冲区写入数据文件。
  • 释放数据缓冲区缓存空间。

小提示:
如果数据库负载比较大,客户端请求较多,IO操作较多,需要频繁将缓存的内容写入磁盘文件,那么你目前可以配置多个DBWn(Oracle一共支持20个DBWn,DBW0-DBW9,DBWa-DBWg)。通常中小型Oracle只需要1个DBW0进程。

注意:当出现以下情况时,会启动 DBWR 进程将数据库缓冲区的内容写入数据文件:

  • 发生检查点
  • 没有空闲缓冲区
  • 发生超时
  • 发出 RAC ping 请求
  • 表空间离线
  • 表空间只读
  • 表删除启用‸启动禁用备份

小补充: 服务器进程对数据文件执行读操作而DBWR则负责对数据文件进行写操作。

快速问答:
DBWR 提交时会做什么?
答案:什么也不做!

4) LGWR ((LOG writer))

Oracle 实例中只有一个 LGWR 进程。该进程的工作与DBWR进程类似。主要功能如下:

将Redo Log Buffer的内容写入Redo Log Files(日志必须在DBWR写入脏块之前写入)。

(Redo Log Buffer 是一个循环 Buffer,对应的 Redo Log Files 也是一组循环文件。它会从文件头开始写入,当文件写满时,会再次从文件头开始写入,并且之前的内容会被覆盖,以避免覆盖重做日志文件,可以将其写入归档重做日志文件。)

注意:当出现以下情况时,LGWR进程将开始写入重做日志的内容用于重做日志文件的缓冲区:

  • 提交时
  • 当三分之一已满时
  • 当 1MB 重做可用时
  • 每三秒写入‾写入 DB

    1

    确保永久保留已提交的事务? ?
    答:以更新操作为例。 ? 。因此,提交成功后,更改将同步到磁盘并且不会丢失。

    5)CKPT(检查点)

    CKPT的主要功能如下:

    • 生成检查点,警告或督促DBWR写脏块;
    • * 完整的检查点:确保数据一致性。
    • * 增量检查点:不断更新检查点文件中的检查点位置。当实例发生故障时,可以尽可能减少实例恢复时间。更新数据集头中的检查点信息;更新检查点文件中的检查点信息。

    6) ARCn(存档器)

    • ARCn 是一个可选的后台进程(几乎被认为是必需的进程)。
    • Oracle可以运行在两种模式下:ARCHIVELOG MODE(归档模式)和NOARCHIVELOG MODE(不归档模式)。
    • DBA 必须做出的一个重要决定是将数据库配置为在 ARCHIVELOG 模式还是 NOARCHIVELOG 模式下运行。
    • 完成在线重做日志文件后,Oracle 实例将开始写入另一个在线重做日志文件。
    • 从一个联机重做日志文件切换到另一个联机重做日志文件的过程称为日志切换。

    ARCn 的主要功能如下:

    当 Oracle 以归档模式运行时

    • 每当执行日志切换时,ARCn 进程就会开始备份或归档一组已填充的日志。
    • ARCn 进程会在重做日志文件重新使用之前自动对其进行归档,从而保留对数据库所做的所有更改。

    这样,即使磁盘驱动器损坏,也可以将数据库恢复到故障点。

    通过上面的学习,首先更新图1如下:

    Oracle的体系结构浅析:Instance(实例)和Database(数据库)

    图6 Oracle数据库架构

    数据库

    数据库实际上是由许多物理数据文件组成,主要用于存储。数据库主要包含三类文件:数据文件、控制文件和重做日志文件。
    还有参数文件、密码文件、实现日志文件等。

    1)数据文件

    数据文件用于存储数据,表数据存储在数据文件中。

    2)控制文件

    Oracle提供了一些控制文件来处理数据文件。这些控制文件主要记录一些数据库控制信息。

    3)Redo log files(重做日志文件)

    重做日志文件,用于记录数据库中的更改。如果在数据库修改过程中向数据库插入数据或者修改数据库中的数据,则必须将修改前的状态和修改后的状态记录在重做日志文件中,重做日志文件的作用是恢复数据文件。
    * 举个例子:数据库中有一个事务需要发送,但是发送失败,事务会回滚,那么回滚事务的依据就来自于这些Redo Log Files。重做日志文件中数据库记录的更改。对于本次事务变更,如果需要回滚,必须删除Redo Log Files中的数据,并根据Redo Log Files中的数据将数据文件恢复到修改前的状态。

    4)参数文件(parameter file)

    每个数据库都必须有一个参数文件。这个参数文件规定了Oracle中一些基本参数和初始化参数的值。

    5) 归档日志文件

    归档日志文件和重复日志文件互为补充。重做日志文件实际上是一个重用过程。会有多个(通常是3个)固定文件,这些固定文件将依次应用。当它们已满时,Oracle 会重写文件头并刷新以前的内容。为了进一步提高数据库备份和恢复能力,这些修改的信息在被覆盖之前被归档到归档日志文件中。

    6) 密码文件

    用户客户端连接后端数据库系统时存储密码。

    快速问答:
    对应的实例与数据库关系是什么?

    答案:实例:数据库=n:1
    一个实例只能属于一个数据库,多个实例可以同时访问一个数据库。
    小补充: a a a

    > 实际上包含两部分:SGA 和 PGA。 sga (全局系统区(Global System Area)

    • 1个Oracle实例对应1个SGA。 SGA是在Oracle实例启动时分配的。 SGA是Oracle实例的核心组件。
    • 一个Oracle实例只有一个SGA。 SGA是一个非常大的内存空间,最多可以占用物理内存的80%。

    PGA(程序全局区域)

    • PGA 在服务器进程启动时分配。一个 Oracle 实例中可以有多个 PGA。例如,如果运行 10 个服务器进程,则将有 10 个 PGA。
    • PGA 存储用户游标、变量、控件、数据排序并存储哈希值。
    • 与SGA不同,PGA是独立的且非共享的。是分配给进程且该进程私有的内存池。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门