首页 Oracleblogstudy相关资料

Oracleblogstudy相关资料

举报
开通vip

Oracleblogstudy相关资料OracleblogstudyOracleconceptbyWeb_FrinedyConnectblog:http://space.itpub.net/347643/action-spacelist1      概述及体系结构完整的HYPERLINK"javascript:;"\t"_self"oracleHYPERLINK"javascript:;"\t"_self"数据库包括数据库db,数据库HYPERLINK"javascript:;"\t"_self"管理系统dbms两大部分,这两个部分分...

Oracleblogstudy相关资料
OracleblogstudyOracleconceptbyWeb_FrinedyConnectblog:http://space.itpub.net/347643/action-spacelist1      概述及体系结构完整的HYPERLINK"javascript:;"\t"_self"oracleHYPERLINK"javascript:;"\t"_self"数据库包括数据库db,数据库HYPERLINK"javascript:;"\t"_self"管理系统dbms两大部分,这两个部分分别对应的是存储网络结构和HYPERLINK"javascript:;"\t"_self"软件结构。1.1     oracle网络结构单层结构(服务器,哑终端)特点是使用基于字符的非图形终端设备直接串行地连接到oracle数据库。所有的处理都发生在大型机上。单层结构的配置和管理较方便,也不存在多操作系统的复杂性问题。单层结构在可缩放性和灵活性方面有些限制,大型机的性能决定了整个系统的性能。双层结构:特点是客户机具有图形用户界面,易于理解,学习,操作,客户机具有智能,可进行处理,减轻了对服务器性能的需求。(c/s结构,服务器,智能客户机)n层结构:它在客户机和数据库服务器之间引进了中间件,如应用服务器或HYPERLINK"javascript:;"\t"_self"web服务器。工作原理,包括数据库系统处理过程和体系结构两方面建立连接,在连接的基础上,为用户建立会话session,并为该会话创建一个pga区(程序全局区)以存储与该会话相关的信息。在同一个连接中,不同的用户有不同的会话。启动服务进程,由该服务进程负责执行该会话的各项任务。1.2     ORACLEHYPERLINK"javascript:;"\t"_self"10g体系结构 Oracle由实例(instance)和数据库(database)组成实例:内存(SGA)和后台进程的集合,内存提供了处理的场所,而后台进程相当于工具数据库:包含三大文件,数据文件、控制文件和联机日志文件oracle体系结构图2      实例的组成-内存及进程组件概述实例由内存(SGA)和后台进程组成,内存提供了处理的场所,而后台进程相当于工具。2.1     SGASGA包括一个固定区,一个可变区,一个HYPERLINK"javascript:;"\t"_self"数据库缓存和一个redo缓存。这些是比较笼统的信息,具体的SGA分为两大部分,具体如下: VariableSGA 数据缓冲(DatabaseBufferCache)也叫做块缓冲区(blockbuffercache) 共享池(SharedPool) 大池(LargePool) Java池(JavaPool) 流池(StreamsPool---HYPERLINK"javascript:;"\t"_self"10g以后才有) 重做日志缓冲(RedoLogBuffer) 其它buffercaches(如KEEP,RECYCLE,andotherblocksizescache等)SharedPool、JavaPool、LargePool和StreamsPool这几块内存区的大小是相应系统参数设置而改变的,所以有通称为可变SGA(VariableSGA)。 FixedSGA FixedSGAandotherinternalallocations。(包含sharedpool中的datadictionarycache)此外,用于防止对内存结构的并行访问的锁(latch)的信息也包含在SGA区中。oracle内存组件oracleSGA2.1.2  SGA的重要参数和特性在设置SGA时,有一些很重要的参数,它们设置正确与否,会直接影响到系统的整体性能。下面一一介绍:2.1.2.1 SGA_MAX_SIZESGA区包括了各种缓冲区和内存池,而大部分都可以通过特定的参数来指定它们的大小。但是,作为一个昂贵的资源,一个系统的物理内存大小是有限。尽管对于CPU的内存寻址来说,是无需关系实际的物理内存大小的(关于这一点,后面会做详细的介绍),但是过多的使用虚拟内存导致pagein/out(内存的访问速度是硬盘的访问速度的14000倍),会大大影响系统的性能,甚至可能会导致系统crash。所以需要有一个参数来控制SGA使用虚拟内存的最大大小,这个参数就是SGA_MAX_SIZE。当实例启动后,各个内存区只分配实例所需要的最小大小,在随后的运行过程中,再根据需要扩展它们的大小,而它们的总和大小受到了SGA_MAX_SIZE的限制。当试图增加一个内存的大小,并且如果这个值导致所有内存区大小总和大于SGA_MAX_SIZE时,HYPERLINK"javascript:;"\t"_self"oracle会提示错误,不允许修改。当然,如果在设置参数时,指定区域为spfile时(包括修改SGA_MAX_SIZE本身),是不会受到这个限制的。这样就可能出现这样的情况,在spfile中,SGA各个内存区设置大小总和大于SGA_MAX_SIZE。这时,oracle会如下处理:当实例再次启动时,如果发现SGA各个内存总和大于SGA_MAX_SIZE,它会将SGA_MAX_SIZE的值修改为SGA各个内存区总和的值。SGA所分配的是虚拟内存,但是,在我们配置SGA时,一定要使整个SGA区都在物理内存中,否则,会导致SGA频繁的页入/页出,会极大影响系统性能。对于OLTP系统,我个人建议可以如下配置SGA_MAX_SIZE(一般有经验的DBA都会有自己的默认配置大小,你也可以通过一段时间的观察、调整自己的系统来得到适合本系统的参数配置):系统内存SGA_MAX_SIZE值1G400-500M2G1G4G2500M8G5GSGA的实际大小可以通过以下公式估算: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(HYPERLINK"javascript:;"\t"_self"10g中的新内存池)+LOG_BUFFERS+11K(RedoLogBuffer的保护页)+1MB+16M(SGA内部内存消耗,适合于9i及之前版本)2.1.2.2 PRE_PAGE_SGA我们前面提到,oracle实例启动时,会只载入各个内存区最小的大小。而其它SGA内存只作为虚拟内存分配,只有当进程touch到相应的页时,才会置换到物理内存中。但我们也许希望实例一启动后,所有SGA都分配到物理内存。这时就可以通过设置PRE_PAGE_SGA参数来达到目的了。这个参数的默认值为FALSE,即不将全部SGA置入物理内存中。当设置为TRUE时,实例启动会将全部SGA置入物理内存中。它可以使实例启动达到它的最大性能状态,但是,启动时间也会更长(因为为了使所有SGA都置入物理内存中,oracle进程需要touch所有的SGA页)。当参数设置为TRUE时,不仅在实例启动时,需要touch所有的SGA页,并且由于每个oracle进程都会访问SGA区,所以每当一个新进程启动时(在DedicatedHYPERLINK"javascript:;"\t"_self"Server方式中,每个会话都会启动一个Oracle进程),都会touch一遍该进程需要访问的所有页。因此,每个进程的启动时间页增长了。所以,这个参数的设置需要根据系统的应用情况来设定。在这种情况下,进程启动时间的长短就由系统内存的页的大小来决定了。例如,SGA大小为100M,当页的大小为4K时,进程启动时需要访问100000/4=25000个页,而如果页大小为4M时,进程只需要访问100/4=25个页。页的大小是由操作系统指定的,并且是无法修改的。但是,要记住一点:PRE_PAGA_SGA只是在启动时将物理内存分配给SGA,但并不能保证系统在以后的运行过程不会将SGA中的某些页置换到虚拟内存中,也就是说,尽管设置了这个参数,还是可能出现PageIn/Out。如果需要保障SGA不被换出,就需要由另外一个参数LOCK_SGA来控制了。2.1.2.3LOCK_SGA上面提到,为了保证SGA都被锁定在物理内存中,而不必页入/页出,可以通过参数LOCK_SGA来控制。这个参数默认值为FALSE,当指定为TRUE时,可以将全部SGA都锁定在物理内存中。当然,有些系统不支持内存锁定,这个参数也就无效了。2.1.2.4 SGA_TARGET这里要介绍的时Oracle10g中引入的一个非常重要的参数。在10g之前,SGA的各个内存区的大小都需要通过各自的参数指定,并且都无法超过参数指定大小的值,尽管它们之和可能并没有达到SGA的最大限制。此外,一旦分配后,各个区的内存只能给本区使用,相互之间是不能共享的。拿SGA中两个最重要的内存区BufferCache和SharedPool来说,它们两个对实例的性能影响最大,但是就有这样的矛盾存在:在内存资源有限的情况下,某些时候数据被cache的需求非常大,为了提高bufferhit,就需要增加BufferCache,但由于SGA有限,只能从其它区“抢”过来——如缩小SharedPool,增加BufferCache;而有时又有大块的PLSQLHYPERLINK"javascript:;"\t"_self"代码被解析驻入内存中,导致SharedPool不足,甚至出现4031错误,又需要扩大SharedPool,这时可能又需要人为干预,从BufferCache中将内存夺回来。有了这个新的特性后,SGA中的这种内存矛盾就迎刃而解了。这一特性被称为自动共享内存HYPERLINK"javascript:;"\t"_self"管理(AutomaticSharedMemoryManagementASMM)。而控制这一特性的,也就仅仅是这一个参数SGA_TARGE。设置这个参数后,你就不需要为每个内存区来指定大小了。SGA_TARGET指定了SGA可以使用的最大内存大小,而SGA中各个内存的大小由Oracle自行控制,不需要人为指定。Oracle可以随时调节各个区域的大小,使之达到系统性能最佳状态的个最合理大小,并且控制它们之和在SGA_TARGET指定的值之内。一旦给SGA_TARGET指定值后(默认为0,即没有启动ASMM),就自动启动了ASMM特性。设置了SGA_TARGET后,以下的SGA内存区就可以由ASMM来自动调整:共享池(SharedPool)、Java池(JavaPool)、大池(LargePool)、数据缓存区(BufferCache)、流池(StreamsPool)。对于SGA_TARGET的限制,它的大小是不能超过SGA_MAX_SIZE的大小的。当指定SGA_TARGET小于SGA_MAX_SIZE,实例重启后,SGA_MAX_SIZE就自动变为和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的利用率达到最佳,从而节省内存成本。因为ASMM启动后,Oracle会自动根据需要调整各个区域的大小,大大减少了某些区域内存紧张,而某些区域又有内存空闲的矛盾情况出现。这也同时大大降低了出现4031错误的几率。2.1.3  关于SGA的重要视图要了解和观察SGA的使用情况,并且根据统计数据来处理问题和调整性能,主要有以下的几个系统视图。2.1.3.1     v$sga这个视图包括了SGA的的总体情况,只包含两个字段:name(SGA内存区名字)和value(内存区的值,单位为字节)。它的结果和showsga的结果一致,显示了SGA各个区的大小。2.1.3.2     v$sgastat这个视图比较重要。它记录了关于sga的统计信息。包含三个字段:Name(SGA内存区的名字);Bytes(内存区的大小,单位为字节);Pool(这段内存所属的内存池)。这个视图尤其重要的是,它详细记录了个各个池(Pool)内存分配情况,对于定位4031错误有重要参考价值。2.1.3.3 v$sga_dynamic_components这个视图记录了SGA各个动态内存区的情况,它的统计信息是基于已经完成了的,针对SGA动态内存区大小调整的操作,字段组成如下:字段数据类型描述COMPONENTVARCHAR2(64)内存区名称CURRENT_SIZENUMBER当前大小MIN_SIZENUMBER自从实例启动后的最小值MAX_SIZENUMBER自从实例启动后的最大值OPER_COUNTNUMBER自从实例启动后的调整次数LAST_OPER_TYPEVARCHAR2(6)最后一次完成的调整动作,值包括:GROW(增加)SHRINK(缩小)LAST_OPER_MODEVARCHAR2(6)最后一次完成的调整动作的模式,包括:MANUAL(手动)AUTO(自动)LAST_OPER_TIMEDATE最后一次完成的调整动作的开始时间GRANULE_SIZENUMBERGRANULE大小(关于granule后面详细介绍)2.1.3.4 V$SGA_DYNAMIC_FREE_MEMORY这个视图只有一个字段,一条记录:当前SGA可用于动态调整SGA内存区的空闲区域大小。它的值相当于(SGA_MAX_SIZE–SGA各个区域设置大小的总和)。当设置了SGA_TARGET后,它的值一定为0。2.1.4  SGA的HYPERLINK"javascript:;"\t"_self"管理HYPERLINK"javascript:;"\t"_self"10g引入了ASMM(AutomaticSharedMemoryManagement)这样一个可以进行自我调整的组件,该组件可以自动调整sharedpoolsize、dbcachesize等SGA中的组件。只需要设置sga_target参数,则其它组件就能够根据系统的负载和历史信息自动的调整各个部分的大小。要启动ASMM,只需要设置statistics_level为typical或all。2.2    进程结构包括前台进程,后台进程。前台进程是指服务进程和用户进程,前台进程是根据实际需要而运行的,并在需要结束后立刻结束,后台进程是指在HYPERLINK"javascript:;"\t"_self"oracleHYPERLINK"javascript:;"\t"_self"数据库启动后,自动启动的几个操作系统进程。2.2.1  后台进程后台进程是Oracle的程序,用来HYPERLINK"javascript:;"\t"_self"管理数据库的读写,恢复和监视等工作。HYPERLINK"javascript:;"\t"_self"ServerProcess主要是通过它和userprocess进行联系和沟通,并由它和userprocess进行数据的交换。在Unix机器上,Oracle后台进程相对于操作系统进程,也就是说,一个Oracle后台进程将启动一个操作系统进程;在Windows机器上,Oracle后台进程相对于操作系统线程,打开任务管理器,我们只能看到一个ORACLE.EXE的进程,但是通过另外的工具,就可以看到包含在这里进程中的线程。Oracle系统有几个基本进程(自动启动): DBWn(数据文件写入进程) LGWR(日志文件写入进程) SMON(系统监护进程) PMON(用户进程监护进程) CKPT(检查点进程,同步数据文件,日志文件,控制文件) ARCn(如果配置归档模式,就会出现ARCn) 以下进程需要手动启动,且不属于基本进程: RECO 服务进程ServerProcess等等。。。。。2.2.1.1 DBWn维护系统内的空缓冲区;将修改过的数据缓冲区的数据写入对应数据文件。这里指出几个容易错误的概念: ·错误概念1:当一个更新提交后,DBWR把数据写到磁盘并返回给用户提交完成。 ·错误概念2:DBWR会触发CKPT后台进程。 ·错误概念3:DBWR不会触发LGWR进程。DBWR是一个底层的工作进程,它批量的把缓冲区的数据写入磁盘。和任何前台用户的进程几乎没有什么关系,也不受它们的控制。DBWR不会触发LGWR和CKPT进程,具体过程我们将在下面几节里讨论。DBWR工作的主要条件如下:·DBWR超时·系统中没有多的空缓冲区用来存放数据·CKPT进程触发DBWR等2.2.1.2 LGWR将重做日志缓冲区的数据写入重做日志文件,LGWR是一个必须和前台用户进程通信的进程。当数据被修改的时候,系统会产生一个重做日志并记录在重做日志缓冲区内。这个重做日志可以类似的认为是以下的一个结构: SCN=000000001000 数据块ID 对象ID=0801 数据行=02 修改后的数据=0011提交的时候,LGWR必须将被修改的数据的重做日志缓冲区内数据写入日志数据文件,然后再 通知 关于发布提成方案的通知关于xx通知关于成立公司筹建组的通知关于红头文件的使用公开通知关于计发全勤奖的通知 前台进程提交成功,并由前台进程通知用户。从这点可以看出LGWR承担了维护系统数据完整性的任务。LGWR工作的主要条件如下: ·用户提交 ·有1/3重做日志缓冲区未被写入磁盘 ·有大于1M重做日志缓冲区未被写入磁盘 ·超时 ·DBWR需要写入的数据的SCN号大于LGWR记录的SCN号,DBWR触发LGWR写入2.2.1.3SMON工作主要包含: ·清除临时空间 ·在系统启动时,完成系统实例恢复 ·聚结空闲空间 ·从不可用的文件中恢复事务的活动 ·OPS中失败节点的实例恢复 ·清除OBJ$表 ·缩减回滚段 ·使回滚段脱机2.2.1.4 PMON主要用于清除失效的用户进程,释放用户进程所用的资源。如PMON将回滚未提交的工作,释放锁,释放分配给失败进程的SGA资源。2.2.1.5 CKPT同步数据文件,日志文件和控制文件,由于DBWR/LGWR的工作原理,造成了数据文件,日志文件,控制文件的不一至,这就需要CKPT进程来同步。CKPT会更新数据文件/控制文件的头信息。CKPT工作的主要条件如下: ·在日志切换的时候 ·HYPERLINK"javascript:;"\t"_self"数据库用immediate,transaction,normal选项shutdown数据库的时候 ·根据初始话文件LOG_CHECKPOINT_INTERVAL、LOG_CHECKPOINT_TIMEOUT、FAST_START_IO_TARGET的设置的数值来确定 ·用户触发2.2.1.6 ARCH进程的启动需要手工配置。当数据库以归档方式运行的时候,Oracle会启动ARCH进程,当重做日志文件被写满时,日志文件进行切换,旧的重做日志文件就被ARCH进程复制到一个/多个特定的目录/远程机器。这些被复制的重做日志文件被叫做归档日志文件。2.2.1.7 RECO负责解决分布事物中的故障。Oracle可以连接远程的多个数据库,当由于网络问题,有些事物处于悬而未决的状态。RECO进程试图建立与远程服务器的通信,当故障消除后,RECO进程自动解决所有悬而未决的会话。2.2.1.8 服务进程HYPERLINK"javascript:;"\t"_self"ServerProcess服务进程的分类 专用服务进程(DedicatedServerProcess):一个服务进程对应一个用户进程 共享服务进程(MultiTreadedServerProcess):一个服务进程对应多个用户进程,轮流为用户进程服务。PS:PGA&UGA;PGA=ProcessGlobalArea;UGA=UserGlobalArea。它保存了用户的变量、权限、堆栈、排序空间等用户信息,对于专用服务器进程,UGA在PGA中分配。对于多线程进程,UGA在Largepool中分配。2.2.1.9用户进程UserProcess在客户端,将用户的HYPERLINK"javascript:;"\t"_self"SQL语句传递给服务进程2.3     SCN一个贯穿HYPERLINK"javascript:;"\t"_self"数据库全局的概念----系统改变号SCN(SystemChangeNumber)系统改变号,一个由系统内部维护的序列号。当系统需要更新的时候自动增加,它是系统中维持数据的一致性和顺序恢复的重要标志。SCN是顺序递增的一个数字,在Oracle中用来标识数据库的每一次改动,及其先后顺序。SCN的最大值是0xffff.ffffffff。2.3.1  Oracle对SCN的HYPERLINK"javascript:;"\t"_self"管理在单节点的Instance中,SCN值存在SGA区,由systemcommitnumberlatch保护。任何进程要得到当前的SCN值,都要先得到这个latch。RAC/OPS环境中,Oracle通过排队机制(Enqueue)实现SCN在各并行节点之间的顺序增长。具体有两种方法: Lamport算法:又称面包房算法,先来先服务算法。跟很多银行采用的排队机制一样。客户到了银行,先领取一个服务号。一旦某个窗口出现空闲,拥有最小服务号的客户就可以去空闲窗口办理业务。 Commit广播算法:一有commit完成,最新的SCN就广播到所有节点中。上述两种算法可以通过调整初始化参数max_commit_propagation_delay来切换。在多数系统(除了CompaqTur64Unix)中,该参数的默认值都是700厘秒(centisecond),采用Lamport算法。如果该值小于100厘秒,Oracle就采用广播算法,并且记录在alert.log文件中。2.3.2  几种重要的SCNCommitSCN当用户提交commit命令后,系统将当前SCN赋给该transaction。这些信息都反映在redobuffer中,并马上更新到redolog文件里。OfflineSCN除了Systemtablespace以外的任何表空间,当我们执行SQL>altertablespace…offlinenormal命令时,就会触发一个checkpoint,将内存中的dirtybuffer写入磁盘文件中。Checkpoint完成后,数据文件头会更新checkpointSCN和offlinenormalSCN值。其中数据库文件头的checkpointSCN值可通过查询列x$kccfe.fecps得到。如果执行SQL>altertablespace…offline命令时采用temporary或immediate选项,而不用normal选项时,offlinenormalSCN会被设成0。这样当数据库重启后通过resetlog方式打开时,该表空间就无法再改回在线状态。CheckpointSCN当数据库内存的脏数据块(dirtyblocks)写到各数据文件中时,就发生一次checkpoint。数据库的当前checkpointSCN值存在x$kccdi.diSCN中。CheckpointSCN在数据库恢复中起着至关重要的作用。无论你用何种办法恢复数据库,只有当各个数据库文件的checkpointSCN都相同时,数据库才能打开。虽然参数“_allow_resetlogs_corruption”可以在checkpointSCN不一致时强制打开数据库,但是这样的数据库在open后必须马上作全库的export,然后重建数据库并import数据。当一个检查点动作完成之后,Oracle就把系统检查点的SCN存储到控制文件中。ResetlogSCN数据库不完全恢复时,在指定时间点后的SCN都无法再应用到数据库中。Resetlog时的SCN就被设成当前数据库SCN,redolog也会被重新设置。StopSCNStopSCN记录在数据文件头上。当数据库处在打开状态时,stopSCN被设成最大值0xffff.ffffffff。在数据库正常关闭过程中,stopSCN被设置成当前系统的最大SCN值。在数据库打开过程中,Oracle会比较各文件的stopSCN和checkpointSCN,如果值不一致,表明数据库先前没有正常关闭,需要做恢复。HighandLowSCNOracle的Redolog会顺序纪录数据库的各个变化。一组redolog文件写满后,会自动切换到下一组redolog文件。则上一组redolog的highSCN就是下一组redolog的lowSCN。在视图v$log_history中,sequence#代表redolog的序列号,first_change#表示当前redolog的lowSCN,列next_change#表示当前redolog的highSCN。2.3.4  其他注意的几点查询语句不会使SCN增加,就算是同时发生的更新,HYPERLINK"javascript:;"\t"_self"数据库内部对应的SCN也是不同的。这样一来就保证了数据恢复时候的顺序。当一个查询执行的时候,他会先从系统中得到一个当前的SCN号,在他查找数据的同时,他会检查每个数据行和他对应的SCN号,只有那些不比他的SCN号大的行才能从对应用户数据文件的缓冲区内取出,而那些大于他SCN号的行,就应该从回滚段数据文件的缓冲中取出。2.3.4  其他几种重要的SCN1)、系统检查点SCN当一个检查点动作完成之后,HYPERLINK"javascript:;"\t"_self"Oracle就把系统检查点的SCN存储到控制文件中。selectcheckpoint_change#fromv$database2)、数据文件检查点SCN当一个检查点动作完成后,Oracle就把每个数据文件的SCN单独存放在控制文件中。selectname,checkpoint_change#fromv$datafile3)、启动SCNOracle把这个检查点的SCN存储在每个数据文件的文件头中,这个值称为启动SCN,因为它用于在数据库实例启动时,检查是否需要执行数据库恢复。selectname,checkpoint_change#fromv$datafile_header4)、终止SCN每个数据文件的终止SCN都存储在控制文件中。selectname,last_change#fromv$datafile在正常的数据库操作过程中,所有正处于联机读写模式下的数据文件的终止SCN都为null.5)、在数据库运行期间的SCN值在数据库打开并运行之后,控制文件中的系统检查点、控制文件中的数据文件检查点SCN和每个数据文件头中的启动SCN都是相同的。控制文件中的每个数据文件的终止SCN都为null.在安全关闭数据库的过程中,系统会执行一个检查点动作,这时所有数据文件的终止SCN都会设置成数据文件头中的那个启动SCN的值。在数据库重新启动的时候,Oracle将文件头中的那个启动SCN与数据库文件检查点SCN进行比较,如果这两个值相互匹配,oracle接下来还要比较数据文件头中的启动SCN和控制文件中数据文件的终止SCN。如果这两个值也一致,就意味着所有数据块多已经提交,所有对数据库的修改都没有在关闭数据库的过程中丢失,因此这次启动数据库的过程也不需要任何恢复操作,此时数据库就可以打开了。当所有的数据库都打开之后,存储在控制文件中的数据文件终止SCN的值再次被更改为null,这表示数据文件已经打开并能够正常使用了。2.3.5 澄清几个概念系统当前SCN并不是在任何的数据库操作发生时都会改变,SCN是在事务提交或回滚时改变;在控制文件,数据文件头,数据块,日志文件头,日志文件changevector中都有SCN,但其作用各不相同,数据文件头中包含了该数据文件的checkpointSCN,表示给数据文件最近一次执行检查点操作时的SCN.日志文件头中包含了lowSCN,nextSCN,表示给日志文件包含有从lowSCN到nextSCN的redorecord.控制文件中包含了每个数据文件的checkpointSCN,stopSCN,每个日志文件的lowSCN,nextSCN.控制文件中checkpointSCN同数据文件头中checkpointSCN相同,除非数据文件被手工替换掉.控制文件中的lowSCN,nextSCN同日志文件中lowSCN和nextSCN相同在数据库正常运行时,控制文件中对应数据文件的stopSCN都是最大值.在正常关闭数据库的情况下,在关闭前会执行一次检查点工作当oracle会将数据缓冲区上的内容全部写回到磁盘中,然后更新控制文件中对应数据文件的stopSCN,使其等于checkpointSCN。但在异常当机的情况下,由于最后一次检查点未进行或进行中间被中止,因而在控制文件,就存在部分的数据文件stopSCN为最大值,在数据库重新启动后,会检查控制文件中对应每个数据文件的stopSCN,如果stopSCN不等于控制文件中对应每个数据文件的checkpointSCN,就会使用日志文件redo从checkpointSCN开头到stopSCN为止的全部数据库操作.在定位到底是使用哪一个redolog文件时,就用到了日志文件头中的lowSCN,nextSCN,也就是说要使用的redolog的lowSCN,nextSCN必须包含数据文件重做所须的changevector。在确定了哪个数据文件须redo后,oracle会比较changevector中的SCN和数据文件数据块中的SCN,如果changevector的SCN小于数据块的SCN,则跳过此changevector,否则redo数据块中ITL中还有SCN,但它的作用是用于产生一致性读快照。3      内存组件详解-BUFFERCACHEHYPERLINK"javascript:;"\t"_self"Serverprocesses把数据文件读进buffercache。为提高性能,一次读有时候读多个块。DBWn进程写数据从buffercache写进数据文件。为提高性能,DBWn一次写多个块。某一时间,buffercache可能容纳一个块的多个拷贝。一个已存在的块的拷贝,但是对于满足serverprocess可能需要构建读一致拷贝从以前的镜像信息。为了能够加快处理数据的速度,HYPERLINK"javascript:;"\t"_self"oracle必须将读取过的数据缓存在内存里。而oracle对这些缓存在内存里的数据起了个名字:数据高速缓存区(dbbuffercache),通常就叫做buffercache。按照oracle官方的说法,buffercache就是一块含有许多数据块的内存区域,而这些数据块主要都是数据文件里的数据块内容的拷贝。通过初始化参数:buffer_cache_size来指定buffercache的大小。oracle实例一旦启动,该区域大小就被分配好了。buffercache所能提供的功能主要包括:1)   通过缓存数据块,从而减少I/O。2)   通过构造CR块,从而提供读一致性功能。3)   通过提供各种lock、latch机制,从而提供多个进程并发访问同一个数据块的功能。3.1    BufferCache术语1、   MultipleBufferPools-Bufferpool有三种类型:  Default:默认的池  Recycle:大对象池,当HYPERLINK"javascript:;"\t"_self"数据库读取某一大对象时候,可能导致其它对象的buffer老化,所以可以把大对象的读取指定到recycle池中,避免影响其它对象。这个池里默认为CR块。  Keep:和recycle相反,把常用对象的buffer长久keep在池中。通过DB_KEEP_CACHE_SIZE(BUFFER_POOL_KEEP)参数可以指定大小。  SQL>createtabletest(nnumber)storage(buffer_poolkeep);SQL>altertableteststorage(buffer_poolrecycle);  公式:Buffersindefaultpool=Totalnumberofbuffers–(Buffersinrecyclepool+Buffersinkeeppool)  可以通过V$SEGSTAT_NAME,V$SEGSTAT,和V$SEGMENT_STATISTICS这个三个视图进行段级别的监控。  Keeppool、Recyclepool和defaultpool采用的LRU算法是不同的,目前大多数资料所讲的LRU算法及关于buffercache的话题,主要针对的是defaultpool。有些描述中的buffercache即是指的buffercache中的defaultpool,本书中同样如此。关于keeppool和recyclepool的算法资料较少。2、   hash算法则是为了能够进行快速查找定位所使用一种技术。所谓hash算法,就是根据要查找的值,对该值进行一定的hash算法后得出该值所在的索引号,然后进入到该值应该存在的一列数值列表(可以理解为一个二维数组)里,通过该索引号去找它应该属于哪一个列表。然后再进入所确定的列表里,对其中所含有的值,进行一个一个的比较,从而找到该值。这样就避免了对整个数值列表进行扫描才能找到该值,这种全扫描的方式显然要比hash查找方式低效很多。其中,每个索引号对应的数值列在oracle里都叫做一个hashbucket。3、   如磁盘上数据文件的最小IO单元叫block一样,buffercache的最小单元(或者说结构)叫buffer,每个buffer跟x$bh中每条记录有一一对应关系。4、   databufferheaderlist的结构是用哈希桶Hashbuckets来构建的,它按照分组。注意,blockclass和blocktype不同。5、   Hashchain是在每一个Hashbucket内部,维护多个databufferheader的数据结构。6、   Bufferdescriptor存在于PGA,它实际属于client。它存储的消息是client提供的。7、   BufferHeader  描述缓冲区的buffer  在TSN,RDBA做hash算法,为hashbuckets获取一个固定的数字  被上层组件做为一种提示使用8、   Buffers能够被请求为NULL,NEW,CR,CRX,SHR,和EXL模式。9、   链表是一种数据结构,通过将对象串连在一起,从而构成链表结构。这样,如果要修改、删除、查找某个对象的话,都可以先到链表中去查找,而不必实际的访问物理介质。10、buffercache有两种LRU链表:  LRUW:LRUWritelist((checkpointqueue),);写链表,也就是dirtylist,维护着当前的脏块。写链表是需要写入数据文件的脏数据块列表。  LRU:LRUList最近最少使用的链表。LRU链表是控制不包含任何数据的空闲空间(free buffers)、正在使用的空间(pinned buffers)和还没有写到写链表的脏数据块。  一个buffer只能被其中一个listcache。11、   LRUlist由内部参数_db_block_lru_latches控制,8i以前,只有一个list在cache里。从Oracle8开始,CKPTQ(checkpointqueues)和FQ(filequeues)被引入。随着异步DBWn引入,list的HYPERLINK"javascript:;"\t"_self"管理也随之变化。现在正确称呼,应该是“workingsets,”,包含几个不同的LRUlists。每个LRU是受cachebufferslruchainlatch,保护的。12、   LRULists与workingset  每一对LRU/LRUW称为一个workingset,buffer通过循环使用的方式分配到这些workingset中。在高负载的读取和过多的LRU扫描下,LRUlatch可能成为一个瓶颈。此外,LRUlatch在多路并发系统中也不好衡量。应为多个CPU可能都会请求单独的LRUlatch。通过设置内部参数_DB_BLOCK_LRU_LATCHES,可以改善LRU的竞争情况。每个LRUlatch都是一个workingset。每个workingset拥有自己的链表,管理属于它的buffer。如果一个latch不能访问,那么就会转向下一个,直到获得一个成功的latch。在事件管理中,如果请求latch失败,那么miss就会增加。LRUlatch的请求最初是NOWAIT模式,如果在它请求完所有latch都仍然没有成功后,就会变为WAIT模式。  进程访问所有的latch直到它获得一个LRUlatch。在多个DBWR的环境下,每个DBWR都有自己的LRU/LRUW,通过设置db_writer_processes可以更改DBWR的数目。13、   WorkingSets  WorkingSets=DBWRsxMaximumnumberofbufferpools(8).  它包含如下list: LRU: LRU-W:记录dirtybuffer LRU-P:Pinglist(HYPERLINK"javascript:;"\t"_self"RAC) LRU-XO::对象重用list,针对drop和truncate LUR-XR:块重用list ThreadCKPTqueue:线程CKPTbuffer FileCKPTqueue:文件CKPTbufferqueue RecoveryCKPTqueue:执行恢复的块14、   LRU和buckets/chains不同:  用于寻找某一指定的hashbuckets/chains  LRU提供寻找空闲buffer的方法,从list尾部开始找。  Bufferheader内容可以通过访问X$BH表来访问。15、   BufferGet请求一个buffer,首先会填充一个bufferdescriptor,步骤如下:  填充一个bufferdescriptor  指定buffer的占有模式  缓存数据块16、   典型的bufferdescriptor包括如下信息(位于PGA中):  FullRDBA(Rdba=relativedatablockaddress,bufferheader所对应的数据块的地址)  Class  Object#  指向bufferheader的提示  Pin(bufferstateobjectwithwhichtoassociateit)  Examinationfunction(ifCRorCRX)  Ifmultiblockread,thenthenumberofbufferstoberead17、   write-out一个老化的buffer的流程如下:1)        Buffer最初是在LRU-AUX.2)        移动到LRU-MAIN.3)        被修改后(释放闩),移出LRUW-MAIN。DBWR稍后把它移动到LRUW-AUX.4)        出列到I/O槽通过kcbbxsv(Oracle内部程序模块名称).5)        QueuewritesfromI/Oslots通过kcfqueuewr.6)        写入disk通过kcfdowr。完成18、   Touch的数量touchcount当一个buffer被touch到缓存中,touch数量就会增加1。19、   BufferCacheLatches与Cachebufferschains  块被hash为一个链,基于一对。每一个chain被一个子cachebufferschains保护,防止在扫描过程被改变。20、   CachebuffersLRUchain  保护LRU链。当进程需要移动buffer到某个LURset的时候,需要获得latch。在OracleHYPERLINK"javascript:;"\t"_self"server里面,它是最繁忙latch之一。为了减少竞争,可以设置多个_DB_BLOCK_LRU_LATCHES21、   Checkpointqueuelatch  在进程把buffer放在checkpointqueue之前,它必须确保queue没有正在被使用。这有点和LRUlist类似。3.2    BufferCacheFixedTables:buffercache固定的表  X$KCBBF:Bufferdescriptor状态对象和标志  X$KCBWH:描述where/whybuffergets的统计  X$KCBSW:why/wherebuffergets的统计.OnlyWHY0isused.  X$KCBBMC:Mapcountperbufferwhen_DB_BLOCK_CACHE_MAPisTRUE  X$KCBBHS:DBWRhistogramstatistics,enabledif_DB_WRITER_HISTOGRAM_STATISTICSisTRUE  X$KCBBES:DBWReventstatistics.  X$KCBWDS:Workingsetdescriptor.  V$WAITSTATonX$KCBWAIT  V$BUFFER_POOLonX$KCBWBPD3.3    影响buffercache的内部参数  _DB_BLOCK_HASH_BUCKETS:blockhashbuckets的数量(默认是DB_CACHE_SIZE/4)  _DB_BLOCK_MAX_SCAN_CNT:寻找空闲buffer的最大尝试次数  _DB_WRITER_SCAN_DEPTH:DBWR寻找脏块的的扫描深度  _DB_BLOCK_CACHE_CLONE:取的时候,复制一个副本(调试用)  _DB_BLOCK_CACHE_MAP:Map/unmapandtrackreferencecountsonblocks(fordebuggingpurposesonly)  _DB_BLOCK_MAX_CR_DBA:MaximumallowednumberofCRbuffersperdba  _DB_WRITER_HISTOGRAM_STATISTICS:MaintainDBWRhistogramstatisticsinX$KCBBHS  _DB_BLOCK_MED_PRIORITY_BATCH_SIZE:Percentageofwritebatchusedformediumprioritycheckpoints  _DB_BLOCK_HI_PRIORITY_BATCH_SIZE:Percentageofwritebatchusedforhighprioritycheckpoints  _DB_PERCENT_HOT_DEFAULT:Percentofdefaultbufferpoolconsideredhot  _DB_PERCENT_HOT_KEEP:Percentofkeepbufferpoolconsideredhot  _DB_PERCENT_HOT_RECYCLE:Percentofrecyclebufferpoolconsideredhot  _DB_AGING_HOT_CRITERIA:Touchcountwhichsendsabuffertoheadofreplacementlist  _DB_AGING_COOL_COUNT:Touchcountsetwhenbuffercooled  _DB_AGING_TOUCH_TIME:Touchcountwhichsendsabuffertoheadofreplacementlist  _DB_AGING_FREEZE_CR:MakeCRbuffersalwaysbetoocoldtokeepincache  _DB_AGING_STAY_COUNT:当buffer移动到LURheader的Touchcount  _DB_BLOCK_CACHE_PROTECT:保护databaseblocks(调试用)  _DB_BLOCK_HASH_LATCHES:databaseblockhashlatches的数目  _DB_HANDLES:同时能发生的buffer操作,系统级  _DB_HANDLES_CACHED:每个进程缓存的Buffer句柄  _DB_LARGE_DIRTY_QUEUE:脏块队列强制写入磁盘的门限  _DB_WRITER_MAX_WRITES:最大的DBWriterI/Os  _DB_WRITER_CHUNK_WRITES:DBWR尝试写等待次数  _DBWR_ASYNC_IO:激活DBWR异步写  _DBWR_TRACING:激活DBWR追踪  _DBWR_SCAN_INTERVAL:DBWRscaninterval  _TRACE_BUFFER_FLUSHES:追踪bufferflushes如果otracecacheIO事件被设置  _TRACE_MULTI_BLOCK_READS:追踪multi-block读,如果otracecacheIO事件被设置  _TRACE_CR_BUFFER_CREATES:追踪CRbuffer创建,如果otracecacheIO事件被设置  其它技巧  使用多个LRUlatch的时候,使用多个DBWR进程。  尽量使LRUlatch丢失率小于1%  使用asynchronousI/O或者DBWRI/OSlaves.  减少buffercacheload通过使用directI/O.3.4Buffercache的内存结构说从8.0以后,HYPERLINK"javascript:;"\t"_self"oracle提供了三种类型的buffercache,分别是default、keep、recyle。keep和recycle是可选的,default必须存在。8i以前使用db_block_buffer设置default、buffer_pool_keep设置keep、buffer_pool_recycle设置recyle。而8i以后使用db_cache_size设置default、db_keep_cache_size设置keep、db_recycle_cache_size设置recycle。HYPERLINK"javascript:;"\t"_self"10g不能自动设置db_keep_cache_size和db_recycle_cache_size,必须手工设置。8i以前,这三种buffercache是独立指定的,互不制约
本文档为【Oracleblogstudy相关资料】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
腐朽的灵魂
暂无简介~
格式:doc
大小:334KB
软件:Word
页数:0
分类:互联网
上传时间:2021-07-07
浏览量:0