刚刚出道,在这里希望各位大牛指导,希望这里成为一个我成长的平台!本篇博客我给大家讲述一下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,在线日志切换。
本文出自 “newbie” 博客,转载请与作者联系!