Oracle体系结构详解

2024年 2月 21日 36.3k 0

一、 Oracle数据库服务器

数据库在各个行业都会有使用到;其实,我们平时无论是在与客户沟通或者交流中,所说的Oracle数据库是指Oracle数据库服务器(Oracle Server),它由Oracle实例(Oracle Instance)和Oracle数据库(Oracle Database)组成。
Oracle实例:就是用于与数据库进行交互的一片内存区域和后台进程的集合;实例启动时,系统首先在服务器内存中分配系统全局区(System Global Area),构成Oracle内存结构,然后启动必须的常驻内存的操作系统进程,组成Oracle的进程结构,内存结构和进程结构即构成Oracle实例。
Oracle数据库:物理文件的集合,包括数据文件、重做日志文件、控制文件、参数文件、密码文件、归档日志文件、备份文件、告警日志文件、跟踪文件等等;其中数据文件、控制文件、重做日志文件和参数文件是必须的,其他文件可选。
一个实例只能对应/操作一个数据库,一个数据库可以由一个或多个实例操作(比如RAC)。

二、 Oracle实例

Oracle实例就是用于与数据库进行交互的一片内存区域和后台进程的集合,一个单独的数据库可以被多个实例访问,Oracle早期的并行服务器OPS演变到现在普遍使用RAC集群架构。
实例启动时,系统首先在服务器内存中分配系统全局区(System Global Area),构成Oracle内存结构,然后启动必须的常驻内存的操作系统进程,组成Oracle的进程结构,内存结构和进程结构即构成Oracle实例。实例在操作系统中用ORACLE_SID来标识,在Oracle中用参数实例名(Instance Name)来标识, 它们两个的值是相同的。下面介绍实例的组成和作用:

1、系统全局区(System Global Area)

系统全局区System Global Area(SGA)是系统分配的共享的内存结构, 当数据库实例启动时,SGA的内存被自动分配;当数据库实例关闭时,SGA内存被回收;SGA可以包含一个数据库实例的数据或控制信息。当多个用户连接到同一个数据库实例时,在实例的SGA中,数据可以被多个用户共享;SGA是占用内存最大的一个区域,同时也是影响数据库性能的重要因素。SGA主要包括:

1)、共享缓冲区(Shared Pool)

共享池(Shared Pool)就是我们常说的SQL共享池,它还包括库缓冲区(Library Cache)和数据字典缓冲区(Data Dictionary Cache);共享缓冲区大小由参数SHARED_POOL_SIZE设定。

a)、库缓冲区:存储对数据库进行操作的语句信息,包括执行计划及运行数据库的SQL语句的语法分析树,所有用户在第二次运行相同的SQL语句时,可以利用SQL共享池中可用的语法分析信息来加快执行速度;库缓冲区通过最近最少使用(LRU,LeastRecentlyUsed)算法来管理可用空间,当SQL共享池填满时,将从库缓存区中删掉最近最少使用的执行路径和语法分析树,以便为新的条目腾出空间;如果SQL共享池太小,语句将被连续不断地再装入到库缓存区,从而影响操作性能。
b)、数据字典缓冲区(Database Buffer Cache):数据库对象的信息存储在数据字典表中,这些信息包括用户帐号数据、权限、数据文件名、段名、表结构及表说明等,当数据库需要这些信息(如用户对表是否有读写权限)时,将读取数据字典表且将返回的数据存储在字典缓存区中。数据字典缓冲区使用最近最少使用(LRU,LeastRecentlyUsed)算法来管理,数据字典缓存区的大小由数据库内部管理,如果字典缓存区太小,数据库需要反复查询数据字典表以获取访问数据库所需的信息,这些查询由循环调用(recuesivecall)事件完成。

2)、数据库缓冲区(Database Buffer Cache)

数据库缓冲区由DB_CACHE_SIZE参数设定,Oracle使用最近最少使用(LRU,LeastRecentlyUsed)算法来管理数据库缓冲区可用空间;当存储区需要空闲空间时,最近最少使用块将被移出,新数据块将在存储区代替它的位置,通过这种方法,将最频繁使用的数据保存在存储区中;如果SGA的大小不足以容纳所有最常使用的数据,那么,不同的对象将争用数据库缓存区中的空间;当多个应用程序共享同一个SGA时,很有可能发生这种情况。此时,每个应用的最近使用段都将与其他应用的最近使用段争夺SGA中的空间,这样,数据库缓冲区的数据请求将出现较低的命中率,导致系统性能下降。

3)、重做日志缓冲区(Redo Log Buffer Cache)

Redo log包含所有的数据库变化历史,数据库的所有操作变化,均按照写入重做日志缓冲区先于数据块缓冲区、写入重做日志文件先于写入数据文件;当发生提交动作时,将重做日志缓冲区变化刷到重做日志文件。在被写入联机重做日志文件之前,事务首先被记录在称作重做日志缓冲区(Redo Log Buffer)的SGA中,数据库可以周期地分批向联机重做日志文件中写重做项的内容,从而优化这个操作。重做日志缓冲区的大小(以字节为单位)由LOG_BUFFER参数决定。

4)、大池(Large Pool)

大池属于一个可选内存区,如果数据库使用线程服务器选项或频繁执行备份、恢复操作,只要创建一个大池,就可以更有效地管理这些操作。大池将致力于支持大型SQL命令,利用大池,就可以防止这些大型SQL命令争用SQL共享池,从而减少再装入到库缓存区中的语句数量。大池的大小(以字节为单位)由LARGE_POOL_SIZE参数设置,可以使用LARGE_POOL_MIN_ALLOC参数设置大池的最小分配,可以使用SHARED_POOL_RESERVED_SIZE参数为SQL大型语句保留一部分SQL共享池。

5)、Java池(Java Pool)

Java池为Java命令提供语法分析,Java池的大小(以字节为单位)由JAVA_POOL_SIZE参数设置,缺省值为10MB。

6)、多缓冲池

可以在SGA中创建多个缓冲池,能够用多个缓冲池把大数据集与其他的应用程序分开,以减少数据库缓存区内相同资源争用;对于创建的每一个缓冲池,都要设定LRU锁存器的大小和数量,缓冲区的数量必须至少比LRU锁存器的数量多50倍。创建缓冲池时,需要设定保存区(KeepArea)的大小和再循环区(RecycleArea)的大小,与SQL共享池的保留区一样,保存区保持条目,而再循环区则被频繁地再循环使用。使用BUFFER_POOL_KEEP参数规定来保存区的大小。

2、后台进程(Background Process)

数据库实例由内存结构和后台进程,应用与数据库的所有操作和交互都由数据库实例中完成,SGA可以理解为交互平台,后台进程则可以理解为SGA与数据库交互的桥梁。PMON、SMON、DBWRn、LGWRn、CKPT进程为必须的后台进程,ARCHn、LCKn等为可选后台进程。

1)、PMON (Process Monitor,进程监控进程)

PMON用于在用户进程出现故障时进行恢复,清除失效的用户进程,负责清理内存区域和释放该进程所使用的资源,如果会话不正常终止时,PMON负责Rollback未提交的事务,释放资源;同时监控Oracle所有后台进程(Background Process)。PMON有规律地被呼醒,检查是否需要,或者其它进程发现需要时可以被调用。PMON进程要重置活动事务表的状态,释放锁,将该故障的进程的ID从活动进程表中移去。PMON还周期地检查调度进程(DISPATCHER)和服务器进程的状态,如果已死,则重新启动(不包括有意删除的进程)。

2)、SMON(System Monitor Process,系统监控进程)

SMON进程在实例启动时,如果有需要则执行实例恢复,在实例恢复过程中,如果由于文件读取错误或所需文件处于脱机状态而导致某些异常终止的事务未被恢复,SMON 将在表空间或文件恢复联机状态后再次恢复这些事务。SMON还负责清理不再使用的临时段(temporary segment)以及为数据字典管理的表空间(dictionary managed tablespace)合并相邻的可用数据扩展(extent)。在具有并行服务器选项的环境下(RAC),SMON对有故障CPU或实例进行实例恢复(Instance Recovery)。SMON进程有规律地被呼醒,检查是否需要,或者其它进程发现需要时可以被调用。

3)、DBWn (database writer,数据库写入进程)

DBWn进程是负责缓冲存储区管理的一个Oracle后台进程,通过使用最近最少使用(LRU,LeastRecentlyUsed)算法来管理,保持内存中的数据块是最近使用的,使I/O最小,将dirty buffer写入到datafile中,维护数据缓冲区的清理,以使用户进程总能找到足够的空闲缓冲区。DBWn进程用于将数据缓冲的数据写入数据文件,是负责数据缓冲区管理的一个Background Process,默认数量1个,最多10个,由参数为db_writer_processes设置。DBWn进程在以下情况触发:

a)、没有空闲缓冲区(no free buffers)
b)、达到脏缓冲区阀值(dirty buffer threshold reached)
c)、检查点(checkpoint)
d)、表空间offline(tablespace offline)
e)、超时,每次3秒(time out)
f)、drop/truncate表(drop table/truncate table)

4)、LGWR(Log writer,日志写入进程)

LGWR进程将日志缓冲区写入磁盘上的一个日志文件,它是负责管理日志缓冲区的一个Oracle后台进程。LGWR进程同步地写入到活动的镜象在线日志文件组。如果组中一个文件被删除或不可用,LGWR可继续地写入该组的其它文件。日志缓冲区是一个循环缓冲区,当LGWR将日志缓冲区的日志项写入日志文件后,服务器进程可将新的日志项写入到该日志缓冲区。LGWR 通常写得很快,可确保日志缓冲区总有空间可写入新的日志项。
Oracle使用快速提交机制,当用户发出Commit语句时,一个Commit记录立即放入日志缓冲区,但相应的数据缓冲区改变是被延迟,直到在更有效时才将它们写入数据文件。当一事务提交时,被赋给一个系统修改号(SCN),它同事务日志项一起记录在日志中。由于SCN记录在日志中,以致在并行服务器选项配置情况下,恢复操作可以同步。有时候当需要更多的日志缓冲区时,LWGR在一个事务提交前就将日志项写出,而这些日志项仅当在以后事务提交后才永久化。LGWR进程管理日志缓冲区,将数据库的更改写入日志文件,以便维护数据的一致性,并为数据丢失后进行恢复提供依据。Oracle通过延迟写日志来优化disk I/O读写,以下4种情况之一Oracle会触发LGWR进程写日志:

a)、当用户进程提交一事务时写入一个提交记录。
b)、每三秒将日志缓冲区输出。
c)、当日志缓冲区的1/3已满时将日志缓冲区输出。
d)、当DBWR将修改缓冲区写入磁盘时则将日志缓冲区输出。

5)、CKPT (CheckPoint,检查点进程)

CKPT进程负责通知DBWRn和LGWRn将脏缓冲区写入磁盘,以及时消除因DBWRn/LGWRn延迟写所造成的数据不一致情况,确保内存中的数据块被规律地写入文件,并对数据库数据库控制文件和数据文件进行更新同步(修改文件时间头部),以记录下当前的数据库结构和状态。检查点(CheckPoint)的作用是及时保证进行延迟写,防止数据库出现不一致情况;及时同步各类数据文件,防止各类数据文件出现不一致情况。LGWR后台进程是将log buffer中的数据写到日志文件的进程,是oracle相当重要的一个后台进程,LGWR进程触发的条件为以下4种情况之一:

a)、每3秒钟;也就是该进程最多休眠3秒钟,休眠时触发rdbms ipc message事件; LGWR将buffer中的数据写到日志文件时,触发log file parallel write事件;
b)、在事务提交时(COMMIT),此时会触发LGWR进程写完后才返回提交成功,在等待LGWR进程写的过程中将触发log file sync事件;
c)、DBWn进程写入数据文件之前;
d)、Redo log Buffer三分之一满时,这个数字是有一个隐含参数_log_io_size控制,该值的默认值是log buffer大小的1/3;该值的最大值为3MB,所以Redo log buffer多于1MB的变化记录时也会触发LGWR进程写;
由于Oracle中LGWR和DBWR工作的不一致,Oracle引入了检查点的概念,用于同步数据库,保证数据库的一致性。在Oracle里面,检查点分为两种:完全检查点和增量检查点。下面我们分别介绍这两种检查点的作用:
a)、完全检查点
在Oracle8i之前,数据库的发生的检查点都是完全检查点,完全检查点会将数据缓冲区里面所有的脏数据块写入相应的数据文件中,并且同步数据文件头和控制文件,保证数据库的一致。完全检查点在8i之后只有在下列两种情况下才会发生:
1)、DBA手工执行alter system checkpoint的命令;
2)、数据库正常shutdown(immediate,transcational,normal)。
由于完全检查点会将所有的脏数据库块写入,巨大的IO往往会影响到数据库的性能。因此Oracle从8i开始引入了增量检查点的概念。
b)、 增量检查点
Oracle从8i开始引入了检查点队列这么一种概念,用于记录数据库里面当前所有的脏数据块的信息,DBWR根据这个队列而将脏数据块写入到数据文件中。检查点队列按时间先后记录着数据库里面脏数据块的信息,里面的条目包含RBA(Redo Block Address,重做日志里面用于标识检查点期间数据块在重做日志里面第一次发生更改的编号)和数据块的数据文件号和块号。在检查点期间不论数据块更改几次,它在检查点队列里面的位置始终保持不变,检查点队列也只会记录它最早的RBA,从而保证最早更改的数据块能够尽快写入。当DBWR将检查点队列里面的脏数据块写入到数据文件后,检查点的位置也要相应地往后移,CKPT每三秒会在控制文件中记录检查点的位置,以表示Instance Recovery时开始恢复的日志条目,这个概念称为检查点的“心跳”(heartbeat)。检查点位置发生变更后,Oracle里面通过4个参数用于控制检查点位置和最后的重做日志条目之间的距离。在这里面需要指出的是,多数人会将这4个参数看作控制增量检查点发生的时间。事实上这是错误的,这4个参数是用于控制检查点队列里面的条目数量,而不是控制检查点的发生。

6)、ARCH(archiver,归档进程)

ARCH进程用于管理归档日志文件,当数据库运行在archivelog模式下时,将循环使用的redo log文件组在被复写覆盖前进行归档备份到其他指定存储设备,为数据丢失后进行数据恢复。当Redo Log日志切换时触发ARCH进程进行日志归档。

7)、RECO(Recovery,恢复进程)

RECO进程是在具有分布式选项时所使用的一个进程,自动地解决在分布式事务中的故障,维持在分布式环境中的数据的一致性。主要工作,就是recover那些两阶段提交的但由于网络或其它原因造成状态为prepared 的挂起事务。一个结点RECO后台进程自动地连接到包含有悬而未决的分布式事务的其它数据库中,RECO自动地解决所有的悬而不决的事务。任何相应于已处理的悬而不决的事务的行将从每一个数据库的悬挂事务表中删去。当某些节点反馈yes给事务协调器可以提交时,但事务协调器还未正式发出可以提交的最后指示时,由于网络的原因,这些节点失去了和事务协调节点的联系,此时这些事务就成为了一个in-doubt distributed transaction。此时,RECO就负责定期的联系事务协调器,当联系到时,就会提交或者回滚这些事务了。RECO后台进程仅当在允许分布式事务的系统,而且DISTRIBUTED_TRANSACTIONS参数是大于0时会用到该后台进程。

8)、LCKn (lock,锁进程)

LCKn进程是在具有并行服务器选件环境下使用,用于实例间的封锁,可多至10个进程(LCK0,LCK1……,LCK9)。

9)、Dnnn (dispatcher,调度进程)

Dnnn进程允许用户进程共享有限的服务器进程(SERVER PROCESS)。没有调度进程时,每个用户进程需要一个专用服务进程(DEDICATEDSERVER PROCESS)。对于多线索服务器(MULTI-THREADED SERVER)可支持多个用户进程。如果在系统中具有大量用户,多线索服务器可支持大量用户,尤其在客户_服务器环境中。在一个数据库实例中可建立多个调度进程,对每种网络协议至少建立一个调度进程,数据库管理员根据操作系统中每个进程可连接数目的限制决定启动的调度程序的最优数,在实例运行时可增加或删除调度进程。如果不能将客户应用连接到一调度进程时,网络接收器进程将启动一个专用服务器进程。该网络接收器进程不是Oracle实例的组成部分,它是处理与Oracle有关的网络进程的组成部分。在实例启动时,该网络接收器被打开,为用户连接到Oracle建立一通信路径,然后每一个调度进程把连接请求的调度进程的地址给予它的接收器。当一个用户进程作连接请求时,网络接收器进程分析请求并决定该用户是否可使用一调度进程。如果是,该网络接收器进程返回该调度进程的地址,之后用户进程直接连接到该调度进程。有些用户进程不能调度进程通信(如果使用SQL*NET以前的版本的用户),网络接收器进程不能将此用户连接到一调度进程。在这种情况下,网络接收器建立一个专用服务器进程,建立一种合适的连接。

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论