通过等待事件学习Oracle 体系结构:(一)简述

通过等待事件学习Oracle 体系结构:(一)简述
个人认为要想学好oracle数据库,前提必须将Oracle 体系结构了解透彻,了解了Oracle的体系结构就相当于你有了一个坚固的支点,通过这个支点你便能撬动Oracle世界里的许多方面。
在DBA的日常管理中,常常通过 等待事件去定位数据库问题,更确切的说,应该是去定位Oracle体系结构中的哪一部为出现了问题,然后再追踪为什么会引起该问题,从而解决优化。
我将通过对Oracle 某些等待事件的学习来加深对Oracle 体系结构的认识。
一.ORACLE 体系结构简述:
1.什么都不说,先奉上图:


上图大概就是Oracle11G的体系结构了。Oracle 是由实例和数据库组成,实例主要由SGA(系统全局区)、PGA(进程全局区)和后台进程组成,其中SGA分为共享池(shared pool)、数据库缓冲区 (db cache)、日志缓冲区(log buffer)、大型池(large pool)、JAVA池等组成。
数据库则由一系列的文件组成。
2.粗略了解下ORACLE 的运行机制--从一条select 语句说起
        第一步:客户端发起的会话
假如有一天你想查询一下部门某个妹子的工资,于是你打开PL/SQL Developer并登录,执行一条sql:select first_name,salary from HR.EMPLOYEES where first_name='Shelli';  此PL/SQL Developer就相当于应用程序作为客户端建立一个用户进程,而在服务器上数据库为你分配一个相应的服务器进程(server process),服务器进程就相当于一个接待者,接收你的sql,并带到其他地方处理等,结果也是通过server process分配给你,而oracle 分配给server process一段私有的PGA内存空间,这个PGA里存放会话相关的信息,以及作为排序的空间等,这都是你的会话私有的。这就是上图右上角部分了。
       第二步:读懂你的sql
第一步中提到的server process 是个服务非常到位的服务者,作为一个接待者,他必须得让数据知道你的意思,于是他会到SGA 中共享池去找有没有你sql的执行计划,如果没有,那只能由他来翻译了,翻译后的执行计划则保存在共享池的库高速缓存中,oracle的解析执行计划实际上是一个比较繁杂的过程,其中要经过各种检查和选择,我们称这种从无到有的过程为硬解析,而server process 最初在寻找你sql的执行计划时,如果找到了并匹配,那便是软解析了。
       第三步:开始执行sql了,并返回数据。
经过以上的步骤,server process 已经让数据库能读懂你的意思了:我要查看一个名字叫Shelli的妹子的工资。于是server process带着指令来到数据库缓冲区,这个地方是缓冲磁盘中数据文件里的数据的地方,这是个数据中转站,或者说是个暂时缓存数据的地方,如果此时数据库缓冲区恰好以缓存着你想要的数据(肯定有人也对Shelli有兴趣),此时server process 则将数据返回给你。如果没有,此时就要到磁盘中读取了然后缓存到数据库缓冲区再给你,而这个读磁盘数据文件的过程实际上是由DBWR进程来完成的。
       没有第四步:说说其他的
   SGA中的重做日志缓冲区,他配合的进程便是 LGWR进程,oracle的每一步更新,删除什么的操作都会记录下来,先缓存在重做日志缓冲区中,在一定的条件下(如commit时)便通过LGWR进程写入重做日志文件中。
    CKPT进程是干嘛的?实际上他是个触发机制,当检查点触发一次时,便会触发DBWR进程写数据,更新控制文件信息等。
     SMON和PMON 系统监控进程和进程监控进程。一个是负责系统级的监控,一个是负责进程级的监控。
       关于文件:说说oracle的启动过程。
启动过程:shutdown------------->     nomount ------------->        mount------------->       open
操作:       关闭状态                        读参数文件                           读控制文件                读数据文件和重做日志文件等
       

关于以上每个单元的具体作用,咱往下慢慢学习,如果对于初学者,希望对这上图能记个大概。

二.ORACLE等待事件简述:
Oracle的等待事件是衡量Oracle运行状况的重要依据及指标。等待事件主要可以分为两类,即空闲(IDLE)等待事件和非空闲(NON-IDLE)等待事件。
1). 空闲等待事件指ORACLE正等待某种工作,在诊断和优化数据库的时候,不用过多注意这部分事件。
2). 非空闲等待事件专门针对ORACLE的活动,指数据库任务或应用运行过程中发生的等待,这些等待事件 是在调整数据库的时候需要关注与研究的。
 通过查询视图 v$event_name可以查询等待事件及其类型:
set linesize 150 pagesize 600
 select event#,name,wait_class from v$event_name;
如果再做细分,等待事件主要分为以下类型:

1. 空闲类(Idle)此类等待事件意味着会话不活跃,等待工作。比如,sql * net messages from client。

2. 管理类(Administrative ) : 由于DBA的管理命令引起的要求用户处于等待状态的等待,比如,重建索引。

3. 应用程序类(Application) :由于用户应用程序的代码引起的等待,比如,行级锁或锁命令引起的锁等待。

4. 群集类(Cluster) :与RAC的资源有关的等待事件,比如,gc cr block busy等待事件等 gc 开头的等待事件。

5. 提交确认类(Commit):该类等待事件主要就是log file sync等待事件,在执行了一个commit命令后,等待一个重做日志写确认。

6. 并发类(Concurrency):由于内部数据库资源引起的等待事件,比如闩锁等待,latch: shared pool。

7. 配置类(Configuration):由于数据库或实例的不当配置引起的等待事件,比如,重做日志文件尺寸太小,共享池的大小等。

8. 网络类(Network):和网络环境相关的一些等待事件,比如sql* net more data to dblink。

9.其他类( Other):此类等待事件不经常发生,比如'wait for EMON to spawn'。

10. 调度类(Scheduler):由系统资源管理引起的等待事件,比如,'resmgr: become active'。

11. 系统I/O类(System I/O):由后台进程的I/O操作引起的等待事件,比如DBWR等待,db file paralle write。

12. 用户I/O类(User I/O):由用户I/O操作引起的的等待事件,比如db file sequential read。


                                  

==============================================================================================

 《通过等待事件学习Oracle 体系结构》系个人日常学习笔记积累, 存在偏差的描述,请指出,相互学习。
==============================================================================================   



请使用浏览器的分享功能分享到微信等