彻底讲明白ORACLE数据库管理系统体系结构
ORACLE数据库管理系统体系结构
介绍ORACLE数据库管理系统的基本轮廓和程序模块结构、实例概念和组织、进程结构和功能、内存结构和用途,数据字典结构和使用、进程配置和管理、运行模式、程序接口、事务管理。
一、基本轮廓和程序模块结构
-
数据库:存放数据的仓库,有组织的、可共享的、存储的数据集合,按数据模型组织、描述和存储、较小数据冗余度、较高数据独立性和易扩展性、可为用户共享。
-
数据库实例:存取和控制数据库的软件机制,SGA(System Global Area)和ORACLE进程的组合,内存和进程用于管理数据库的数据,并为数据库用户服务。
-
物理结构:由操作系统文件组成,包括数据文件(一个或多个)、重做日志文件(两个或多个)、控制文件(一个或多个)。
-
逻辑结构:由表空间、段、范围、数据块、模式对象组成,通过逻辑结构控制磁盘空间的使用。
-
模式对象:直接引用数据库数据的逻辑结构,包括表、视图、序列、存储过程、触发器、同义词、索引、集聚、数据库链、快照等。
DBMS程序模块结构 |
|
模块类别 |
模块名称 |
系统运行管理类 (运行管理) |
系统启停控制 |
存储管理 |
|
数据存取 |
|
并发控制 |
|
安全控制 |
|
完整性控制 |
|
事务管理 |
|
通信控制 |
|
数据更新 |
|
运行日志管理 |
|
语言翻译解释处理类 (数据操纵) |
DDL翻译 |
DML处理 |
|
终端查询语言结识(交互、嵌入) |
|
DB控制语言解释 |
|
公用定义类 (数据定义) |
模式定义 |
字模式定义 |
|
安全定义 |
|
信息格式定义 |
|
公用维护类 (建立和维护) |
装入 |
DB重构 |
|
DB恢复 |
|
统计分析 |
|
信息格式维护 |
|
工作日志 |
|
数据转储、编辑、打印 |
二、实例的基本概念
实例:SGA+ORACLE进程(用户、服务器、后台)=ORACLE实例
-
实例工作过程:
启动实例(分配SGA、启动ORACLE进程)
实例装配数据库(装配时实例查询控制文件:mount)
数据库准备打开(打开前,数据库为关闭状态,只有DBA可存取)
数据库打开(打开后,授权的用户可以存取数据库)
关闭数据库(先卸载数据库,后关闭实例:unmount)
-
权限:DBA可以启动实例和打开数据库。
-
多实例:多个实例可同时在一台计算机上运行,每个实例存取自己的物理数据库;大规模并行处理系统(MPP)中,ORACLE并行服务器(OPS)允许多个实例装配单个数据库。
三、进程结构
-
进程:具有一定独立功能的程序对某个数据集合的一次运行活动。又称作业或任务,每个进程有其专用内存区
-
关系:进程是程序的执行实例,线程是进程内部的一个执行单元—函数或类对象,每个进程至少有一个线程—主执行线程,线程间通信比进程间通信容易得多,UNIX无线程概念
-
ORACLE进程:负责执行客户端和服务器端代码
-
ORACLE实例:单进程实例和多进程实例
1、单进程ORACLE实例
单个进程负责执行客户端和服务器端代码,ORACLE实例和客户端应用程序不能分开执行,又称单用户ORACLE(如MS-DOS下的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的共享数据缓冲区、按要求返回结果)
-
后台进程在实例启动或安装时建立,用于优化性能和协调多用户
5、后台进程的作系用与关
序号 |
后台进程 |
功能与说明 |
1 |
数据库写(DBWn) (0-9) |
功能:按照最近最少使用(LRU)算法,以批量(多块)方式,将“脏的”缓冲区的内容写入数据文件,保持缓冲区的“清洁”和数量。 写入:
说明:
|
2 |
日志写(LGWR) |
功能:将重做日志缓冲区中自上次写以来已经拷贝到缓冲区中的所有重做条目写入重做日志文件。重做日志缓冲区是一个循环缓冲区,LGWR正常写的速度很快。 写入:
说明:
|
3 |
检查点(CKPT) |
功能:发生检查点时,修改所有数据文件的标题和记录该检查点的细节。通常由LGWR完成,但有多个数据文件,而使用LGWR又明显降低系统性能时才使用CKPT。 说明:
|
4 |
系统监控(SMON) |
功能:在实例启动时执行实例恢复,整理不再使用的临时段,合并邻近的空闲空间获得更大的空闲可用块。 说明:定期被唤醒,或在需要时被其它进程调用。 |
5 |
进程监控(PMON) |
功能:恢复出故障的用户进程,整理缓冲区的高速缓存和释放用户进程使用的资源。定期检查调度进程和服务器进程状态,重新启动非正常终止的进程。 说明:定期被唤醒,或在需要时被其它进程调用。 |
6 |
存档(ARCH) |
功能:联机重做日志填满时,将日志内容拷贝到指定的存储设备中。 说明:在ARCHIVELOG方式中重做日志和自动存档使能时,ARCH才出现。 |
7 |
恢复(RECO) |
功能:在分布式数据库环境中自动解决分布式事务中的故障。 |
8 |
锁(LCKn)(0-9) |
功能:在并行服务器系统中提供实例间的封锁。 |
9 |
作业队列(SNPn)(0-Z) |
功能:在分布式数据库环境中自动刷新表快照,还执行DBMS_JOB包创建的作业请求。 说明:定期被唤醒,并刷新预定义刷新的任何快照,故障不会引起实例故障,ORACLE重启故障进程。 |
10 |
队列监控(QMn) |
功能:监控消息队列的ORACLE高级(AQ)队列。 说明:故障不会引起实例故障,ORACLE重启故障进程。 |
11 |
调度(Dnnn) |
功能:通过允许用户进程共享限定数量的服务器进程来支持多线程配置。 说明:每个实例可建立多个调度进程,每个网络协议至少建立一个调度进程,在实例运行时可增加或删除调度进程以达到最佳数量。 |
12 |
共享服务器(Snnn) |
功能:在多线程配置模式下,每个服务器进程服务于多个客户请求。 |
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服务器代码
-
某些操作系统支持该配置(如VAX VMS),某些则不支持该配置(如UNIX)
2、专用服务器进程结构
-
应用程序和ORACLE服务器代码运行在两个进程中(两任务ORACLE),用户进程与服务器进程是一一对应的
-
当用户进程与服务器进程配置为运行在同一主机上时,程序接口使用主机操作系统的进程间通信机制
-
当用户进程与服务器进程配置为运行在不同主机上时,程序接口提供进程间的通信机制(如网络软件和SQL *Net2/Net8)
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、事务提交(修改永久化)
-
事务提交前
SGA的回滚段缓冲区中生成回滚记录(含旧数据)
SGA的重做日志缓冲区中生成重做日志条目(提交前可存入磁盘)
SGA的数据库缓冲区中生成数据的修改(提交前可存入磁盘)
-
事务提交后
分配回滚段记录及事务的系统修改序号(SCN:唯一),并记录到表中
LGWR将SGA重做日志条目和SCN写入联机重做日志文件中
ORACLE释放表和行上的锁
ORACLE将事务标记为“完成”
4、事务回滚(全部或部分取消修改)
-
无保留点时的回滚
取消全部修改
ORACLE释放事务的所有数据锁
事务结束
-
有保留点时的回滚
回滚保留点之后执行的语句
保护指定的保留点,但丢弃指定保留点之后的保留点
ORACLE释放所有表和指定保留点获得的行锁,但保留指定保留点前获得的数据锁
事务保持活动,可以继续
5、保留点(SavePoint)
-
保留点是事务中的中间标记,用于将一个长事务分割为更小的部分。