现在的位置: 首页 > 数据库 > 正文

Oracle系统体系结构

2014年12月11日 数据库 ⁄ 共 6348字 暂无评论 ⁄ 阅读 1,331 次
文章目录

Oracle系统体系结构由三部分组成:逻辑结构、物理结构和实例。逻辑结构指表空间、段、区和数据块等概念;物理结构指数据文件、日志文件、控制文件和参数文件等;实例是存储结构(SGA、PGA)和系统进程(dbwr、lgwr等)的集合。

oracle-system

Oracle实例

Oracle数据库实例可以理解为一个访问数据文件的程序,主要有两方面内容组成:内存结构和系统进程。数据库启动时,系统首先在服务器内存中分配系统全局区(SGA),构成了Oracle的内存结构;然后启动若干个常驻内存的操作系统进程,即组成了Oracle的进程结构,内存区域和系统进程合称为一个Oracle实例。

oracle-instance

—系统全局区SGA

SGA由一组内存组成(所有用户共享内存中的数据),实例启动时SGA的内存自动分配,实例关闭时SGA内存被收回。SGA是占用内存最大的一个区域,同时也是影响数据库性能的重要因素。主要包括share pool、db buffer cache、redo log buffer及large pool、java pool等。

Share Pool(共享池)

共享池又可分为library cache(库缓存)和data dictionary cache(数据字典缓存),存储数据库操作语句信息。

library cache(库高速缓存)可用于存储已执行过的SQL的执行计划及语法分析树等,这样在重复执行时就可避免语句解析过程了(详见“Oracle SQL语句执行流程与顺序原理解析”),可提升系统性能。

data dictionary cache(数据字典高速缓存)存储有关数据库(用户帐户数据、数据文件名、段名、区的位置、表的说明和用户权限)的信息,当服务器需要用到这类信息时,将会读取数据字典表,返回的数据将存储在数据字典高速缓存中。在语法分析阶段,服务器进程会在数据字典中查找用于解析对象名和验证访问的信息。数据字典高速缓存存储数据库中最近使用的数据字典表信息,这样在服务器使用到这些信息时就不需要对数据字典表进行反复的查询了。

共享池通过LRU算法来管理,当共享池填满时,将从库缓存区中删掉最近最少使用的执行计划和语法分析树,以便为新的条目腾出空间。如果共享池太小,语句将被连续不断地再装入到库缓存区,从而影响操作性能。

共享池的大小(以字节为单位)由init.ora文件参数SHARED_POOL_SIZE决定,数据字典高速缓存大小由共享池大小决定并由数据库内部管理。

db buffer cache(数据缓冲区)

数据缓冲区用来存储从数据库中读取到的数据块(如表、索引等),这样当后续再需要这些数据时就可以直接在内存中获取而不需要从磁盘读取,提升了读取速度。其具体作用原理可见“Oracle SQL语句执行流程与顺序原理解析”。它使用LRU(least recently used,最近最少使用)算法管理,大小由init.ora文件参数DB_BLOCK_SIZE决定。

如果SGA的大小不足以容纳所有最常使用的数据,那么,不同的对象将争用数据块缓存区中的空间。当多个应用程序共享同一个SGA时,很有可能发生这种情况。此时,每个应用的最近使用段都将与其他应用的最近使用段争夺SGA中的空间。其结果是,对数据块缓存区的数据请求将出现较低的命中率,导致系统性能下降。

redo log buffer(重做日志缓冲区)

重做日志缓冲区记录对数据库数据块的全部更改,主要用于在数据库故障时恢复数据。当redo log buffer大小的三分之一或写入量达到1M或超过三秒后或发生检查点时或者dbwr发生时都会触发lgwr进程把redo log buffer的数据写入磁盘上的redo file文件中,redo file至少有两个组,每个组至少有两个成员。在归档模式下,当一组redo file写满切换后,该组内容会写入archive log file。

large pool(大池)

大池是一个可选内存区,可分担共享池部分工作,主要用于备份恢复、大型I/O操作、并行查询等。如果使用线程服务器选项或频繁执行备份/恢复操作,只要创建一个大池,就可以更有效地管理这些操作。利用大池可以防止SQL大型命令把条目重写入SQL共享池中,从而减少再装入到库缓存区中的语句数量。可以用init.ora文件的SHARED_POOL_RESERVED_SIZE参数为SQL大型语句保留一部分SQL共享池。

java pool(java池)

java池为Java命令提供语法分析,Java池的大小(以字节为单位)通过由init.ora文件的JAVA_POOL_SIZE参数设置,默认设置为10MB。

—程序全局区PGA

PGA(Program Global Area)用于存放服务器进程的数据和控制信息,它是独立于SGA的一块内存区域。PGA是在用户进程连接到数据库并创建一个会话时自动分配的,保存每个与Oracle数据库连接的用户进程所需的信息。SGA是所有服务器进程都可共享那个的一块内存区域,而每个服务器进程都具有私有的PGA内存空间。

PGA一般包括:private sql area(专用SQL区)、session memory(会话内存)和sql work areas(SQL工作区)等。

private sql area(专用SQL区)

专用SQL区的位置取决于为会话建立的连接类型,在专用服务器环境中,专用SQL区位于各自服务器进程的PGA中;在共享服务器环境中,专用SQL区位于SGA中。管理专用SQL区是用户进程的职责,用户进程可以分配的专用SQL区的数目始终由初始化参数OPEN_CURSORS来限制,该参数的默认值是50。

专用SQL区包含绑定信息和运行时内存结构之类的数据。发出SQL语句的每个会话均拥有一个专用SQL区。提交同一SQL语句的每个用户都拥有自己的使用单个共享SQL区的专用SQL区。因此,许多专用SQL区都与同一个共享SQL区相关联。

session memory(会话内存)

会话内存包含为保留会话变量以及与该会话相关的其它信息而分配的内存,对于共享服务器环境,该会话是共享的而不是专用的。

sql work areas(SQL工作区)

SQL工作区用于大量占用内存的操作,如排序、散列联接、位图合并和位图创建,工作区的大小可进行控制和调整。

—Oracle进程

Oracle进程可分为用户进程、服务器进程和后台进程。

用户进程

用户进程在数据库用户请求连接到Oracle服务器时启动,用户进程并不与Oracle服务器直接进行交互操作,而是通过用户程序接口(UPI)生成各种调用,用户程序接口则可以创建会话并启动服务器进程。用户进程位于客户端,服务器进程、后台进程位于服务器端。

服务器进程

当用户连接至oracle数据库实例创建会话时即产生服务器进程,服务器进程用于处理连接到该实例的用户进程的请求。服务器进程可以是专用服务器进程或共享服务器进程,在专用服务器环境中,服务器进程只处理一个用户进程的请求。用户进程断开连接后,服务器进程就会终止。在共享服务器环境中,服务器进程将处理多个用户进程的请求。服务器进程可以通过 Oracle 程序接口(OPI)与 Oracle 服务器进行通信。

后台进程

Oracle实例启动时即创建一系列后台进程,是Oracle数据库为了保持最佳系统性能和协调多个用户请求而设置的。常见的后台进程有DBWR、LGWR、CKPT、SMON、PMON、RECO、ARCH等。

DBWR

该进程将db buffer cache数据写入数据文件,是负责缓冲存储区管理的一个Oracle后台进程。当db buffer中数据块被修改,会被记入dirty list。当需要从数据文件读入的块无法在db buffer中找到足够空间时,dbwr将dirty数据写入数据文件以满足读入需求。DBWR管理缓冲存储区,使用户进程总可得到未用的缓冲区。

以下情况发生时,dbwr将db buffer中数据写入数据文件:

  • dirty list达到临界值,该临界长度是为参数DB-BLOCK-WRITE-BATCH的值的一半;
  • 服务器进程在LRU表中查找DB-BLOCK-MAX-SCAN-CNT缓冲区时,没有查到未用的缓冲区;
  • DBWR在3秒内未活动,出现超时;
  • 发出检查点,如:日志切换或手工操作“alter system checkpoint local;”;
  • 删除或截断表;
  • 使表空间处于只读模式;
  • 使一般表空间或临时表空间处于脱机状态(ALTER TABLE … OFFLINE NORMAL);
  • 开始表空间备份(ALTER TABLESAPCE ...BEGIN  BACKUP);
  • 实时应用集群(RealApplicationClusters,RAC)环境中出现ping请求;

LGWR

该进程将redo log buffer写入磁盘上redo log lists,重做日志以组的形式存在,至少应该有两个组,每个组至少有一个文件(多文件放在多磁盘是为了安全性,多文件写的内容完全一样),在一组里的每一重做日志文件称为成员。重做日志以循环方式使用,当一个重做日志组写满时,lgwr进程将移动到下一个组,若此时是归档模式则写满的组内容将拷贝到archive log list(归档日志)中。

以下情况时,lgwr将redo log buffer中数据写入redo log list:

  • 当commit事务发生;
  • 当重做日志缓冲区1/3已满;
  • lgwr超过3秒未活动;
  • 当重做日志缓冲区记录超过1M时;
  • 在dbwr将db buffer中数据块写入data file之前;

CKPT

CKPT,用于发出检查点(CheckPoint),检查点会同步数据库的数据文件和控制文件、重做日志)。当发出检查点时,后台进程CKPT将检查点时刻的SCN(System Change Number)写入到控制文件和数据文件头部,同时会促使后台进程DBWR将所有的脏缓冲区写入到数据文件中。LGWR也会将重做日志缓冲区写入到重做日志,从而确保数据文件、控制文件、重做日志的一致性。

启动检查点的原因有:

  • 确保定期向磁盘写入内存中发生修改的数据块,以便在系统或数据库失败时不会丢失数据;
  • 缩短例程恢复所需的时间,只需处理最后一个检查点后面的重做日志条目以启动恢复操作;
  • 确保提交的所有数据在关闭期间均已写入数据文件;

检查点分为两种:完全检查点和增量检查点。

完全检查点

将数据缓冲区里面所有的脏数据块写入相应的数据文件中,并且同步数据文件头和控制文件,保证数据库的一致。由于完全检查点会将所有的脏数据库块写入,巨大的IO往往会影响到数据库的性能。完全检查点只有在两种情况下触发:

  • 手工执行alter system checkpoint的命令;
  • 数据库正常shutdown(immediate,transcational,normal)。

增量检查点

Oracle从8i开始引入了检查点队列这一概念,用于记录数据库里面当前所有的脏数据块的信息,DBWR根据这个队列而将脏数据块写入到数据文件中。检查点队列按时间先后记录着数据库里面脏数据块的信息,里面的条目包含RBA(Redo Block Address,重做日志里面用于标识检查点期间数据块在重做日志里面第一次发生更改的编号)和数据块的数据文件号和块号。在检查点期间不论数据块更改几次,它在检查点队列里面的位置始终保持不变,检查点队列也只会记录它最早的RBA,从而保证最早更改的数据块能够尽快写入。当DBWR将检查点队列里面的脏数据块写入到数据文件后,检查点的位置也要相应地往后移,CKPT每三秒会在控制文件中记录检查点的位置。增量检查点的触发条件:

  • 日志切换(包括手动:ALTER SYSTEM SWITCH LOGFILE,手动归档应该也可以);
  • 热备;
  • 当运行ALTER TABLESPACE/DATAFILE READ ONLY;

SMON

该进程实例启动时,执行实例恢复,还负责清理不再使用的临时段。在具有并行服务器选项的环境下,SMON对有故障CPU或实例进行实例恢复。SMON进程有规律地被呼醒,检查是否需要,或者其它进程发现需要时可以被调用。

具体作用可用为3方面:例程恢复(instance recovery)、合并空闲空间、回收临时段。其中,instance recovery又包括:

  • 前滚重做日志中的更改,将已提交但仅提交到redo log中而未提交到data file中的数据;
  • 打开数据库供用户访问;
  • 回退未提交的事务处理;

PMON

用于监视服务器进程的执行,并且在服务器进程失败时清除该服务器进程。用户例程意外终止运行时,PMON可以轮询检测该服务进程,并执行以下操作:

  • 回退用户的当前事务处理
  • 释放当前保留的所有表锁或行锁
  • 释放用户当前保留的其它资源
  • 重新启动已失效的调度程序

ARCH

用于将写满的redo log list复制到archive log lists中。

Oracle逻辑结构体系

oracle-logic-sys

Oracle的逻辑结构主要由表空间、段、区和数据块等概念组成。

数据块(block)

数据块是Oracle最小的I/O单位及存储单位,一个Oracle数据块通常是OS块(操作系统块)的整数倍。数据块的结构包括:header(块头)、table directory(表目录)、row directory(行目录)、free space(自由空间)和row data(行数据)。

  • header(块头):存放块的基本信息,如块的物理地址,块所属段类型(表段、索引段等);
  • table directory(表目录):存放块行所属数据表的信息;
  • row directory(行目录):存放块行的信息,如行的地址等,行目录所占空间并不会随数据行被delete而收回,只有在重新insert时才可重新利用;
  • free space(自由空间):空余空间是一个块中未使用的区域,这片区域用于新行的插入和已经存在的行的更新。
  • 行数据(Row Data:是真正存放表数据和索引数据的地方,这部分空间是已被数据行占用的空间。

数据区(extent)

区块是Oracle最小的空间分配单元,它由相邻的块组成,区不会跨数据文件。注意,区块是逻辑概念,不同于分区(数据段)。

段(segment)

段用于存放特定的逻辑对象(表、索引等)数据,它由一个或多个区组成。常见段如:表段、索引段、回滚段、临时段等,一个逻辑对象可能由多个段组成,一个段只能属于一个逻辑对象。段内包含的数据区可以不连续,并且可以跨越多个文件。

表空间(tablespace)

表空间是数据库的逻辑组成部分,任何对象都必须存储于某个表空间,一个表空间可能由一个或多个数据文件组成。

Oracle物理结构

Oracle物理结构包括数据文件、日志文件、控制文件和参数文件等。

数据文件

每个Oracle数据库有一个或多个数据文件,数据文件大小一旦建立就不能再更改大小(表空间可以,因为表空间是逻辑概念)。

日志文件

每个数据库至少有两个日志文件组,日志文件记录了数据库的全部修改,主要是保护数据库以防止故障。为防止日志文件故障可给每个日志文件组加两个或以上成员并放置在不同的磁盘上。

控制文件

每个ORACLE数据库有一个控制文件(controlfile),它记录数据库的物理结构,包含下列信息类型:

  • 数据库名;
  • 数据库数据文件和日志文件的名字和位置(当数据文件或日志文件所在磁盘故障时修改位置就是修改的这里);
  • 数据库建立日期;

每一次ORACLE数据库的实例启动时,它的控制文件用于标识数据库和日志文件,当着手数据库操作时它们必须被打开。当数据库的物理组成更改时,ORACLE自动更改该数据库的控制文件。数据恢复时,也要使用控制文件。

参数文件

参数文件记录了Oracle数据库的基本参数信息,主要包括数据库名、控制文件所在路径、进程等。

» 声明:本站文章源于个人经验总结或书籍、互联网转载,内容仅用于个人学习,请勿转载,否则后果自负!

给我留言

留言无头像?