您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据库 > DBA-I 第一章 ORACLE体系结构(四)
第一章ORACLE体系结构(四)本节将重点来学习ORACLE实例的进程部分。Process====我们先了解进程的概念和进程的类型图例1ORACLE进程执行特定任务的一系列的操作,ORACLE里有多种类型的进程,分别是⊙用户进程:我们可以理解为客户端进程,是用户提出某个请求建立的一个进程,如我们的SQLPLUS、一些第3方工具、一些应用代码等等都是。⊙服务器进程:它是用来服务于用户请求的ORACLE进程。可以是专有服务器进程和共享服务器进程,并把处理的结果返回给用户进程。⊙后台进程:这些进程通常是伴随着数据库的启动而启动的,并执行各种维护工作,例如块磁盘写,维护联机重做日志,清理异常进程等。也可以在数据库打开后启动非强制的后台进程。当然这里还有一种称为从属进程和伪进程。从属进程是类似后台进程,但它们是代表后台进程或服务器进程执行额外工作的进程上图是建立一个专有的服务器进程,其中这里最重要的进程是后台进程。图例2不同数据库版本,不同产品,有着不同的后台进程,但有些是最基础的最核心的后台进程。每个ORACLE版本都被强制启动一些后台进程,如LGWR,DBWR,但是进程在我们OS上表现的形式不一样,在WINDOWS是通过线程的方式来处理进程的任务,从而把所有的线程组合成一个ORACLE进程。在UNIX环境,我们就可以清晰的看到后台进程、服务器进程及客户端进程。ps-ef|grepora_|grep-vgrep可以用ps来查看后台进程,客户端进程可以跟服务器进程分离,并可以在不同的机器上,我们先来了解(进程/会话/连接)之间的关系。服务器进程/用户会话/连接==============⊙服务器进程和用户建立会话,在专有模式下有服务器进程和用户进程,我们可以通过v$process来查看信息。Selectsidfromv$mystatwhererownum=1是查看当前会话的sessionid上图可以通过当前会话来查看服务器进程号和用户进程号。用户进程号就是客户端进程,上图绿色框LOCAL=YES和BEQ表示客户端通过IPC进行本机连接。客户端进程由V$PROCESS.CLIENTPID指出,看蓝色框值是5112,我们可以通过ps查看该进程是sqlplus客户端。而红色框是服务器进程是SPID(SERVERPROCESSIDENTIFIED),值为5114可以通过ps查看是10g的服务器进程。⊙连接:连接是客户端到数据库实例的物理通道连接可以经过网络NET8或者通过IPC(内部协议接口)实现一个典型连接⊕客户段进程←→专有服务器进程(专有模式)⊕客户段进程←→调度器进程(共享模式)我们来用SQLPLUS来建立一个连接当前连接上有一个会话和一个进程,会话ID=16,进程地址070000004B481688上图执行完setautoton后,该专有连接方式的连接上,出现两个会话,而进程地址相同。SID=18就是用于统计时用的会话。当关闭统计时,统计的会话自动关闭,只有原始会话用ps查看该进程我们用disconect关闭连接,但是进程还在会话也在。只是物理通道没有了,我们来看内存使用情况内存资源仍然被占有,所以单个连接可以有多个会话关联到单个进程,即使在专有模式。单个连接可以有0个、1个或者多个会话,但是专有模式单个会话对应单个进程。在没有连接的情况下,会话和进程可以一直存在。我们再来看共享服务模式我们看到连接到了S000共享服务器进程。但是当该会话休眠时会怎么样呢前面的共享服务器去服务别的会话了,所以当前会话只是跟调度程序D000关联,进入了响应队列。那当前会话再次活动时会怎么样呢故意激活另一个会话,好让刚才S000服务于它,那当前会话可能就不是由S000来服务了。上图看到由S001来服务了,这里大家应该联想到了司机和船长了吧。这些核心的后台进程涉及到很多内核的操作,它关系到ORACLE正确安全有效的运行,并直接跟我们的实例中个内存模块和其它后台进程关联着,所以要了解后台进程的机制,要温固我们前面内存的知识。后台进程也分强制后台进程和可选后台进程。强制后台进程=======我们首先按时间触发次序,来介绍第1个强制后台进程LGWR。谈到LGWR,他关联最主要的内存组件是REDOLOGBUFFER。另外还涉及REDOLOGFILE,它是物理组件。REDO是我们记录了数据库提供的服务的所有交易历史,包括买卖和退货,也就是REDO和UNDO。UNDO其实也是记录在REDO中一REDO记录形势存在,只是它的日志关系到的是保留回退的数据,所以也记在REDO里了。那这些交易历史记录必须有一个地方保存,我们会有三个地方保存⊙redobuffer⊙redologfile⊙archivelogfile这3个部分都有相应的进程去完成,并有一套严格的触发机制。而我们图的右边讲了从redobuffer=redologfile的触发机制,LGWR工作(触发将redobuffer的日志项写入redologfile)的主要条件如下:1.用户提交2.有1/3重做日志缓冲区未被写入磁盘3.有大于1MB重做日志缓冲区未被写入磁盘4.超时(每3秒)5.DBWR需要写入数据的SCN号大于LGWR纪录的SCN号,DBWR触发LGWR写入--这个例子最好跳过,太难为了更好的了解这三个部分的运作,我们也用一些生活化的故事来描述。这个故事比前面都要复杂,而且也跟很多性能有关系,涉及很底层知识我们就不讲了,希望能更通俗的理解它的机制。我先画出ORACLE各组件的名字及流程图,然后大家照着这个图去理解我们这个故事。[1]serverprocess->[2]redocopy->[3]redoallocation->[4]redocopy->[5]redoallocationrelease[6]redologbufferfinished->[7]->modifyblock[8]redoentryvalid->[9]releasesredocopy->[10]LGWR->logfile[10-1]1/3[10-2]_log_io_size[10-3]commit[10-4]dbwr->[11]redowritingfinished->[12]dbwr1-12是这个redo请求到redo的数据到物理数据文件的确认过程,10下面有4个触发条件,分别是lgwr的触发条件。我们用一个寄信到收到信来描述这个流程。我们先罗列出几个主要的机构和人员一个邮局有:⊙8个信件登记员⊙1个信件登记归档员⊙1个信件登记管理员⊙多个发送邮递员⊙多个接收邮递员比如小丽是某厂的收发室收发员,今天要发一批寄到北京的信(是基于一批同一目的的信),我再把前面的流程发一遍,大家对照下。⊙[1]serverprocess⊙[2]redocopy⊙[3]redoallocation⊙[4]redocopy⊙[5]redoallocationrelease⊙[6]redologbufferfinished⊙[7]modifyblock⊙[8]redoentryvalid⊙[9]releasesredocopy⊙[10]LGWR->logfile⊕[10-1]1/3⊕[10-2]_log_io_size⊕[10-3]commit⊕[10-4]dbwr⊙[11]redowritingfinished⊙[12]dbwr我们来看邮寄的对应流程⊙[1]她打电话到邮局⊙[2]邮局会分配一个信件登记员A先记录这些信来自哪里,寄到哪里等信息,信件登记员A来负责这件事情。⊙[3]请求信件登记管理员,让他帮忙评估这次登记所需要帐本的大小,并提供此大小的帐本。信件登记员A请求信件登记管理员,让他帮忙评估这次登记所需要帐本的大小,并提供此大小的帐本。⊙[4]信件登记员A在此帐本上登记这次发往北京信的信息.⊙[5]信件登记管理员服务完信件登记员A,服务其它信件登记员⊙[6]信件登记员A完成这批信的登记⊙[7]请求发送邮递员去收发室拿这批信发到邮箱。那为什么先登记再发送到邮箱呢?因为如果信件登记员A不先登记信息,那小丽不打算发信的话,要回退,邮递员会忘掉刚才是从哪儿拿来的.⊙[8]信件登记员A标注这次登记有效⊙[9]信件登记员A服务完小丽这次请求,将服务其它请求前面知道redo分下面三大步⊕1redobuffer⊕2redologfile⊕3archivelogfile这前面9步是完成这三大步的第一步(redo生成,并修改了相关的块),接下来是第二步是生成redologfile⊙[10]LGWR->logfile⊕[10-1]1/3邮局会有一个记录整个邮局每天的信件记录进行归档的信件登记归档员。把所有8个信件登记员这次没有被信件登记归档员归档的条目进行归档。假如整个邮局最大可登记信件交易量是8000封。而且这8000封物理上顺序分配。所有邮箱里的信满三分之一(2400封信了),这些登记的信的有效条目需要进行确认归档,以便这些信通过火车飞机传递到不同的目的地时,想返回,而找不到如何回到原来寄信人的位置⊕[10-2]_log_io_size满1000封信了,可以设置当然还有比如每天凌晨9点⊕[10-3]commit小丽这批信确认一定要发送到北京,那一旦信件登记员登记的条目被以外丢失,而信又还在邮局的邮箱,还可以从信件归档条目里找到,这些信要寄的位置⊕[10-4]dbwr确定要把信发到北京时⊙[11]redowritingfinished⊙[12]dbwr这些信最终通过火车飞机等送到北京的邮局前由信件登记归档员对这些信做信件登记归档。我使用一个行列表格来说明:进程动作生活例子[1]serverprocess[1]她打电话到邮局[2]redocopy[2]邮局会分配一个信件登记员A先记录这些信来自哪里,寄到哪里等信息。信件登记员A来负责这件事情[3]redoallocation[3]请求信件登记管理员,让他帮忙评估这次登记所需要帐本的大小,并提供此大小的帐本。信件登记员A请求信件登记管理员,让他帮忙评估这次登记所需要帐本的大小,并提供此大小的帐本。[4]redocopy[4]信件登记员A在此帐本上登记这次发往北京信的信息[5]redoallocationrelease[5]信件登记管理员服务完信件登记员A,服务其它信件登记员[6]redologbufferfinished[6]信件登记员A完成这批信的登记[7]modifyblock[7]请求发送邮递员去收发室拿这批信发到邮箱。为什么先登记再发送到邮箱呢?因为如果信件登记员A不先登记信息,那小丽不打算发信的话,要回退,邮递员会忘掉刚才是从哪儿拿来的。[8]redoentryvalid[8]信件登记员A标注这次登记有效[9]releasesredocopy[9]信件登记员A服务完小丽这次请求,将服务其它请求1redobuffer2redologfile3archivelogfile这前面9步是完成这3大步的第1步redo生成,并修改了相关的块[10]LGWR->logfile邮局会有一个记录整个邮局每天的信件记录进行归档的信件登记归档员。[10-1]1/3把所有8个信件登记员这次没有被信件登记归档员归档的条目进行归档。假如整个邮局最大可登记信件交易量是8000封。而且这8000封物理上顺序分配。这些信最终通过火车飞机等送到北京的邮局前由信件登记归档员对这些信做信件登记归档。[10-2]_log_io_size[10-3]commit[10-4]dbwr[11]redowritingfinished[12]dbwr我们用一个SQL来看下lgwr和dbwr是如何触发这儿大家注意3个session的时间点Altersystemcheckpoint干嘛的,谁知道?此命令触发了一个全局检查点,就是后面要讲得CKPT进程然后CKPT进程触发DBWR讲数据缓冲区的脏数据(简称脏缓冲)写入到数据文件里,所以altersystemcheckpoint后,你修改了的数据即使没有提交,也会写入到数据文件,明白了吧?根据前面执行的时间
本文标题:DBA-I 第一章 ORACLE体系结构(四)
链接地址:https://www.777doc.com/doc-4867018 .html