一文理清Oracle数据库管理系统体系结构

数据与人 2020-07-28 15:02:02

本文主要介绍Oracle数据库管理系统的基本轮廓和程序模块结构、实例概念和组织、进程结构和功能、内存结构和用途,数据字典结构和使用、进程配置和管理、运行模式、程序接口、事务管理。

 

一、基本轮廓和程序模块结构

 

 

Oracle基本轮廓

 

Oracle数据库管理系统体系结构

 

Oracle数据库系统体系结构

 

  • 启动实例(分配SGA、启动ORACLE进程)。

  • 实例装配数据库(装配时实例查询控制文件:mount)。

  • 数据库准备打开(打开前,数据库为关闭状态,只有DBA可存取)。

  • 数据库打开(打开后,授权的用户可以存取数据库)。

  • 关闭数据库(先卸载数据库,后关闭实例:unmount)。

 

2)权限:DBA可以启动实例和打开数据库。

 

3)多实例:多个实例可同时在一台计算机上运行,每个实例存取自己的物理数据库;大规模并行处理系统(MPP)中,ORACLE并行服务器(OPS)允许多个实例装配单个数据库。

 

 

三、进程结构

 

 

  • 进程:具有一定独立功能的程序对某个数据集合的一次运行活动。又称作业或任务,每个进程有其专用内存区。

     

  • 关系:进程是程序的执行实例,线程是进程内部的一个执行单元—函数或类对象,每个进程至少有一个线程—主执行线程,线程间通信比进程间通信容易得多,UNIX无线程概念。

     

  • ORACLE进程:负责执行客户端和服务器端代码。

     

  • ORACLE实例:单进程实例和多进程实例。

 

 

1、单进程ORACLE实例
 

 

 

单个进程负责执行客户端和服务器端代码,ORACLE实例和客户端应用程序不能分开执行,又称单用户ORACLE(如MS-DOS下的ORACLE),使用很少。

 

单进程Oracle实例

 

 

2、多进程ORACLE实例
 

 

 

多个进程负责执行代码的不同部分,为每个连接的用户使用单独的进程,又称多用户ORACLE。用户进程执行客户端代码(应用程序或ORACLE工具代码),ORACLE进程执行ORACLE服务器代码。

 

 
3、用户进程
 
 

 

  • 用户运行应用程序或ORACLE工具时,建立用户进程。

     

  • 连接(Connection)是用户进程和ORACLE实例间的一个通信通路(通信机制+网络软件),同一用户可多次连接到同一个数据库实例。

     

  • 会话(Session)是用户进程和ORACLE实例间的特定连接,同一用户可建立和存在多个会话。

     

  • 在专用服务器模式中,可为每个用户会话建立服务器进程。

     

  • 在多线程服务器模式中,多个用户会话可共享单个服务器进程。

 

 
4、ORACLE进程
 
 

 

  • ORACLE进程分为服务器进程(Server Process,又称影子进程Shadow Process)和后台进程(Background Process)。

     

  • 服务器进程用于处理连接到该实例的用户进程的请求。当应用程序和ORACLE运行在同一主机时,用户进程和相应的服务器进程可组合到单个进程,以减少系统开销;当应用程序和ORACLE运行在不同的主机时,用户进程将通过一个单独的服务器进程与ORACLE联系。

     

  • 服务器进程完成的工作(分析和执行SQL语句、所需数据不在SGA中时从磁盘数据文件中拷贝数据到SGA的共享数据缓冲区、按要求返回结果)。

     

  • 后台进程在实例启动或安装时建立,用于优化性能和协调多用户。

 

多进程Oracle实例(大型机或小型机)

 

 

5、后台进程的作系用与关
 

 

 

多进程Oracle实例的后台进程

 

 

 

6、跟踪文件和报警文件
 

 

 

  • 每个进程(前台或后台)在检测到内部错误时,将错误信息记录到其相关的跟踪文件中(Trace File:包含进程名,SNPn除外),但初始化参数SQL_TRACE必须为TRUE。

     

  • 每个数据库有一个报警文件(Alert File),按时间顺序记录消息和错误。

 

 

四、内存结构

 

 

ORACLE内存结构:

 

  • 软件代码区(SCA)。

  • 系统全局区(SGA)。

  • 程序全局区(PGA)。

  • 排序区(SA)。

 

SCA

PGA

堆栈区

会话信息区

私有SQL区(专用模式)

SGA

数据库高速缓存(DBC)

重做日志缓冲区(RLB)

SA

共享池(SP)

库高速缓存

共享SQL区

私有SQL区(共享模式)

PL/SQL区(过程和包)

控制结构(锁、库、句柄)

数据字典高速缓存(DC)

控制结构(字符集转换、网络安全属性)

数据字典高速缓存(DC)

其它信息区

 

1、ORACLE内存中保存的信息
 

 

  • 程序代码(正在执行和可能执行的)。

     

  • 连接和会话信息(活动和不活动的)。

     

  • 程序执行期间需要的信息(状态信息)。

     

  • ORACLE进程间共享和通信的信息(锁信息)。

     

  • 高速缓存的外存中永久保存的数据(数据块、重做日志条目)。

     

     

 

2、虚拟内存
 

 

  • 可以使用虚拟内存,但整个SGA最好放在实际内存中。

     

  • 通过内存分页(Paging)或交换(Swapping)实现虚拟内存和物理内存的映射,交换以进程为单位,分页以页为单位(典型内存页为4kB)。

     

  • 分页和交换使用和消耗大量的系统资源,存取磁盘比存取内存大约慢50倍。

 

 

3、软件代码区(SCA)
 

 

 

  • 软件区用于保存正在执行和可能执行的代码。

     

  • 大小一般不变,与安装、升级和操作系统有关。

     

  • 软件区是只读的,可以安装为共享或非共享的。

     

  • ORACLE代码是共享的,可被多个ORACLE用户和实例共享。

     

  • 用户程序可以是共享或非共享的。

 

 

4、系统全局区(SGA)
 

 

 

  • SGA是实例启动时自动分配的确定大小的共享内存结构,包含实例的数据和控制信息,数据为多用户共享。

     

  • SGA是可读写的,连接到实例的所有用户进程可读取SGA中的数据,但只有几个进程可以写SGA。

     

  • SGA分为数据库缓冲区高速缓存、重做日志缓冲区、共享池、数据字典高速缓存和其它信息区。

     

  • DBC(Database Buffer Cache)用于保存读自数据文件的拷贝,按脏列表(Dirty List)和LRU(Least Recently Used)列表组织;进程直接在内存中读到数据称为命中(Hint),否则成为遗漏;缓冲区池包括KEEP、RECYCLE、DEFAULT三类,初始化参数有BUFFER_POOL_KEEP和BUFFER_POOL_RECYCLE;DBC大小的初始化参数有DB_BLOCK_BUFFER和DB_BLOCK_SIZE。

     

  • RLB(Redo Log Buffer)是环行缓冲区,用于保存数据库的全部修改信息,初始化参数有LOG_BUFFER,大的缓冲区可减少日志文件的I/O,缺省为OS最大数据块的4倍。

     

  • SP(Shared Pool)包含库高速缓存、数据字典高速缓存和控制结构;库高速缓存包括共享SQL区、私有SQL区、PL/SQL区和控制结构;DC(Dictionary Cache)保存关于数据的逻辑和物理结构的一组表和视图,如用户信息、完整性约束、表的列名和数据类型;控制结构是SGA的固定部分,包含数据库和实例状态的一般信息(后台进程需要的);初始化参数有SHARED_POOL_SIZE

     

  • 控制SGA使用内存的初始化参数有LOCK_SGA和LOCK_SGA_AREAS(将SGA锁入物理内存)、SHARED_MEMORY_ADDRESS和HI_SGARED_MEMROY_ADDRESS(指定运行时SGA的起始地址)、USE_INDIRECT_DATA_BUFFER(支持大于4GB的物理内存)。

 

 

5、程序全局区(PGA)
 

 

 

  • PGA是进程对应的、可写的、独占的一个内存区,包含某个服务器或后台进程的数据和控制信息;包括堆栈信息、会话信息、私有SQL区(保存捆绑变量和运行缓冲区);PGA大小固定并由操作系统指定,初始化参数OPEN_LINKS、DB_FILES和LOG_FILES影响PGA大小。

 

 

6、排序区(SA)
 

 

 

  • l  SA存在于要求排序的ORACLE用户进程的内存中(专用服务器模式时SA在PGA中,MTS模式时SA在SGA中)。

     

  • 初始化参数有SORT_AREA_SIZE(缺省值又OS指定)和SORT_AREA_RETAINED_SIZE(最小值为一个数据库块,最大值为SORT_AREA_SIZE)。

 

 

五、进程配置方案

 

 

  • 用户/服务器进程结构。

  • 专用服务器进程结构。

  • 多线程服务器进程结构。

 

 

1、用户/服务器进程结构
 

 

 

客户/服务器进程组合的Oracle

 

  • 应用程序和ORACLE服务器代码运行在同一进程中,又称用户进程(单任务ORACLE)。

     

  • 接口程序在应用程序和ORACLE代码之间建立隔离,保护ORACLE服务器代码。

     

  • 某些操作系统支持该配置(如VAX VMS),某些则不支持该配置(如UNIX)。

 

 

2、专用服务器进程结构
 

 

 

  • 应用程序和ORACLE服务器代码运行在两个进程中(两任务ORACLE),用户进程与服务器进程是一一对应的。

     

  • 当用户进程与服务器进程配置为运行在同一主机上时,程序接口使用主机操作系统的进程间通信机制。

     

  • 当用户进程与服务器进程配置为运行在不同主机上时,程序接口提供进程间的通信机制(如网络软件和SQL *Net2/Net8)。

     

 

专用服务区进程的Oracle

 

 

3、多线程服务器进程结构
 

 

 

多线程服务器进程结构

 

  • 多个用户进程可共享一个可用的服务器进程池(不同于共享一个服务器进程),用户进程直接与调度进程连接,调度进程通过请求和响应队列与下一个可用的服务器进程连接。该配置降低系统开销,增加用户个数。

     

  • 需要的进程类型包括:网络监听进程(Net8的一部分,不是ORACLE的一部分)、调度进程(一个或多个)、共享服务器进程(一个或多个)。

     

  • 该配置下用户进程必须通过Net8或SQL *Net2与服务器连接,即使用户进程与服务器进程运行在同一主机上。

     

  • 实例启动时,网络监听进程打开和建立通信通路,每个调度进程给监听进程一个地址;用户进程请求连接时,监听进程检查请求,当确定用户进程可以使用共享服务器进程时,返回调度进程地址,用户进程便可直接连接到调度进程。

 

 

六、程序接口

 

1、程序接口的功能:
 

 

  • 提供安全屏障,防止用户进程对SGA的破坏性存取。

     

  • 提供通信机制,格式化请求信息,传送数据,捕捉和返回错误。

     

  • 转换和解释数据,特别是异类计算机之间、与外部程序之间的数据类型转换。

 

 

2、程序接口的结构
 

 

 

  • ORACLE调用接口(OCI)或运行库(SQLLIB)。

     

  • 客户或用户端(UPI)。

     

  • 各种Net8驱动程序(协议指定的通信软件)。

     

  • 操作系统通信软件。

     

  • 服务器或ORACLE端(OPI)。

 

 

3、程序接口的驱动程序
 

 

 

  • 驱动程序是协议相关的,执行连接、断开、捕捉和测试错误。

     

  • 可以安装多个驱动程序,并选其一为缺省驱动程序,单个进程可以使用不同的驱动程序连接到不同的数据库,连接时可指定驱动程序。

 

 

4、操作系统通信软件
 

 

 

  • 用户端到ORACLE端的最底层连接软件是操作系统提供的通信软件(如TCP/IP、DECnet、LU6.2、ASYNC等)。

 

 

七、数据字典

 

 

1、数据字典(Data Dictionary)的信息
 

 

 

  • ORACLE用户名称。

  • 用户的权限(特权和角色)。

  • 模式对象。

  • 模式对象的空间(分配的和使用的)。

  • 列的缺省值。

  • 完整性约束。

  • 审计信息。

  • 其它一般数据库信息。

 

 

2、数据字典的结构(基表、视图和动态性能表)
 

 

 

  • 基表保存数据库信息,ORACLE可读写,数据一般是加密格式,存储在SYSTEM表空间中。

     

  • 视图汇总和显示基表中的信息,数据是解码的,多数用户可被授权访问,存储在SYSTEM表空间中。

     

  • 动态性能表记录当前数据库活动的虚表,不需要磁盘空间,也不存储在任何表空间中。

 

 

3、数据字典的使用
 

 

 

  • 获取数据库信息(性能调整前后查看)。

     

  • 保存数据库信息(DDL运行时字典相应修改)。

     

  • 引用数据库信息(编程过程和程序中)。

 

 

八、事务管理

 

 

 

1、事务(Transaction)
 

 

 

  • 由一个或多个SQL语句组成的、完成特定任务的逻辑单位,即原子单位。事务开始时,ORACLE给事务分配一个可用的回滚段,记录回滚条目。

 

 

2、事务结束的情况
 

 

 

  • 用COMMIT显式提交。

  • 用ROLLBACK显式回滚(到savepoint)。

  • 执行DDL语句前后隐式提交。

  • 断开连接(事务提交)。

  • 进程异常中断(事务回滚)。

 

 

3、事务提交(修改永久化)
 

 

 

 

1)事务提交前

 

  • SGA的回滚段缓冲区中生成回滚记录(含旧数据)。

  • SGA的重做日志缓冲区中生成重做日志条目(提交前可存入磁盘)。

  • SGA的数据库缓冲区中生成数据的修改(提交前可存入磁盘)。

 

2)事务提交后

 

  • 分配回滚段记录及事务的系统修改序号(SCN:唯一),并记录到表中。

  • LGWR将SGA重做日志条目和SCN写入联机重做日志文件中。

  • ORACLE释放表和行上的锁。

  • ORACLE将事务标记为“完成”。

 

 

4、事务回滚(全部或部分取消修改)
 

 

 

1)无保留点时的回滚

 

  • 取消全部修改。

  • ORACLE释放事务的所有数据锁。

  • 事务结束。

 

2)有保留点时的回滚

 

  • 回滚保留点之后执行的语句。

  • 保护指定的保留点,但丢弃指定保留点之后的保留点。

  • ORACLE释放所有表和指定保留点获得的行锁,但保留指定保留点前获得的数据锁。

  • 事务保持活动,可以继续。

 

 

5、保留点(SavePoint)
 

 


保留点是事务中的中间标记,用于将一个长事务分割为更小的部分。

 

作者丨数据与人
来源丨数据与人(ID:shujuyr)
dbaplus社群欢迎广大技术人员投稿,投稿邮箱:editor@dbaplus.cn
活动预告