Oracle blog studyxnp.docx
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《Oracle blog studyxnp.docx》由会员分享,可在线阅读,更多相关《Oracle blog studyxnp.docx(32页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Oracle blog study Oracle concept by Web_FrinedyConnect blog : 1概述及体系结构完整的oracle数据库包括数据库db,数据库管理系统dbms两大部分,这两个部分分别对应的是存储网络结构和软件结构。1.1oracle网络结构单层结构(服务器,哑终端)特点是使用基于字符的非图形终端设备直接串行地连接到oracle数据库。所有的处理都发生在大型机上。单层结构的配置和管理较方便,也不存在多操作系统的复杂性问题。单层结构在可缩放性和灵活性方面有些限制,大型机的性能决定了整个系统的性能。双层结构:特点是客户机具有图形用户界面,易于理解,学习,操
2、作,客户机具有智能,可进行处理,减轻了对服务器性能的需求。(c/s结构,服务器,智能客户机)n层结构:它在客户机和数据库服务器之间引进了中间件,如应用服务器或web服务器。工作原理,包括数据库系统处理过程和体系结构两方面建立连接,在连接的基础上,为用户建立会话session,并为该会话创建一个pga区(程序全局区)以存储与该会话相关的信息。在同一个连接中,不同的用户有不同的会话。启动服务进程,由该服务进程负责执行该会话的各项任务。1.2ORACLE 10g体系结构Oracle由实例(instance)和数据库(database)组成 实例:内存(SGA)和后台进程的集合,内存提供了处理的场所,
3、而后台进程相当于工具 数据库:包含三大文件,数据文件、控制文件和联机日志文件oracle 体系结构图2实例的组成-内存及进程组件概述实例由内存(SGA)和后台进程组成,内存提供了处理的场所,而后台进程相当于工具。2.1SGASGA包括一个固定区,一个可变区,一个数据库缓存和一个redo缓存。这些是比较笼统的信息,具体的SGA分为两大部分,具体如下:Variable SGA数据缓冲(Database Buffer Cache)也叫做块缓冲区(block buffer cache)共享池(Shared Pool)大池(Large Pool)Java池(Java Pool)流池(Streams Po
4、ol - 10g以后才有)重做日志缓冲(Redo Log Buffer)其它buffer caches(如KEEP, RECYCLE, and other block sizes cache等)Shared Pool、Java Pool、Large Pool和Streams Pool这几块内存区的大小是相应系统参数设置而改变的,所以有通称为可变SGA(Variable SGA)。Fixed SGAFixed SGA and other internal allocations。(包含shared pool中的data dictionary cache)此外,用于防止对内存结构的并行访问的锁(l
5、atch)的信息也包含在SGA区中。oracle 内存组件oracle SGA2.1.2SGA的重要参数和特性在设置SGA时,有一些很重要的参数,它们设置正确与否,会直接影响到系统的整体性能。下面一一介绍:2.1.2.1SGA_MAX_SIZESGA区包括了各种缓冲区和内存池,而大部分都可以通过特定的参数来指定它们的大小。但是,作为一个昂贵的资源,一个系统的物理内存大小是有限。尽管对于CPU的内存寻址来说,是无需关系实际的物理内存大小的(关于这一点,后面会做详细的介绍),但是过多的使用虚拟内存导致page in/out(内存的访问速度是硬盘的访问速度的14000倍),会大大影响系统的性能,甚至
6、可能会导致系统crash。所以需要有一个参数来控制SGA使用虚拟内存的最大大小,这个参数就是SGA_MAX_SIZE。当实例启动后,各个内存区只分配实例所需要的最小大小,在随后的运行过程中,再根据需要扩展它们的大小,而它们的总和大小受到了SGA_MAX_SIZE的限制。当试图增加一个内存的大小,并且如果这个值导致所有内存区大小总和大于SGA_MAX_SIZE时,oracle会提示错误,不允许修改。当然,如果在设置参数时,指定区域为spfile时(包括修改SGA_MAX_SIZE本身),是不会受到这个限制的。这样就可能出现这样的情况,在spfile中,SGA各个内存区设置大小总和大于SGA_MA
7、X_SIZE。这时,oracle会如下处理:当实例再次启动时,如果发现SGA各个内存总和大于SGA_MAX_SIZE,它会将SGA_MAX_SIZE的值修改为SGA各个内存区总和的值。SGA所分配的是虚拟内存,但是,在我们配置SGA时,一定要使整个SGA区都在物理内存中,否则,会导致SGA频繁的页入/页出,会极大影响系统性能。对于OLTP系统,我个人建议可以如下配置SGA_MAX_SIZE(一般有经验的DBA都会有自己的默认配置大小,你也可以通过一段时间的观察、调整自己的系统来得到适合本系统的参数配置):系统内存SGA_MAX_SIZE值1G400-500M2G1G4G2500M8G5GSGA
8、的实际大小可以通过以下公式估算:SGA实际大小= DB_CACHE_SIZE + DB_KEEP_CACHE_SIZE + DB_RECYCLE_CACHE_SIZE + DB_nk_CACHE_SIZE + SHARED_POOL_SIZE + LARGE_POOL_SIZE + JAVA_POOL_SIZE + STREAMS_POOL_SIZE(10g中的新内存池)+ LOG_BUFFERS+11K(Redo Log Buffer的保护页) + 1MB + 16M(SGA内部内存消耗,适合于9i及之前版本)2.1.2.2PRE_PAGE_SGA我们前面提到,oracle实例启动时,会只载
9、入各个内存区最小的大小。而其它SGA内存只作为虚拟内存分配,只有当进程touch到相应的页时,才会置换到物理内存中。但我们也许希望实例一启动后,所有SGA都分配到物理内存。这时就可以通过设置PRE_PAGE_SGA参数来达到目的了。这个参数的默认值为FALSE,即不将全部SGA置入物理内存中。当设置为TRUE时,实例启动会将全部SGA置入物理内存中。它可以使实例启动达到它的最大性能状态,但是,启动时间也会更长(因为为了使所有SGA都置入物理内存中,oracle进程需要touch所有的SGA页)。当参数设置为TRUE时,不仅在实例启动时,需要touch所有的SGA页,并且由于每个oracle进程
10、都会访问SGA区,所以每当一个新进程启动时(在Dedicated Server方式中,每个会话都会启动一个Oracle进程),都会touch一遍该进程需要访问的所有页。因此,每个进程的启动时间页增长了。所以,这个参数的设置需要根据系统的应用情况来设定。在这种情况下,进程启动时间的长短就由系统内存的页的大小来决定了。例如,SGA大小为100M,当页的大小为4K时,进程启动时需要访问100000/4=25000个页,而如果页大小为4M时,进程只需要访问100/4=25个页。页的大小是由操作系统指定的,并且是无法修改的。但是,要记住一点:PRE_PAGA_SGA只是在启动时将物理内存分配给SGA,但
11、并不能保证系统在以后的运行过程不会将SGA中的某些页置换到虚拟内存中,也就是说,尽管设置了这个参数,还是可能出现Page In/Out。如果需要保障SGA不被换出,就需要由另外一个参数LOCK_SGA来控制了。2.1.2.3LOCK_SGA上面提到,为了保证SGA都被锁定在物理内存中,而不必页入/页出,可以通过参数LOCK_SGA来控制。这个参数默认值为FALSE,当指定为TRUE时,可以将全部SGA都锁定在物理内存中。当然,有些系统不支持内存锁定,这个参数也就无效了。2.1.2.4SGA_TARGET这里要介绍的时Oracle10g中引入的一个非常重要的参数。在10g之前,SGA的各个内存区
12、的大小都需要通过各自的参数指定,并且都无法超过参数指定大小的值,尽管它们之和可能并没有达到SGA的最大限制。此外,一旦分配后,各个区的内存只能给本区使用,相互之间是不能共享的。拿SGA中两个最重要的内存区Buffer Cache和Shared Pool来说,它们两个对实例的性能影响最大,但是就有这样的矛盾存在:在内存资源有限的情况下,某些时候数据被cache的需求非常大,为了提高buffer hit,就需要增加Buffer Cache,但由于SGA有限,只能从其它区“抢”过来如缩小Shared Pool,增加Buffer Cache;而有时又有大块的PLSQL代码被解析驻入内存中,导致Shar
13、ed Pool不足,甚至出现4031错误,又需要扩大Shared Pool,这时可能又需要人为干预,从Buffer Cache中将内存夺回来。有了这个新的特性后,SGA中的这种内存矛盾就迎刃而解了。这一特性被称为自动共享内存管理(Automatic Shared Memory Management ASMM)。而控制这一特性的,也就仅仅是这一个参数SGA_TARGE。设置这个参数后,你就不需要为每个内存区来指定大小了。SGA_TARGET指定了SGA可以使用的最大内存大小,而SGA中各个内存的大小由Oracle自行控制,不需要人为指定。Oracle可以随时调节各个区域的大小,使之达到系统性能最
14、佳状态的个最合理大小,并且控制它们之和在SGA_TARGET指定的值之内。一旦给SGA_TARGET指定值后(默认为0,即没有启动ASMM),就自动启动了ASMM特性。设置了SGA_TARGET后,以下的SGA内存区就可以由ASMM来自动调整:共享池(Shared Pool)、Java池(Java Pool)、大池(Large Pool)、数据缓存区(Buffer Cache)、流池(Streams Pool)。对于SGA_TARGET的限制,它的大小是不能超过SGA_MAX_SIZE的大小的。当指定SGA_TARGET小于SGA_MAX_SIZE,实例重启后,SGA_MAX_SIZE就自动变
15、为和SGA_TARGET一样的值了。对于SGA_TARGET,还有重要一点就是,它的值可以动态修改(在SGA_MAX_SIZE范围内)。在10g之前,如果需要修改SGA的大小(即修改SGA_MAX_SIZE的值)需要重启实例才能生效。当然,在10g中,修改SGA_MAX_SIZE的值还是需要重启的。但是有了SGA_TARGET后,可以将SGA_MAX_SIZE设置偏大,再根据实际需要调整SGA_TARGET的值(我个人不推荐频繁修改SGA的大小,SGA_TARGET在实例启动时设置好,以后不要再修改)。SGA_TARGET带来一个重要的好处就是,能使SGA的利用率达到最佳,从而节省内存成本。因
16、为ASMM启动后,Oracle会自动根据需要调整各个区域的大小,大大减少了某些区域内存紧张,而某些区域又有内存空闲的矛盾情况出现。这也同时大大降低了出现4031错误的几率。2.1.3关于SGA的重要视图要了解和观察SGA的使用情况,并且根据统计数据来处理问题和调整性能,主要有以下的几个系统视图。2.1.3.1v$sga这个视图包括了SGA的的总体情况,只包含两个字段:name(SGA内存区名字)和value(内存区的值,单位为字节)。它的结果和show sga的结果一致,显示了SGA各个区的大小。2.1.3.2v$sgastat这个视图比较重要。它记录了关于sga的统计信息。包含三个字段:Na
17、me(SGA内存区的名字);Bytes(内存区的大小,单位为字节);Pool(这段内存所属的内存池)。这个视图尤其重要的是,它详细记录了个各个池(Pool)内存分配情况,对于定位4031错误有重要参考价值。2.1.3.3v$sga_dynamic_components这个视图记录了SGA各个动态内存区的情况,它的统计信息是基于已经完成了的,针对SGA动态内存区大小调整的操作,字段组成如下:字段数据类型描述COMPONENTVARCHAR2(64)内存区名称CURRENT_SIZENUMBER当前大小MIN_SIZENUMBER自从实例启动后的最小值MAX_SIZENUMBER自从实例启动后的最
18、大值OPER_COUNTNUMBER自从实例启动后的调整次数LAST_OPER_TYPEVARCHAR2(6)最后一次完成的调整动作,值包括: GROW(增加) SHRINK(缩小)LAST_OPER_MODEVARCHAR2(6)最后一次完成的调整动作的模式,包括: MANUAL(手动) AUTO(自动)LAST_OPER_TIMEDATE最后一次完成的调整动作的开始时间GRANULE_SIZENUMBERGRANULE大小(关于granule后面详细介绍)2.1.3.4V$SGA_DYNAMIC_FREE_MEMORY这个视图只有一个字段,一条记录:当前SGA可用于动态调整SGA内存区的空
19、闲区域大小。它的值相当于(SGA_MAX_SIZE SGA各个区域设置大小的总和)。当设置了SGA_TARGET后,它的值一定为0。2.1.4SGA的管理10g引入了ASMM(Automatic Shared Memory Management)这样一个可以进行自我调整的组件,该组件可以自动调整shared pool size、db cache size等SGA中的组件。只需要设置sga_target参数,则其它组件就能够根据系统的负载和历史信息自动的调整各个部分的大小。要启动ASMM,只需要设置statistics_level为typical或all。2.2进程结构包括前台进程,后台进程。前
20、台进程是指服务进程和用户进程,前台进程是根据实际需要而运行的,并在需要结束后立刻结束,后台进程是指在oracle数据库启动后,自动启动的几个操作系统进程。2.2.1后台进程后台进程是Oracle的程序,用来管理数据库的读写,恢复和监视等工作。Server Process主要是通过它和user process进行联系和沟通,并由它和user process进行数据的交换。在Unix机器上,Oracle后台进程相对于操作系统进程,也就是说,一个Oracle后台进程将启动一个操作系统进程;在Windows机器上,Oracle后台进程相对于操作系统线程,打开任务管理器,我们只能看到一个ORACLE.E
21、XE的进程,但是通过另外的工具,就可以看到包含在这里进程中的线程。Oracle系统有几个基本进程(自动启动):DBWn(数据文件写入进程)LGWR(日志文件写入进程)SMON(系统监护进程)PMON(用户进程监护进程)CKPT(检查点进程,同步数据文件,日志文件,控制文件)ARCn(如果配置归档模式,就会出现ARCn)以下进程需要手动启动,且不属于基本进程:RECO服务进程Server Process等等。2.2.1.1DBWn维护系统内的空缓冲区;将修改过的数据缓冲区的数据写入对应数据文件。这里指出几个容易错误的概念:错误概念1:当一个更新提交后,DBWR把数据写到磁盘并返回给用户提交完成。
22、错误概念2:DBWR会触发CKPT后台进程。错误概念3:DBWR不会触发LGWR进程。DBWR是一个底层的工作进程,它批量的把缓冲区的数据写入磁盘。和任何前台用户的进程几乎没有什么关系,也不受它们的控制。DBWR不会触发LGWR和CKPT进程,具体过程我们将在下面几节里讨论。DBWR工作的主要条件如下:DBWR超时系统中没有多的空缓冲区用来存放数据CKPT进程触发DBWR等2.2.1.2LGWR将重做日志缓冲区的数据写入重做日志文件,LGWR是一个必须和前台用户进程通信的进程。当数据被修改的时候,系统会产生一个重做日志并记录在重做日志缓冲区内。这个重做日志可以类似的认为是以下的一个结构:SCN
23、=000000001000数据块ID对象ID=0801数据行=02修改后的数据=0011提交的时候,LGWR必须将被修改的数据的重做日志缓冲区内数据写入日志数据文件,然后再通知前台进程提交成功,并由前台进程通知用户。从这点可以看出LGWR承担了维护系统数据完整性的任务。LGWR工作的主要条件如下:用户提交有1/3重做日志缓冲区未被写入磁盘有大于1M重做日志缓冲区未被写入磁盘超时DBWR需要写入的数据的SCN号大于LGWR记录的SCN号,DBWR触发LGWR写入2.2.1.3SMON工作主要包含:清除临时空间在系统启动时,完成系统实例恢复聚结空闲空间从不可用的文件中恢复事务的活动OPS中失败节点
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Oracle blog studyxnp
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内