前言:

     提到体系结构,大家很自然的想起最经典的 9i 体系结构图,今天咱们就浅谈Oracle体系结构,以及各控件结构的功能,触发机制。学习体系结构,请记住3+3+3+5+N原则会有很大帮助,下面我们对9i体系结构进行简单分析。

第一组3的产生:

     Oracle数据库,我们就一定会想到C/S模式,即Client客户端到Server服务器端的连接。Client可以认为是app应用,那么什么是数据库服务器呢?简单的说,数据库server 就是物理操作系统文件或磁盘的集合。传统的app直接连接到数据库有什么问题?通过数据库的定义,我们可以想到,传统的app连接方法就是应用直接对物理操作系统文件或磁盘访问,这种连接方式必然存在一种缺陷,即大量的物理磁盘IO问题,为了避免大量磁盘IO问题,我们会想到如果前端app不直接对物理磁盘访问,而对内存的访问效率就可以有质的飞跃,所以在此推出实例。所谓的实例就是内存结构和后台进程,一种高效管理数据库的工具。

第二组3的产生:

     假如app有如下一个需求,select c1,c2 from t where c1=1; 那么前端应用的执行流程又是什么呢? 首先Client 客户端用户进程通过网络连接(sqlplususer/password@net_servername)连接到指定Instance,Instance实例为每个用户进程分配一段大小为4M-5M左右的内存区域,该内存来自pga,PGA_AGGREGATE_TARGET定义了总的pga大小,Oracle要求分配的总的pga不超过该值,但也不是绝对的,为了避免大量的磁盘操作,有时有可能会超过这个值。当一条sql select c1,c2 from t where c1=1; 请求时,我们极希望可以从内存中获取该数据,所以Oracle先对共享池扫描,如果共享池中没有,Oracle对该sql进行语法分析,查看各关键词是否正确,语句是否正确,然后进行语义分析,查看sql中涉及的对象,权限是否满足等,为方便这些pl/sql程序管理,例如:table,index,procedures、packages和triggers等,Oracle引入library cache,将table,index,procedures、packages和triggers等执行过的pl/sql,通过hash算法记录在library cache内存结构中。为了加速对sql的解析,快速定位到表名,列名,索引等信息,Oracle在内存中存储这些表、索引等数据字典信息,所以引入dictionary cache。以上 library cache 和 dictionary cache都是为了加快pl/sql解析效率,并且两个模块共同存放在shared_pool共享池中。语法分析,语义分析通过之后,Oracle通过内部优化,选择最优的执行方式,最终生成行资源,将结果显示给客户端。如果将来还有select c1,c2 from t where c1=1; 语句产生,Oracle为了避免相同语句的多次解析,将该sql存储在内存中,所以引出了database buffer cache。再次如果有大量的操作需要直接写盘,此时对磁盘的IO影响很大,必然造成性能问题,所以Oracle在将脏数据写入磁盘时,先将数据写到内存当中,然后慢慢写到物理磁盘上。如果此时有脏块写入而没有提交,数据库宕机,redolog buffer 没有脏块写出,数据库在实例恢复时就需要做回滚;如果redolog buffer 有脏块写出,并成功写入物理磁盘的redlogfile中,那么实例恢复时进行前滚,所以Oracle引入了 redolog buffer 。

第三组3的产生:

     通过上面的分析,Oracle将脏数据全部写在内存当中是很不安全的,为了保证数据的安全必须将脏数据写入物理磁盘,所以Oracle引入datafiles。Oracle在对脏数据的处理机制是先写日志,后写磁盘,所以引入redolog files。那么当数据库宕机时,数据库要完成实例恢复,这时就需要加载数据文件,日志文件,为了让Oracle知道这些数据文件,日志文件所对应的物理地址,文件头信息等,Oracle推出control files,并且在实例恢复时,通过三者块头的SCN号判断是否一致,如果不一致说明数据库需要进行恢复。

第一个5的产生:

     当Instance实例毁坏时,为了能够修复实例,Oracle引入smon进程;当Client客户端应用连接突然挂掉时,Oracle为了处理这些垃圾连接引入了pmon;当内存中的脏块需要写盘时,Oracle引入了dbwn进程;当内存中的日志需要写盘时,引入lgwr进程;当数据库为了保证一致性检查时,引入ckpt进程。

其他:

     通过Oracle启动的过程我们发现,当Oracle加载为nomount状态,Oracle需要知道加载哪个数据库,并且数据库分配的资源环境是多少,所以Oracle引入参数文件;因为Oracle将所有的用户信息都存放在数据库中,并且可以通过数据字典查看,但是如果数据库此时宕机无法登陆时,使用普通用户登陆需要进行语义分析,此时数据字典不可读,语义分析失败,为了解决这个问题,Oracle引入口令文件,通过操作系统校验登陆数据库。当数据库启动归档日志模式时,为了保存归档日志,Oracle引入归档日志文件。还有一些诸如java_pool是因为Oracle本身就是由java开发,为了更方便调用自身java组件所以引入java_pool,stream_pool完全是为了支持流复制,所以Oracle引入stream_pool,为了方便大的存入sql以外的块,例如数据库的备份恢复,Oracle引入了large_pool

数据文件:

(1)内容:存放普通用户的用户数据,系统用户的数据字典信息

(2)作用:存取数据

(3)特点:至少有一个system表空间用来存放数据字典信息,N个用户表空间,根据业务需求的不同可以创建bigfile tablespace,smallfile tablespace等

控制文件:

(1)作用:a.存放数据库基本信息,比如:数据文件位置,日志文件位置

          b.存放数据库结构信息,比如:maxlogfiles限制了日志文件最多多少个,maxdatafiles限制了数据文件最多多少个等

          c.记录最近一次系统中datafiles,controlfiles,redologfiles三者中的SCN号

          d.记录归档信息

          e.记录rman备份片信息

(2)特点:a.大小基本不变,因为在初始化时就分配了空间,记录各文件的信息,如初始化maxlogfiles为30,就一次性分配30个地址记录将来会产生的30个日志文件的信息

          b.数据库中只要一个就行,因为很重要,所以经常至少2个作为镜像文件同时存在

日志文件:

(1)内容:按照系统SCN内存时钟SCN号记录数据库中改变的块

(2)作用:实例的恢复

(3)特点:至少两个,大小不变,顺序写入,写满切换,循环覆写

参数文件:

(1)内容作用:记录数据库库名以及一些定制参数设置信息

(2)特点:有两种,通过spfile启动的数据库可以修改部分系统参数,无需重启直接生效,但系统参数设置错误会导致下次数据库启动失败;通过pfile启动的数据库修改参数需要重启才能生效,万一参数修改错误可能直接就启动失败

口令文件:

(1)内容:记录超级用户的口令,例如sys用户

(2)作用:用于超级用户的登录校验

(3)特点:本地口令验证方式登录数据库

归档日志文件:

(1)内容:联机日志的镜像备份

(2)作用:用于系统的不完全恢复

(3)特点:大小<=联机日志大小,名字具有唯一性

shared_pool:

(1)内容:存放执行过的pl/sql信息

(2)作用:加快sql语句的解析效率

(3)特点:由library cache 和 dictionary cache两部分组成,library cache主要是存放最近解析过的sql语句,函数,解析树,存储过程,执行计划等;dictionary cache则存放了执行sql语句过程中,所参照的数据字典信息,包括sql语句所涉及到得表名,列信息,权限信息等。dictionary cache也叫做row cache,因为这里面的数据都是以数据行的形式存放的,而不是以数据块的形式存放的。

database buffer cache:

(1)内容:存放执行过的pl/sql信息,以及即将写入数据文件的数据

(2)作用:加快sql语句的执行效率

(3)特点:8i以前使用db_block_buffer设置default、buffer_pool_keep设置keep、buffer_pool_recycle设置recycle。而8i以后使用db_cache_size设置default、db_keep_cache_size设置keep、db_recycle_cache_size设置recycle。10g不能自动设置db_keep_cache_size和db_recycle_cache_size,必须手工设置。

redolog buffer  :

(1)内容:记录数据库中块改变信息

(2)作用:记录数据库中块改变信息,实例的恢复

(3)特点:每次脏块写物理磁盘之前,先写到内存模块的redolog buffer中

large_pool:

(1)内容:sga系统全局区中的一个可选组件

(2)作用:IO的并行处理进程,数据库的rman备份恢复

(3)特点:存放pl/sql以外的块

java_pool:

(1)内容:sga系统全局区中的一个可选组件

(2)作用:有效调用java或jar包有关的程序

stream_pool:

(1)内容:sga系统全局区中的一个可选组件

(2)作用:当Oracle配置流复制时,存放sql语句,10G及以上版本

PMON进程:

(1)作用:a.监控与Oracle有关的意外死掉的进程

          b.重启意外死掉的调度器

          c.动态注册监听器

(2)特点:进程监控

(3)触发条件:监控和重启意外死掉的进程

SMON进程:

(1)作用:a.空间管理,定期合并空闲,回收临时段

          b.实例的恢复,包括前滚所有重做日志中的改变,回滚没有提交的事物

(2)特点:系统监控

(3)触发条件:定期触发,意外宕机实例恢复时

LGWR进程:

(1)作用:不断的将日志缓冲区中的脏块写入redolog物理磁盘

(2)特点:日志写进程

(3)触发条件:a.事务提交commit

              b.每隔 3 秒自动写

              c.redolog buffer 日志缓冲区1/3满

              d.日志缓冲区中一次涉及的脏块大于1M

              e.任何一次数据写之前

DBWN进程:

(1)作用:不断的将日志缓冲区中的脏块写入datafile物理磁盘

(2)特点:数据写进程

(3)触发条件:a.发生检查点

              b.每隔 3 秒自动写

              c.脏数据缓冲区达到阀值,default 10%

              d.缓冲区没有空闲可用

              e.集群环境中的ping,多个实例都可以看到数据

              f.表空间的truncate、drop

              g.表空间的read only,表空间的脱机操作

              h.热备份begin backup

CKPT进程:

(1)作用:每产生检查点对数据进行同步,将数据写到数据文件头、控制文件头、日志文件头

(2)特点:产生检查点

(3)触发条件:a.shutdown immediate

              b.alter system checkpoint;


Oracle【体系结构】浅谈数据库体系结构_第1张图片