Oracle 体系结构

  一、Oracle 体系结构概述

  Oracle 数据库体系结构主要用来分析数据库组成、工作过程与原理,Oracle数据库是一个逻辑概念,而不是物理概念上安装了Oracle数据库管理系统的服务器。

  Oracle数据库管理系统有三个重要的概念需要理解:实例(instance)、数据库(database)、数据库服务器(database server)。Instance包括SGA和一系列后台管理、监视进程;Database是基于磁盘的数据文件(Data files)、控制文件(Control files)、重做日志文件(Redo log files)。Database server指管理数据库的各种软件工具(sqlplus、OEM等)、instance、database三个部分。

  简洁的体系结构图

  

  

  详细的体系结构图

  

  下面我们将先从数据库逻辑存储结构与物理存储结构分析Oracle体系结构。

  二、逻辑存储结构

  逻辑存储结构是Oracle数据存储结构的核心内容,对Oracle所有操作都会涉及逻辑存储结构。逻辑结构是一种层次结构,主要有表空间、段、区间和数据块等概念组成,它是面向用户的,当用户使用Oracle设计数据库时,其使用的就是逻辑存储结构。

  

  1 数据块(Data Blocks)

  Data blocks 是Oracle逻辑存储结构中最小的逻辑单位,也是执行数据库输入输出的最小存储单位。Oracle数据存放在"Oracle数据块"中,而不是"操作系统快"中。Oracle数据块是操作系统块的整数倍,它的大小有一定标准,其大小被写入DB_BLOCK_SIZE中。

  

  数据块中可以存放表数据、索引数据、簇数据等,无论存放哪种类型的数据,其结构都是相同的。数据库块由块头、表目录、行目录、空余空间和行数据5部分组成。

  块头:存放数据库块的基本信息,如块的物理地址、块所属的段类型;

  表目录:存放表的相关信息。如果数据块中存储的是表数据,则表目录中存储有关这些表的相关信息;

  行目录:如果块中有行数据存在,则这些行的信息将被记录在行目录中;

  空余空间:块中未使用的区域,用户新行的插入和已经存在的行的更新;

  行数据:用户存放表数据和索引数据;

  块头、表目录、行目录组合成为头部信息区,不存放数据,存放整个块的引导信息,起到引导系统读取数据的作用。空余空间和行数据共同构成块的存储区,用于存放真正的数据记录。

  2 数据区(Extent)

  数据区(也可称作数据扩展区)是由一组连续的Oracle数据块构成的Oracle存储结构,一个或多个数据块组成一个数据区,一个或者多个数据区组成一个段(Segment),当一个段中的所有空间被使用完后,Oracle系统将自动为该段分配一个新的数据区,这正是Extent这个单词具有的"扩展"的含义,数据区是Oracle存储分配的最小单位,Oracle就是以数据区为单位进行存储控件的扩展。

  3 段(Sement)

  Sement是由一个或多个Extent构成的,它不是存储空间的分配单位,而是一个独立的逻辑存储结构,用户存储表、索引或者簇数据等占用空间的数据对象,Oracle也把这种占用空间的数据对象统一称为Sement,一个段只属于特定的数据对象,每当创建一个具有独立段的数据对象时,Oracle将为它创建一个段。

  Sement是为特定的数据对象(表、索引、回滚等)分配的一系列数据区。段内包含的数据区可以不连续,并且可以跨越多个文件,使用段的目的是用来保存特定对象。段的类型有4种:

  A 数据段:数据段中保存的是表中的数据记录。创建数据段时,Oracle系统将为表创建数据段。当表中的数据量增大时,数据段的大小自然也随着增大,数据段的增大过程是通过向其添加新的数据区来实现的。

  B 索引段:索引段中包含了用户提高系统性能的索引。一旦建立索引,系统会自动创建一个以该索引的名字命名的索引段。

  C 回滚段:回滚段中保存了回滚条目,当一个事务开始时,系统为之分配回滚段,回滚段可以动态创建和撤销。

  D 临时段: 当执行创建索引、查询等操作时, Oracle可能会使用一些临时存储空间,用于暂时性地保存解析过的查询语句以及在排序过程中产生的临时数据。

  4 表空间(tablespace)

  Oracle使用表空间将相关的逻辑结构组合在一起,表空间是数据库最大逻辑划分区域,通常用来存放数据表、索引、回滚段等数据对象,任何数据对象在创建时都必须指定存储在某个表空间中。表空间与数据文件相对应,一个表空间由一个或多个数据文件组成,一个数据文件只属于一个表空间。

  

  三 物理存储结构

  

  Oracle数据库物理存储结构由多种物理文件组成,主要有数据文件、控制文件、日志文件(重做日志、归档日志、警告日志)、参数文件、口令文件等。

  1 数据文件

  数据文件用于保护用户应用程序数据和Oracle系统内部数据文件,在读取数据时,Oracle首先从数据文件读取数据,并将数据存储在内存的高速数据缓冲区中。如果用户要读取这些数据库中的某些数据,而请求的数据又不在内存的高速数据缓冲区中,则需要从相应的数据文件中读取数据并存储在缓冲区中。当修改和插入数据时,Oracle不会立即将数据写入数据文件,而是把这些数据保存在数据缓冲区中,然后由Oracle的后台进程DBWR决定如何将其写入对应的数据文件。

  2 控制文件

  控制文件是一个二进制文件,它记录了数据库的物理结构,其中主要包含了数据库名、数据文件与日志文件的名字与位置、数据库建立日期等信息。

  select * from v$controlfile;

  3 日志文件

  日志文件主要记录对数据库所作的修改,出现问题时,可以通过日志文件得到原始数据。

  A 重做日志文件

  重做日志文件用来记录数据库所发生过的更改信息(修改、添加、删除等信息)及Oracle内部行为(创建数据表、索引等)而引起的数据库变化信息。在数据库恢复时,可以从该日志文件中读取原始记录。在数据库运行期间,当用户执行commit命令时,数据库首先将每笔操作的原始记录写到日志文件中,写日志文件成功后,才把新的记录传递给应用程序。所以在日志文件中随时可以读取原始记录恢复数据。

  select * from v$logfile;查询日志文件信息。

  Oracle系统在运行过程中产生的日志信息, 首先被临时存放在SGA的"重做日志缓冲区"中,当发出commit命令(或者日志缓冲区信息满1/3)时LGWR进程将日志信息从"重做日志缓冲区"中读取出来,并将读取的日志信息写到日志文件组中序列号较小的文件里,一个日志组写满之后接着写另外一个日志组。当LGWR进程将所有能用的日志文件都使用过一遍之后,它将再次转向到第一个日志组重新覆写。

  B 归档日志文件

  重做日志在所有日志都写了一遍之后,会转向第一个日志组重新覆写,这样会导致较早的日志信息被覆盖掉,归档日志文件正是解决这个问题而生的。

  Oracle数据库可以运行在两种模式下,归档模式与非归档模式。非归档模式指系统运行期间仅适用重做日志机制,所有日志文件组写满之后,转向第一个日志文件覆写。归档模式是在各个日志文件都写满即将被覆盖前,先有归档进程ARCH将即将被覆盖的日志文件的信息读出,并将读出的日志信息写入到归档日志文件中,整个过程被称为归档操作。

  select * from v$database查看系统当前使用的模式;确定归档日志路劲:show parameter log_archive_log;

  4 服务器参数文件

  服务器文件SPFILE(Server Parameter File)是二进制文件,用来记录Oracle数据库的基本参数信息(数据库名、控制文件所在路径、日志缓冲大小)。数据库实例在启动之前,Oracle首先会读取SPFILE参数文件中设置的各种参数,并根据这些初始化参数来配置和启动实例。

  select * from v$parameter; alter system set db_block_size = 8192;

  

  5 密码文件、警告文件、跟踪文件

  密码文件是Oracle用户验证sysdba权限的二进制文件,当远程用户以sysdba或者sysoper连接到数据库时,一般要用密码文件验证。

  警告文件(警告日志文件)是一个存储在Oracle系统目录下的文件文件(alter_orcl.log),它用来记录Oracle系统运行信息和错误信息。运行信息一般包括实例的启动与关闭、建立表空间,增加数据文件等;错误信息包括空间扩展失败、启动实例失败等。

  select name, value from v$parameter where name ='background_dump_dest';

  跟踪文件包括后台进程跟踪文件和用户进程跟踪文件。后台进程跟踪文件用户记录后台进程的警告或错误信息。后台进程跟踪文件的磁盘位置由初始化参数BACkGOUND_DUMP_DEST 确定;用户进程跟踪文件用户记载用户进程相关信息,它主要用户跟中SQL语句。

  三 Oracle 服务器结构(体系结构)

  Oracle服务器主要由instance、database、PGA、前台进程组成。instance可以进一步分为:SGA、后台进程两部分。SGA使用操作系统内存资源,后台进程需要CPU与内存资源。database包含data files、control files、redo log file,database存放在硬盘中。 PGA是个非共享的内存区域,用于管理用户进程的私有资源。前台进程分为用户进程与服务器进程,使用CPU与内存资源。

  1 SGA( System Global Area)

  SGA是所有用户进程共享的一块内存区域, 主要由高速缓冲区(Database buffer cache)、共享池(Shared Pool)、重做日志缓存区(Redo log buffer cache)、Java池(Java Pool)、大池(Large Pool)、流池(Streams Pool)等组成。SGA随着instance启动而加载到内存中,instance关闭时,SGA也会跟着消失。 

  1.1 Database buffer cache

  Database buffer cache 存放Oracle系统最近访问的数据块,当用户向数据库发出请求时,如果在高速缓冲区中存在请求的数据,则Oracle系统直接从database buffer cache 读取数据返回给用户,否则系统会打开数据文件读取请求数据。

  高速缓冲区的作用就是提高用户访问数据库的速度,它可以大大减低用户对物理磁盘的读取频率,从而达到提高服务器性能的目的。

  Database buffer cache 分为三个区:脏数据区、空闲区、保留区。

  1.2 Redo log buffer cache

  重做日志缓冲区用户存放对数据库进行修改操作时所产生的日志信息,这些日志信息在写入到重做日志文件前,首先存放到重做日志缓冲区,然后在检查点发生或重做日志缓冲区中的信息量达到一定峰值时,由LGWR将此缓冲区的内容写入到重做日志文件。

  1.3 Shared Pool

  共享池是SGA保留的内存区域,用户缓存SQL语句、PL/SQL语句、数据字典、资源锁、字符集以及其他控制结构等。Shared Pool 包含高速缓冲区(Library cache)和字典高速缓冲区(Dictionary cache)。

  1.4 Large Pool

  大型池在SGA中不是必需的内存结构,只在某些特殊情况下,instance需要使用Large Pool来减轻共享池的访问压力。

  show parameter large_pool_size;查看大池的缓冲区大小。

  1.5 Java Pool

  用来提供内存空间给Java虚拟机使用,目的是支持在数据库中运行Java程序包,其大小由java_pool_size决定。

  1.6 Streams Pool

  流池用于在数据库与数据库之间进行信息共享。

  2 PGA

  用户进程全局区,它的内存区在进程私有区而不是共享区中。虽然PGA是一个全局区,可以把代码、全局变量和数据结构都放在其中,但区域内的资源并不像SGA那样被所有用户共享,而是每个Oracle服务器进程都有自己的PGA资源。

  3 前台进程

  前台进程包括用户进程和服务进程,它不属于实例的一部分,但用户在不知不觉中经常会用到它,使用前台进程能够实现用户与实例的沟通。

  

  3.1 用户进程

  用户进程是指那些能够产生或执行SQL语句的应用程序,无论是SQL*Plus,还是其他应用程序,只要是能够生成或者执行SQL语句,都被称作用户进程。

  在用户进程中有两个非常重要的概念:连接(connection)和会话(session)。connection是用户进程与实例之间建立通信的渠道,这个渠道可以通过操作系统上的相关通信机制或网络连接来实现。session指在用户进程与实例之间建立连接之后形成的用户与实例之间的交互方式,一般是用户发出请求,数据库实例为用户返回响应消息的方式。

  

  3.2 服务进程

  服务进程就是用于处理用户会话过程中向实例发出的SQL语句或者SQL*PLUS命令,它分为专用服务器模式和共享服务器模式。

  4 后台进程

  Oracle后台进程是一组运行于Oracle服务器端的后台程序,是Oracle实例的重要组成部分。后台进程主要有:SMON、PMON、DBWR、LGWR、CKPT。

  

  4.1 DBWR

  数据写入进程主要是将内存中的脏数据块回写到数据文件中。脏数据块是指高速数据缓冲区中被修改过的数据块,这些数据块的内容与数据文件的数据块内容不一致。

  

  4.2 CKPT

  检查点进程可以看做一个事件,当检查点事件发生时,CKPT会要求DBWR将某些脏数据块回写到数据文件。

  4.3 LGWR

  日志写入进程用于将重做日志缓冲区中的数据写入重做日志文件。Oracle首先将用户所做的修改日志信息写入日志文件,然后再将修改结果写入数据文件。

  4.4 ARCH

  归档进程是一个可选的进程,只有当Oracle处于归档模式时,该进程才能起到作用。若Oracle数据库处于归档模式,当各个日志文件组都被写满而即将被覆盖之前,先由归档进程ARCH把即将被覆盖的日志文件中的日志信息读出,然后再把这些"读出的日志信息"写入到归档日志文件中。

  4.5 SMON

  系统监控进程是在数据库系统启动时执行恢复工作的强制性进程。

  4.6 PMON

  进程监控进程用户监控其他进程的状态,当有进程启动失败时,PMON会清除失败的用户进程,释放用户进程所用的资源。

  5 数据字典

  数据字典是Oracle存放关于数据库内部信息的地方, 其用途是用来描述数据库内部运行和管理情况。如一个数据表的所有者、创建时间、所属表空间、用户访问权限等信息。

  5.1 Oracle数据字段分类

  Oracle数据字典主要分为五类:

  dba_: 包含数据库实例的所有对象信息;

  v$_: 当前实例的动态视图,包含系统管理和系统优化所使用的视图;

  user_: 记录用户对象信息;

  gv_: 分布式环境下所有实例的动态视图,包含系统管理和系统优化使用的视图;

  all_: 记录用户的对象信息与被授权访问的对象信息。

  5.2 常用的数据字典

  A 基本的数据字典

  

  B 常用动态性能视图

  

  

  Oracle数据字典内容非常丰富,在实际开发中会使用到很多,边用边积累。

  

原文地址:https://www.cnblogs.com/Latiny/p/6618984.html