刚刚出道,在这里希望各位大牛指导,希望这里成为一个我成长的平台!本篇博客我给大家讲述一下oracle的体系结构,同时也是对自己学习的一种检查!

  oralce内存由SGA+PGA所构成。

  oracle服务器由oracle实例和oracle数据库组成。下面详细说一下

oracle 实例:

用户必须通过oracle实例才能访问到oracle数据库


一个oracle实例只能对应一个oracle数据库


oracle实例由内存结构与后台进程结构所组成。


内存结构:SGA(system global area)系统全局区,包括shared pool共享池,


database buffer cache(数据缓冲区),redo log buffer cache(数据缓冲区)


larger pool(大池),java池,stream池。


后台进程:SMON(系统监视器),PMON(进程监视器),DBWN(数据库写进程),


LGWR(日志写进程),ARC(归档日志进程),CKPT(检查点)。

到这里oracle体系结构包含内容已经简述完毕,下面详细的说一下:


shared pool 中包含 library cache(库缓存)和 data dictionary cache(数据字典缓存)。


shared pool区域是对sql语句的 语法检查,语义检查,hash计算,解析,执行的区域。


生产中share pool的命中率,应达到90%以上,这样cpu的压力就小了。


在执行sql语句时,在底层会调用 很多“数据字典”,所以设计了data dictionary cache。


CBO优化器:衡量SQL执行计划的,选择一种最优的执行方式。optimizer收集信息。


2.data buffer cache 第一次读取,然后存放在Buffer cache,第二次读取,直接从Buffer cache中取


从内存中读取数据,肯定要比磁盘中读取快。


写操作,先写内存中,速度快,它认为内存中写完,此次操作就完了,当库空闲的时候再把内存的数据写到磁盘中dbf文件


命中率大,减少I/O压力。



Buffer cache存储规则:如果用满了,从冷数据中,找与当前时间最远的优先覆盖。


redo log buffer cache


先写内存中,速度快,它认为内存中写完,此次操作就完了,当库空闲的时候再把内存的数据写到磁盘的redo日志文件中


主流数据库,都是先写日志,再写数据库。日志比较重要,日志健全,数据没了,可以通过日志进行恢复


large pool 存储大数据【一次提取大的数据,存储在大池比较好,存储database Buffer cache就不好了,容易造成命中假像】


large pool存放:1、RMAN的备份数据 2、并行操作。


java pool   调用前端的java指令。


stream pool 为了stream应用分配内存空间,高级复制技术一部分。


PGA(Process Global Area): 程序全局区

程序全局区(PGA)包含单个服务器进程所需的数据和控制信息,比如每个session传入的SQL绑定变量、以


及对该session进行控制的控制信息。


如果该session进行了排序或hash连接操作,也会使用PGA中的内存。(包括并行和排序直接走PGA,并非


走buffer cache);

后台进程

PMON 进程监控进程,监控用户进程是否正常。

1)、清理出现故障的进程。 

2)、释放所有当前挂起的锁定。

3)、释放故障进程使用的资源。

SMON 系统监控进程,实时监控整个oracle状况。

1)、在实例失败之后,重新打开数据库时自动恢复实例。 

2)、整理数据文件的自由空间,将相邻区域结合起来。

3)、释放不再使用的临时段。

DBWR 数据写入进程

1)、管理数据缓冲区,将最近使用过的块保留在内存中。

2)、将修改后的缓冲区数据写入数据文件中。 

LGWR 日志写入进程

1)、负责将日志缓冲区中的日志数据写入日志文件。 

2)、系统有多个日志文件,该进程以循环的方式将数据写入文件。

CKPT检查点进程

1)、为了防止实例崩溃,为了尽快进行实例恢复的进程。

2)、检查点包括两种:完全检查点、增量检查点。

3)、完全检查点只有下面两种情况下被触发:

1,用户发出alter system checkpoint;

2,除了shutdown abort以外的其他方式正常关闭数据库。

3、增量检查点触发情况:

1,每隔三秒。

2,在线日志切换。