ORACLE深入 第四章 Oracle Processes

来源:互联网 发布:软通java面试题 编辑:程序博客网 时间:2024/06/05 21:04

ORACLE深入 第四章 Oracle Processes

SERVER Background Background PROCESSES

CONNECT SESSION DEDICATE Shared Server Connections

日月明王BLOG:http://sunmoonking.spaces.live.com 
           ORACLE 的每一个PROCESS都会在PGA里分配一块MEM并执行相应的任务。分为以下三类:
SERVER  PROCESSES:基于CLIENT的请求。比如应用程序发往DBSQL
BACKGROUND  PROCESSES:  DB 启动的时候启动, 来保证DB的运行.
SLAVE PROCESS: 执行SERVER PROCESSBACKGROUND PROCESS的额外辅助工作.
·       1 SERVER  PROCESSES
先回顾下DEDICATE  SERVERSHARED SERVER
DEDICATE SERVER: SERVER 分配一个单独的PROCESS提供点对点的连接.
SHARED SERVER: CLIENT连接的是DISPATCHER而不时SERVER  PROCESS.
 
再来理解下CONNECTSESSION的异同.
一个CONNECTCLIENT PROCESSORACLE INSTANCE的物理路径.
一个SESSION是一个逻辑实体(用来执行CLIENTSQL).
一个CONNECTION0,1,或多个独立的SESSIONS组成. 一个SESSIONCOMMIT并不影响在相同CONNECTION里的其他SESSION.
可以证明下,
本测试在DEDICATE SERVER环境下
select username, sid, serial#, server, paddr, status
  2     from v$session
  3*   where username ='SBTOPT'
SQL> /
USERNAME                                                            SID
------------------------------------------------------------ ----------
   SERIAL# SERVER             PADDR            STATUS
---------- ------------------ ---------------- ----------------
SBTOPT                                                               32
     38431 DEDICATED          070000004DA3B550 INACTIVE
 
SQL> set autotrace on statistics
 
select username, sid, serial#, server, paddr, status
  2     from v$session
  3*   where username ='SBTOPT'
SQL> /
USERNAME                                                            SID
------------------------------------------------------------ ----------
   SERIAL# SERVER             PADDR            STATUS
---------- ------------------ ---------------- ----------------
SBTOPT                                                               32
     38431 DEDICATED          070000004DA3B550 INACTIVE
 
SBTOPT                                                               35
     62380 DEDICATED          070000004DA3B550 ACTIVE
     可以看到两个SESSION用同一个SERVER PROCESS,有着同一个PADDR,看到STATUS一个是ACTIVE, 另一个是INACTIVE,STATUS在这里就不解释了.
      此时大家可能有个疑问, 这个时候有两个SESSION,那么我在运行一个DML  STATEMENT, 这两个SESSIO会如何协同工作呢?
      1,  用新的SESSION(SID 35)去查询V$SESSTAT来记录运行DML STATEMENT(SID 32) 的初值,.
      2, SID32上运行DML
      3,SID 35会再查V$SESSTAT, 并产生TRACE报告.
      那你可能又有新问题了,为什么会这样呢?用一个SESSION不行吗? 回答当然是不行,因为如果是一个SESSION那么就无法区分那些I/O, 网络传输的字节,SORTS等是因为DML还是因为跟踪产生的. 所有的这些都会累计到STATISTICS. 所以需要另一个SESSION去统计这些数据.
        到这里,我们看到了一个CONNECTION1,或多个独立的SESSIONS组成. 前面说过, 一个CONNECTION0,1,或多个独立的SESSIONS组成, 下面看看一个CONNECT0SESSION组成的情况.
      B窗口,
SQL> disconnect
Disconnected from Oracle9i Enterprise Edition Release 9.2.0.6.0 - 64bit Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.6.0 - Production
SQL>
      A窗口再看
SQL>
select username, sid, serial#, server, paddr, status
  2     from v$session
  3*   where username ='SBTOPT'
已经没有数据了.
       不管是DEDICATE还是SHARED SERVER都做相同的工作,那就是把你给他的SQL提供给DB然后ORACLE DEDICATE/SHARED SERVER PROCESS 解析(PARSE)然后放到SHARED  POOL(或者在SHARED POOL发现已经存在就不用解析), 然后按QUERY PLAN 执行, 此时可能从BUFFER  CACHE里读或从DISK里做物理读.(取决于是否在BUFFER  CACHE里发现需要的数据)
DEDICATE SERVER
CLIENTSERVER不管是不是在同一个机器上面,都会用NET连接. SERVER上运行CLIENT的时候可以用下面的SQL 来看产生一个连接的父子进程
  1  select a.spid dedicated_server,
  2   b.process clientpid
  3   from v$process a, v$session b
  4   where a.addr = b.paddr
  5*  and b.sid = (select sid from v$mystat where rownum=1)    /*仅举例子而已, 所以取一条记录*/
SQL> /
 
DEDICATED_SERVER         CLIENTPID
------------------------ ------------------------
581982                   602440
      这两个值一样则表示在同一机器上. 前者spidOS  PID, 后者看PS进程.
 orasbp@svodbp01:$ ps -ef|grep 581982
  orasbp 581982 602440   0 15:48:22      -  0:00 oracleSBP (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
orasbp@svodbp01:$ ps -p 602440
    PID    TTY  TIME CMD
 602440  pts/4  0:00 sqlplus
可以看到602440  是父, 581982是子,而真正执行QUERY的正式581982.
 
DEDICATE SERVERTRANSACTION之间相互独立,互不影响,所以,如果硬件(CPU,MEM)足够为每一个TRANSACTION分配资源, 那么几千个同时CONNECT也是没什么问题的.
Shared Server Connections
      SHARED SERVER即使是在CLIENT,SERVER在一个机器上也必须用LISTENER.
      SHARED  SERVER只适合sort, frequence transactions.  90%以上是比较短平快的transactions就可以考虑使用SHARED SERVER.
      如果你要使用Oracle Net connection pooling的话那也需要设置shared server.但是,如果你已经采用了其他的connection pooling技术(EG: J2EE connection pool),,那么用SHARED  SERVER就没什么好处了.
      SHARED  SERVER可以减少System Processes/Threads. 但是SHARED SERVER下的session trace(比如设置SQL_TRACE=TRUE)可能会导致一个SESSION有多个trace files, 这就导致要想得到此session的工作情况变得非常困难.
       但是,一般情况下还是建议用DEDICATE,除非系统真的过载(overload)
·       2 Background Processes
     大家都记得ORACLE INSTANCE的定义吧, ORACLE INSTANCE是由SGA background process组成. background process维持着DB的正常运行.
下面SQL 得到所有可能的background process
  1  select paddr||' '|| name||' '||description
  2  from v$bgprocess
  3* order by paddr desc
SQL> /
 
PADDR||''||NAME||''||DESCRIPTION
--------------------------------------------------------------------------------
070000004DA3A608 ARC1 Archival Process 1
070000004DA3A0F0 ARC0 Archival Process 0
070000004DA39BD8 CJQ0 Job Queue Coordinator
070000004DA396C0 RECO distributed recovery
070000004DA391A8 SMON System Monitor Process
070000004DA38C90 CKPT checkpoint
070000004DA38778 LGWR Redo etc.
070000004DA38260 DBW0 db writer process 0
070000004DA37D48 PMON process cleanup
00 DIAG diagnosibility process
00 FMON File Mapping Monitor Process
PADDR00的就是你的系统里正在运行的background process.
 
首要 Background Processes
 
PMON: 负责在SERSSION断掉之后负责释放SGA资源, rollback of uncommitted work, 释放lock, 此外,还会监控其他background processes,并在必要的时候重起
SMON: 清理零时空间(eg: CREATE INDEXabort),合并自由空间(DMTpctincrease0),RECOVER RAC中一个INSTANCE失败后其它NODE会打开此失败的INSTANDEREDO LOGRECOVER strinks rollback segments
RECO
CKPTCKPT更新DATA FILESfiles head 8.0之后此进程是必须的进程了(以前更新DATA FILESfiles head的任务是由LGWR完成的,现在可以说是CKPT减轻了LGWR的工作强度)。
DBWn:从buffer cachedirty blocksdisk。写的时候是异步IOasynchronous I/O),DBWn手机BLOCK然后把它们交给OS,此时DBWn并不等待OS写完而直接去收集下批BLOCKOS写完后会告诉DBWn可以再发下批数据了。
LGWR:比较像DBWn,只是写的时REDO。触发需要以下任何一个条件(COMMIT3秒,redo log buffer  1/3满),所以一个大的redo log buffer并没有好处,因为它可能并没有完全用到。
ARCn: LGWR写满online redo log fileARCH写到磁盘上,
ASMB :Automatic Storage Management Background: ASM
RBAL(Rebalance  process) : ASM
LMON(Lock monitor  process):RAC
LMD (Lock manager daemon ) process:RAC
LMSn (Lock manager server ) process:RAC
LCK0(Lock  process):RAC
DIAG (Diagnosability daemon ) process:RAC
次要Background Processes
            这些background process是可选的,基于你的需求. 并不需要每天运行(除非你设置成JOB) .
CJQ0(Job queues),最多可以有1000个进程, 因为没一个JOB QUEUE PROCESS在一个时间只为一个JOB服务,这就是我们为什么如果想同时跑多个JOB必须设置成多PROCESS的原因. CJQ0是一个协调者,他会根据字典里的信息来判断是否该触发一个Jnnn PROCESS来完成任务.
Q000(AQ queue proces)
QMNC (AQ monitor process)
MMAN(Automatic SGA sizing enabled)
 
原创粉丝点击