===========ORACLE体系结构(二)===========我们前面学习了ORACLE如何实现客户的请求并连接到实例。客户端请求通过LISTENER审核,LISTENER会指示ORACLE分配一个服务器进程,并在客户端进程和服务器进程间建立了连接会话。我们称专有连接会话,ORACLE实例提供的是专有服务。就是所谓的dedicate模式。默认情况下就是dedicate模式。ORACLE除了提供专有连接会话,还提供了共享连接会话,ORACLE实例也提供了共享服务。我们接下来学习ORACLE提供的共享式服务器是怎么样实现的,有什么优势。共享服务器大家可能是第一次接触,有点不太好理解,这个不着急,现阶段只要初步了解下可以了。我举个例子:你们谁安装的的oracle是在linux环境下的?你建立一个sqlplus会话,看看是不是多出一个oracle的OS进程oracle1178711760014:53pts/000:00:00rlwrapsqlplusfuture/future@fang我们看到,专有模式下。新建一个会话,就多出了一个进程。但是共享模式和这个不一样,你开很多个会话在服务器上表现为1个进程。就是1个进程多个会话一起用,就是共享服务器的特点。那我再问下大家,共享模式下,新开一个会话,进程一定不会增加吗?不一定的,有可能还是会增加。比如我们假设一个共享服务器管理10个会话,现在已经有10个了,再连一个就是11个,哪么还是会增加一个进程的。共享服务器模式的主要优势就是节约内存。好,有了上面的经验,我们来看看共享模式的特点。先看下书店的书柜陈列图我们前面讲的都是专有服务模式的连接。我们再来看共享服务器模式下,静安图书分店是如何服务的。当小丽发出一个请求,要批发1000本中国机械出版社2009年后出版的经济类书,并通过轮船运到宁波自己的公司,并按日期进行排序捆绑存放存入小丽公司的仓库。如果采用共享服务模式,那涉及下面几个动作:⊙店里为小丽(用户进程1)分配了售货员小英(服务器进程1)为她服务⊙小英帮小丽取了这1000本中国机械出版社2009年后出版的经济类书⊙小英并按出版日期排完序,并进行包装。并反馈给小丽检查是否按自己规定的顺序包装。⊙小英将包装后的书放到司机小思(服务器进程2)货车里,这样司机小思来服务小丽,帮这批货运道码头。⊕司机小思将货开往码头⊕这时售货员小英可以为小勇(用户进程2)去卖书。也就是一个售货员小英跟小勇建立了会话,并进行服务。小英可以服务多个不同会话的任务(一、小丽批发经济类书。二、小勇买书),而不需要小英一直为小丽服务,所以也不需要等待小丽在请小英下一个动作前无所事事。这时小英既知道小丽的情况,也知道小勇的情况。对应于ORACLE就是一个服务器进程可以有多个会话(SESSION),多个会话信息需要让一个服务器共享,所以叫共享服务器进程。⊙司机小思帮忙把货搬到船上,他的任务结束,开车回书店。⊙船长小川(服务器进程3)将货运到宁波。⊙司机小宁(服务器进程4)将货运到小丽宁波的公司。小丽这次的批发任务共有四个人帮它完成(为了简化,这里省略了ORACLE调度器参与的角色),这些人都是受静安书店的委托服务于小丽。而每个服务器进程都会在执行完任务后反馈给客户会话信息上图对应于ORACLE就是一个会话可以由多个服务器进程来完成。而在专有服务模式下,那小英要一直为小丽服务,一直到把货运到小丽公司为止,它们建立的会话就结束了,而且进程也随之消亡。在这期间小英要既当营业员、司机、船长,而且这期间小丽要有事情要处理,比如去银行转帐,那么小英只有等待小丽回来才能继续工作,而不能去服务其他顾客,这很显然大量浪费了小英的效率。在ORACLE模式下,专有模式会话进程和服务器进程一一对应,服务器进程要服务到结束,最后一起消亡。而在共享服务模式下,那小英在卖完书后,即使小丽这个时候去收银台交费,小英也不需要等待她,马上可以去处理新的客户小勇,这样售货员的效率就提高了。即使小丽又要重新需要小英处理问题,如小丽拿了收银凭据,小英就要停下小勇的服务,把小丽的书给她,并输入电脑,再回头处理小勇的工作。在ORACLE模式下,共享模式,用户进程不需要服务器进程处理的的时候,服务器进程可以服务别的用户进程,当原来的用户进程继续请求这个服务器进程时,可以打断后一个用户进程,继续处理前一个用户进程的工作。这里小丽再次找小英时,她们已经彼此认识,已经是朋友了,不需要再重新打交道,重新建立信任关系,节约了之间沟通的成本。那小英知道了小丽的姓名,任务起始时间,结束时间,当前的状态,任务的目的等。也同样知道了小勇相应的信息。这些是会话信息,会话信息对于所有的进程可以共享的。开始备课上节课我们开始DBA-I的第一节课给大家整体介绍了下Oracle服务器的体系结构及其主要组件,我们简单回顾下。第一个问题:ORACLESERVER由什么组成?⊙ORACLE服务由一个实例和一个数据库组成。ORACLESERVER的概念是,一个ORACLESERVER就是一个DATABASE库文件加上一个INSTANCE,按我们图书馆的例子就是上海图书馆的静安书城店提供的就是一个ORACLESERVER。第二个问题:ORACLE实例(INSTANCE)由什么组成?主内存结构(SGA)+后台进程那RAC的概念是什么?RAC的概念就是多个实例关联一个数据库。⊕ORACLESERVER=1个DB+1个INSTANCE⊕INSTANCE=MEMORY+PROCESS⊕RAC=N个ORACLESERVER=1个DB+N个INSTANCE第三个问题:分别简述下SGA,PGA,UGA是什么?第四个问题:我们知道ORACLE的物理结构指的是OS里直接能查看到的文件。那ORACLEDB有哪几种物理文件?ControlfilesDatafilesRedologfiles第五个问题:简单说下专有服务器和共享服务器的区别?专有服务器一个服务器进程专门服务一个用户进程,即使用户进程空闲,服务器进程还是继续等待随时为该会话服务,不能去干其他事情。专有模式会话进程和服务器进程一一对应,服务器进程要服务到结束,最后一起消亡。共享服务器一个服务器进程可以服务多个用户进程,一个用户进程也可以被多个服务器进程服务。共享模式,用户进程不需要服务器进程处理的的时候,服务器进程可以服务别的用户进程,当原来的用户进程继续请求这个服务器进程时,可以打断后一个用户进程,继续处理前一个用户进程的工作。大家结合我们图书馆小丽买书,售货员小丽,司机小思,船长小川,司机小宁为小丽服务的例子再理解下。我们上节课讲到,在共享服务模式下,那小英在卖完书后,即使小丽这个时候去收银台交费,小英也不需要等待她,马上可以去处理新的客户小勇,这样售货员的效率就提高了。即使小丽又要重新需要小英处理问题,如小丽拿了收银凭据,小英就要停下小勇的服务,把小丽的书给她,并输入电脑,再回头处理小勇的工作。这是小丽再次找小英时,她们已经彼此认识,已经是朋友了,不需要再重新打交道,重新建立信任关系,节约了之间沟通的成本。那小英知道了小丽的姓名,任务起始时间,结束时间,当前的状态,任务的目的等。也同样知道了小勇相应的信息。这些是会话信息,会话信息对于所有的进程可以共享的。所以这里涉及进程中共享的信息如下:⊙会话信息:这次任务起始时间,结束时间,当前的状态,排序的反馈信息、任务的目的等。⊙CURSOR信息:CURSOR是什么?还有如小丽批发这1000本书的方法等在也是可以让另一个售货员共享的,什么意思呢?就有点类似管理中的专人负责的特点,你只负责某一件事情,整体类似于流水线的概念。这在ORACLE中通过SQL语句实现,并将执行计划记录下来,我们称共享SQL区,放在共享池中。但是对于每发送一个语句,在专有模式,相对于服务器进程是私有的,所以我们称私有SQL区,输入进程内存。但是对于共享服务模式,一个会话的信息可以让所有的进程共享,那么属于会话生命周期里,这个私有SQL区可以是共享的,也可以是执行完后隐式关闭。我们后面会学到SESSIONCACHECURSOR。私有SQL区或者称CURSOR,一个SQL就会对应一个CURSOR,在CURSOR关闭时释放。CURSOR(私有SQL区)这里有两个部分⊙搜索1000本书方法(执行计划)有些称为固定部分,如小丽的姓名(绑定变量),这些信息在整个会话中可以不马上释放⊕你既可以指定我不想要这些信息(一些程序的显式关闭游标),如procdure中closecursor⊕也可以让它自动去除这些信息(默认的SQL语句执行完就关闭游标),如select*fromtab;⊙当前取书已经到第999本了。这些是运行时状态的信息,等SQL语句执行完就释放掉了。注意,每个会话会限制CURSOR数(任务数),如小丽刚才的会话总共有四个服务器进程服务的四个任务。如果每次执行完一个CURSOR(任务)后不马上释放这些CUROSR(任务)信息,那么超过open_cursors数后会抛出opencursor数超出错误,否则会占过多的资源。比如静安店最多服务一个客户的子任务(CURSOR)数是3,比如卖书、司机运货到码头、书通过船运到宁波,而且每个任务做完后登记的信息没有清除,那么小宁要完成第四次子任务时候就不允许。这是因为怕一个大任务中小任务的信息太多造成大量内存使用。(特别是程序的循环操作,循环opencursor一个SQL一千次,不执行close就会发生上述问题)所以对于应用程序代码,要仔细考虑CURSOR的释放机制。而上面的这些CURSOR信息在共享服务模式是共享的,属于UGA,并存放在SGA中,在有大池的情况下存放在大池。还有一部分内存是完全私有的,比如有些局部变量作为程序的栈空间,还有些私有工作空间,如排序区,HASHJOIN区,位图合并区等,它们是在执行的时候调用全局区的,我们称为CGA(CallGlobalArea)调用全局区,执行完就释放。为了减少资源使用,CGA执行完就释放,是运行时状态,别的进程是无法看到的,还有象栈空间调用完就释放的都是私有信息。但是执行结束后如果需要反馈给用户会话的数据,如SELECT的FETCH,则需要保留区的数据提供用户反馈信息,这些信息保存在哪里?是不是CGA?注意CGA属于PGA。如我们排序区可以设置保留空间,这样这些SQL执行完排序完后,不马上释放给操作系统,而是释放给UGA,最后FETCH反馈给SELECT的用户。CGA属于PGA与其他的全局区不同,CGA(CallGlobalArea调用全局区)的存在是瞬间的。它只存在于一个调用过程中。而UGA可能属于PGA或者SGAPGA是一段包含一个Oracle服务或后台进程的数据和控制信息的内存。PGA的大小依赖与系统的配置。在专用服务(DedicatedServer)模式下,一个服务进程与一个用户进程相关,PGA就包括了堆空间和UGA。而UGA(UserGlobalArea用户全局区)由用户会话数据、游标状态和索引区组成。在共享服务(MTS)模式下,一个共享服务进程被多个用户进程共享,此时UGA是SharedPool或LargePool的一部分(依赖与配置)。此时UGA属于SGAUGA根据连接模式的区别而有所区别大家设想一下,一个CGA的返回要怎么返回给用户?放在UGA里。我们排序区可以设置保留空间,这样这些SQL执行完排序完后,不马上释放给操作系统,而是释放给UGA,最后FETCH反馈给SELECT的用户。而共享服务模式UGA是共享内存,所以保留区排序在没有FETCH前可以使用,但是FETCH后仍然不会保留这段内存,它还是会被释放的。我们将在第1章的后面几节详细讲。这些私有部分,就象售货员的私密信息,都会涉及到实际的数据,如HASH表,所以其它售货员永远不会知道。否则就象中介公司的业务员互相之间知道了客户的详细信息,还可能存在互相撬客户的情况。但是小丽的情况,售货员小英(服务器进程1)和司机小勇、小宁(服务器进程2,4)和船长小川(服务器进程3)都知道。所以