oracle数据库体系结构

1. oracle的体系结构概况

oracle数据库的体系结构从宏观方面可以分为两部分:instance + database

   instance:oracle实例,即共享的内存区域(SGA)+ 相关进程
   database:数据库文件,大致包括以下三种

data file:数据文件,存储表的数据信息
control file:控制文件,存储当前数据库的结构信息,同时也包括data文件和redo文件的名称、位置、归档信息等,一旦数据库受损,通过这些文件可以进行恢复
redo log file:重做日志文件,存储数据库的全部变更操作和结果。当数据库断电或其他情况,导致实例失败,内存结构消失,内存中的数据还未来得及写入到数据文件中时,就可以通过redo文件,重做之前的操作,重新执行

下面详细对instance和database进行分解和解释

oracle实例 —— instance

   oracle实例,是访问oracle数据库的基本方式,用户想要访问数据库的数据,必须得通过实例进行数据访问,一个实例只能打开一个数据库链接。而一个实例由 内存结构后台进程 组成。

内存结构(SGA——系统全局区)

系统全局区主要有以下几个部分:

   shared pool:共享池,存储最近使用的执行计划和数据字典等信息,将执行计划放在库缓存区(library cache),将数据字典放在数据字典缓存区(data dictionary cache)中。在执行一条sql时,服务器进程会先在SGA共享池中进行sql编译,再将编译结果(执行计划)放到库缓存区中,如果没有找到这条sql的执行计划,数据库就会首先进行语义、语法、用户权限验证,而这些相关信息都是保存在数据字典中的,数据库会把这些数据加载到数据字典缓存区中,提高数据的访问速度。

   database buffer cache:数据库高速缓存区,存储最近使用到的数据块。在读取数据库某条数据时,数据库进程会先从数据库高速缓存区中查询数据块,如果没有找到,就会从数据文件中查找该数据的数据块,并将结果返回给用户,同时会copy一份数据到数据库高速缓存区中供下次使用;存储数据更改也是先写入数据库高速缓存区,再写入到数据文件中去,使用的算法也是LRU(最近最少使用)算法。

   redo log buffer cache:重做日志缓存区,存储数据库的所有变更操作和变更结构,包括数据块的所有变化(数据块的原始值和新值),这些数据最终都被写入到redo文件中。当数据库实例执行失败后,可以通过redo文件来进行数据恢复。

后台进程

oracle的进程主要分为三类:用户进程、服务器进程和后台进程。

用户进程:即客户端侧的进程,比如用工具登录到sql服务器时,就会启动用户进程,用户进程和oracle服务器之间建立连接的同时,会创建会话,会话信息包括用户连接到服务器的方式,或用户的登录信息等。

服务器进程:oracle服务器接收到用户请求时,会创建一个服务器进程,代表用户进程来和oracle实例进行通信。

后台进程:
   SMON:系统监控进程,对数据库系统进行监控,如果实例化失败,SMON进程会进行实例的恢复。
   DBWN:写数据进程,将数据库高速缓存区中已经更改的数据写入到数据文件中。什么时候触发该进程呢?脏块数量达到上限;或者高速缓存区没有自由空间;或者检查点进程执行了。

什么是脏块?即还在高速缓存区中,但是还没有写入到数据文件的数据块。
会有同学认为,只要sql语句没有commit,数据就不会被写入到数据文件中,这种想法是错误的!
有时候用户还没来得及commit,但是数据库服务器的空闲内存不足时,会由DBWN进程将部分脏块写入到数据文件中,以便腾出宝贵的内存供其他进程使用。那么问题来了,如果数据库操作失败了,那已经写入到数据文件中的数据怎么进行回滚呢?不用担心,可以借助undo文件进行撤销。

   LGWR:写redo进程,将redo缓存区中数据写入到redo文件中。什么时候触发该进程呢?commit时;或者三分之一redo缓存区满了;或者redo缓存区中的数据满1MB;或者在DBWN写之前。
   CKPT:检查点进程,数据库高速缓存区中已经更改的数据在写入到数据文件时,要同时进行数据文件、控制文件、redo文件状态的更改,来保证三者的一致性。
   PMON:进程监控器进程,释放用户进程处理结束后的资源(比如用户数据入库失败后的事务回滚、释放锁、释放其他资源等)。

2. oracle文件存储

Oracle数据库组织为数据库(database)、表空间(tablespace)、操作系统文件、表(table)、段(segment)、盘区(extent)和基本数据块(data blocks)。
oracle数据库体系结构_第1张图片
oracle数据库体系结构_第2张图片
表空间:存放数据库中全部的数据。一个表空间包括一个或多个数据文件,数据文件是用来物理存储表空间内全部逻辑结构数据,一个数据文件只能归属于一个表空间。

段:包含表空间中一种指定类型的逻辑存储结构,一个表空间下有多个段,在oracle中有几种类型的段,主要有数据段、索引段、回滚段和临时段等。段不能跨越表空间,但是可以跨越一个表空间内的多个数据文件。

区:区指得是逻辑上连续的一段存储空间,段的增大或减小是以区为单位,一个段可以分为多个区。

块:区是oracle管理数据文件存储空间的单位,一个区包括多个数据块。

3. 表空间管理

分法1
   系统表空间:保存数据库的基本信息,包括数据字典等信息,创库时自动创建。
   用户表空间:存放用户数据,由用户创建。

分法2
   字典管理表空间:通过数据字典来管理表空间,数据字典存储了数据文件、表、索引、列、用户、权限信息和其他一些数据库对象的定义,以及区的分配和回收等信息都是记录在数据字典中的。
   本地管理表空间:在每个数据文件上都有一个位图信息,位图记录每个数据块空间的使用状况,位图中的每一位都对应一个数据块或一组数据块,消耗的资源更少。

最后附上一张DBMS整体架构简图,以加深理解。

你可能感兴趣的:(数据库)