前言:
在(一)中介绍说明的过于简单,也没划分好不同的结构去说明以及图解,(二)中补充完善一下下,(一)中都能理解,或者本身都懂的,可以不用看该篇文章,仅只用于本人回顾学习等等
先介绍一下常用的相关术语,简单介绍(其实可以不看,在(一)中也有写过)
- Oracle服务器:Oracle server,由Oracle实例和Oracle数据库组成。
- Oracle实例:Oracle instance,是在Oracle启动的第一个阶段根据参数文件,生成的一系列的后台进程和一块共享内存SGA共同组成。
- Oracle数据库:Oracle database,是由Oracle所有的物理文件所组成。其中最关键的有:控制文件、数据文件、redo log文件等。
- Oracle实例与Oracle数据库进行交互,Oracle实例来对数据库进行各种操作,从而对外提供数据库的存储和检索服务。
Oracle数据库管理系统的体系结构
- Oracle server = Oracle instance + Oracle database。
- Oracle instance又由后台进程和共享内存组成,所以Oracle的结构又包含了内存结构和进程结构;
- 而Oracle database有物理文件组成,所以Oracle结构也包含了存储结构。
Oracle内存结构
- Oracle的内存由两大部分组成:PGA和SGA;
- PGA:服务进程和后台进程,他们都有自己进程私有的内存空间,即PGA;
- 实例的后台进程中有5个是必需的,即只要这5个后台进程中的任何一个未能启动,则该实例都将自动关闭,这5后台进程:SMON、PMON、DBWR、LGWR、CKPT
- SGA:系统全局区,所有后台进程间共享访问使用。系统全局区(SGA)中包含了以下几个内存结构: 共享池(shared pool)、数据库高速缓冲区(database buffer cache)、重做日志缓冲区(redo log
buffer)和其他的一些结构(如:锁和统计数据等)。
shared pool(共享池):
Oracle共享池
主要作用是提高SQL语句以及PL/SQL语句的执行效率,缓存执行过的SQL语句,执行计划;PL/SQL语句的代码块、执行码等(该部分称为library cache);以及在编译SQL, PL/SQL语句是参照的数据字典信息(该部分称为dictionary cache或row cache)。是SGA中最重要的部分之一。
database buffer cache(数据库缓冲区):
主要作用是缓存曾经读取过的数据块,Oracle数据库中对数据的所有修改操作都是在buffer cache中进行的。因为所有的操作都必须先将物理文件上的数据块读取到buffer cache中,然后才能进行各种操作。buffer cache是SGA中最大的内存区域,也是SGA中最重要的部分之一。
Large pool(大池):
可选的内存池,其主要作用是分担shared pool的压力。某些情况,比如备份恢复,如果没有分配Large pool,则会从shared
pool中分配内存,这会增加shared pool的负担。
Java pool(Java池):
用于Java程序使用。
stream pool(流池):
数据库在流工作是使用的内存区域
Oracle进程结构
- Oracle的进程主要有后台进程和服务进程; (按照Linux的严格意义来说,服务进程Server process也是属于后台进程)。
- 后台进程主要对Oracle数据库进程各种维护和操作;
- 服务进程Server process主要来处理用户的请求;
- 用户进程通过监听器来访问Oracle instacne,那么就会触发生成一个服务进程Server process进程,来对该用户进程的请求进程处理;
- 后台进程一般有:LGWR, DBWR, ARCN, CKPT, SMON, PMON等等。
DBWR(database writer数据库写):
主要作用是将被修改过的buffer cache按照一定的条件写入数据文件data files,物理磁盘。
Oracle数据库中对数据的所有修改操作都是在buffer cache中进行的。因为所有的操作都必须先将物理文件上的数据块读取到buffer cache中,然后才能进行各种操作。
LGWR(log writer,日志写):
主要作用是将log buffer中的redo log记录按照一定的条件写入联机的redo log文件。
CKPT(checkpoint,检查点进程):
主要作用是将检查点位置(checkpoint position)写入控制文件control files和数据文件data files的头部。
SMON(system monitor,系统监控进程):
- 主要作用是在数据库启动时,判断实例上次是否正常关闭,如果是非正常关闭,则进程实例恢复。另外,还会合并相连的可以空间。
- smon主要是强制对数据库进行恢复操作。在实例启动时,如果上一次数据库时非正常关闭,并且日志文件和控制文件的scn是不同的,oracle将自动在重新打开数据库之前,通过执行重做日志文件的记录来同步所有的数据文件,控制文件和日志文件,确保所有的数据库文件的一致性,然后再打开数据库;
- 实例恢复是不需要dba干预的,由smon自动完成;
总的来说,smon的工作归纳如下:
a.进行实例恢复
b.合并数据文件的自由空间
c.释放数据文件的临时端
PMON(process monitor,进程监控):
- 监控Server process, 如果Server process非正常关闭,则PMON负责清理它占用的各种资源。
- pmon负责对失败的用户进程或服务进程进行恢复。当用户进程连接到oracle服务器时,oracle将在服务器端分配相应的服务器进程,这时由pmon来监视用户进程的执行情况。当由于各种原因,用户对opracle数据局的连接,发生崩溃,挂起或异常终止现象时,该进程负责清楚服务进程所占用的资源,回滚没有完成的事务,当pmon检测到用户进程失败是,进行的工作如下:
a.回滚当前用户的事务
b.释放当前用户加的表级锁或行级锁
c.释放用户的其他资源
d.重新启动死掉的调度进程
RECO进程(recover,恢复进程):
该进程是在具有分布式选项时所使用的一个进程,负责在分布式数据库环境下,自动恢复失败的分布式事务。
ARCH进程(ARCHIVELOG,日志归档进程):
- 该进程将已填满的在线日志文件拷贝到指定的存储设备。当日志是为ARCHIVELOG使用方式、并可自动地归档时ARCH进程才存在。
- 可选后台进程,在归档模式下负责将已写满的redo log file复制到归档日志目标文件中,以保留所有的重做记录。
LCKn进程(lock,锁进程):
用于Oracle并行服务器环境下,用于多个实例间的封锁,该进程最多可以启动10个进程(LCK0,LCK1……,LCK9)。
Dnnn进程(Despatcher,调度进程):
是多线程服务器体系结构的一部分,调度进程接受用户进程地 请求,将他们放入到请求队列中,然后为请求队列中的用户进程分配一个服务进程。
Oracle存储结构
存储结构即物理文件的组成结构,其中的控制文件、数据文件、重做日志文件是不可或缺的关键文件:
control file(控制文件):
包含了数据库物理结构的信息,比如各种文件的存放位置,当前数据库的运行状态等。十分重要,丢失则数据库实例不能启动。
data file(数据文件):
存放数据的文件。
online redo log file(联机重做日志文件):
存放redo log的文件。维护数据库的一致性,用于数据库恢复。