




已阅读5页,还剩12页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一.进程简介ORACLE进程又分为两类:服务器进程 和 后台进程服务器进程用于处理连接到该实例的用户进程的请求.它可执行下列任务: 1) 对应用所发出的SQL语句进行语法分析和执行. 2) 从磁盘(数据文件)中读入必要的数据块到SGA的共享数据库缓冲区 3) 将结果返回给应用程序处理为获得最高的性能和适应多用户,一个多进程Oracle系统使用一些叫做后台进程的额外进程.一个Oracle实例可以有很多后台进程;但不是所有的都必须存在。后台进程数量很多。查看视图V$BGPROCESS可以得到关于后台进程的信息.二.进程种类一个Oracle实例中的后台进程可以包含下列进程:1,数据库写入进程(Database Writer Process,DBWn)2,日志写入进程(Log Writer Process,LGWR)3,检查点进程(Checkpoint Process,CKPT)4,系统监视进程(System Monitor Process,SMON) 5,进程监视进程(Process Monitor Process,PMON)6,恢复进程(Recoverer Process,RECO)7,任务队列进程(Job Queue Processes)8,归档进程(ARCn) 9,队列监控进程(Queue Monitor Processes,QMNn)10,其他后台进程Oracle相关后台进程可以通过linux命令查看:oraclelinux-Server: ps -ef|grep rpt_kpni_es |grep oracleoracle 30458 1 0 Feb08 ? 00:00:00 ora_pmon_rpt_kpni_esoracle 30460 1 0 Feb08 ? 00:00:00 ora_vktm_rpt_kpni_esoracle 30464 1 0 Feb08 ? 00:00:00 ora_diag_rpt_kpni_esoracle 30466 1 0 Feb08 ? 00:00:00 ora_dbrm_rpt_kpni_esoracle 30468 1 0 Feb08 ? 00:00:00 ora_psp0_rpt_kpni_esoracle 30472 1 0 Feb08 ? 00:00:00 ora_dia0_rpt_kpni_esoracle 30474 1 0 Feb08 ? 00:00:00 ora_mman_rpt_kpni_esoracle 30476 1 0 Feb08 ? 00:00:02 ora_dbw0_rpt_kpni_esoracle 30478 1 0 Feb08 ? 00:00:10 ora_lgwr_rpt_kpni_esoracle 30480 1 0 Feb08 ? 00:00:25 ora_ckpt_rpt_kpni_esoracle 30482 1 0 Feb08 ? 00:00:07 ora_smon_rpt_kpni_esoracle 30484 1 0 Feb08 ? 00:00:00 ora_reco_rpt_kpni_esoracle 30486 1 0 Feb08 ? 00:01:13 ora_mmon_rpt_kpni_esoracle 30488 1 0 Feb08 ? 00:00:00 ora_mmnl_rpt_kpni_esoracle 30490 1 0 Feb08 ? 00:00:00 ora_d000_rpt_kpni_esoracle 30492 1 0 Feb08 ? 00:00:00 ora_s000_rpt_kpni_esoracle 30624 1 0 Feb08 ? 00:00:00 ora_fbda_rpt_kpni_esoracle 30626 1 0 Feb08 ? 00:00:00 ora_smco_rpt_kpni_esoracle 30638 1 0 Feb08 ? 00:00:00 ora_qmnc_rpt_kpni_esoracle 30757 1 0 Feb08 ? 00:00:00 ora_q000_rpt_kpni_esoracle 31126 1 0 Feb08 ? 00:00:00 ora_q001_rpt_kpni_esoracle 15312 15258 0 10:29 ? 00:00:00 oraclerpt_kpni_es (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)oracle 20286 1 0 10:38 ? 00:00:00 ora_w000_rpt_kpni_esoracle 23432 1 0 10:43 ? 00:00:00 oraclerpt_kpni_es (LOCAL=NO)oracle 25393 1 0 10:47 ? 00:00:00 oraclerpt_kpni_es (LOCAL=NO)oracle 25414 1 0 10:47 ? 00:00:00 oraclerpt_kpni_es (LOCAL=NO)oracle 25506 24850 0 10:47 pts/6 00:00:00 grep rpt_kpni_es也可以通过视图V$PROCESS查看1.数据库写入进程(Database Writer Process,DBWn)数据写入进程(database writer process,DBWn)的功能是将数据缓冲区的内容写入数据文件。DBWn 进程负责将数据缓存区(database buffer cache)内修改过的缓冲区(即 dirty buffer)写入磁盘。对于大多数数据库系统来说,使用一个数据写入进程(DBW0)就足够了。当系统中数据修改操作较频繁时,DBA 可以配置额外的数据写入进程(DBW1 到 DBW9 及 DBWa 到 DBWj)来提高数据写入的性能。在单处理器系统(uniprocessor system)中,额外的数据写入进程并不能提高系统性能. DBWn 进程总是将最近最少使用的脏缓冲区写入磁盘,这既减少了用户进程找到可用缓冲区的时间,同时令最近使用较频繁的缓冲区能够保留在内存中.例如,存储访问频率较高的小数据表或索引的数据块能够被保留在内存中,而无需反复地从磁盘中读取。由于 LRU 算法能够将访问频率较高的数据块保留在数据缓存区内,因此一个缓冲区被写入磁盘后,其中所包含的数据被马上使用的可能性较小. 初始化参数 DB_WRITER_PROCESSES 用于设定系统中 DBWn 进程的数量。此参数的最大值为 20。如果实例启动时用户没有设定此参数,Oracle 将根据 CPU 及 处理器组(processor group)的数量决定如何设置 DB_WRITER_PROCESSES 参数.SQL show parameter db_writer_processNAME TYPE VALUE- - -db_writer_processes integer 1 增大DB_WRITER_PROCESSES 参数:SQL alter system set db_writer_processes=2 scope=spfile;System altered.重启后生效.触发DBWR进程的条件: 1. DBWR超时,大约3秒 2. 系统中没有多余的空缓冲区来存放数据 3. CKPT 进程触发DBWR 无论上述那种情况,DBWn 进程都将进行批量(多数据块)写入以便提高性能。一次批量写入的数据块数量依操作系统而不同2.日志写入进程(Log Writer Process,LGWR)Oracle在做任何操作的时候,第一件事就是要把所作的事情记录到redo里。 那么如果我们是直接把redo信息写入磁盘,这将很可能成为系统中的性能瓶颈,为了解决这个问题,我们有了SGA中的redo log buffer和后台进程中的LGWR。Redo log buffer顾名思义,就是用来在内存中暂时存储redo log的信息,LGWR用来把redo log buffer中的信息写入到磁盘上的redo log files里.触发LGWR写入的条件:1.事务提交commit.2. Log Buffer在1/3满时,会触发LGWR写入磁盘.3. 进程超时3秒(空闲状态) 扩展:l 在 DBWn 进程向磁盘写入脏缓冲区之前,所有与被修改数据相关的重做记录(redo record)必须先被写入磁盘(即提前写入协议(write-ahead protocol)。如果 DBWn 进程发现相关的重做日志还没有被写入磁盘,她将通知 LGWR 进程进行写入操作.DBWn 进程将等待 LGWR 进程将重做日志缓冲区内的相关数据写入磁盘后,才能将数据缓冲区写入磁盘.l 当用户执行 COMMIT 语句时,LGWR 进程在重做日志缓冲区内存储一条提交记录,并将此记录与所提交事务的重做条目立即写入磁盘。而此事务对数据库的修改将等到最高效的时机才被写入磁盘.这被称为快速提交(fast commit)机制.从8i开始,所有的commit默认都是fast commit.l 如果重做日志缓冲区内空间不足,LGWR 进程会在事务提交前就将重做日志条目写入磁盘。这样的重做日志条目只有在相关事务提交后才能永久地存储.l 在数据修改操作较频繁时,LGWR 进程能够采取批量提交(group commits)技术向重做日志文件写入数据.例如,当一个用户提交了一个事务后,LGWR 进程会将此事务的重做条目(redo entry)写入磁盘,与此同时系统中的其他用户也可能在执行 COMMIT 语句。但是 LGWR 进程需要在之.前的写入操作完成后,才能为后续的提交事务写入重做信息。当第一个事务的重做条目被写入磁盘后,在此期间等待提交的事物的重做条目可以被一起写入磁盘,这比分别写入每个事务的重做条目所需的 I/O 操作要少。Oracle 通过这种办法减少了磁盘 I/O 并提升了 LGWR 进程的性能。如果系统中的提交频率一直很高,那么 LGWR 进程每次从重做日志缓冲区向磁盘的写入数据中都包含多个提交事务的信息.3.检查点进程(Checkpoint Process,CKPT)检查点是一个数据库事件,它把修改数据从高速缓存写入磁盘,并更新控制文件和数据文件.1_ 局部检查点:单个实例执行数据库所有数据文件的一个检查点操作,属于此实例的全部脏缓存区写入数据文件。触发命令:alter system checkpoint local;2_ 全局检查点:所有实例(对应并行数据服务器)执行数据库所有数据文件的一个检查点操作,属于此实例的全部脏缓存区写入数据文件。触发命令:alter system checkpoint global;3_ 文件检查点:所有实例需要执行数据文件集的一个检查点操作,如使用热备份命令alter tablespace USERS begin backup,或表空间脱机命令alter tablespace USERS offline,将执行属于USERS表空间的所有数据文件的一个检查点操作.1.当发生日志组切换的时候(日志文件满了)2.当符合LOG_CHECKPOINT_TIMEOUTLOG_CHECKPOINT_INTERVALfast_start_io_targetfast_start_mttr_target 参数设置的时候 当数据库使用大型联机重做日志文件时,可以通过设置以下初始化参数来设置其它数据库检查点,以改善数据库的性能3.当运行ALTER SYSTEM SWITCH LOGFILE的时候(显式切换)4.当运行ALTER SYSTEM CHECKPOINT的时候5.当运行alter tablespace XXX begin backup,end backup的时候6.当运行alter tablespace ,datafile offline的时候4.系统监视进程(System Monitor Process,SMON) 该进程实例启动时执行实例恢复,还负责清理不再使用的临时段。在具有并行服务器选项的环境下,SMON对有故障CPU或实例进行实例恢复。SMON进程有规律地被呼醒,检查是否需要,或者其它进程发现需要时可以被调用.1. 清理临时空间以及临时段SMON负责在数据库启动时清理临时表空间中的临时段,或者一些异常操作过程遗留下来的临时段,例如,当创建索引过程中,创建期间分配给索引的Segment被标志为TEMPORARY,如果Create Index (或rebuild Index等)会话因某些原因异常中断,SMON负责清理这些临时段.2. 接合空闲空间在DMT(字典管理表空间)中,SMON负责把那些在表空间中空闲的并且互相是邻近的Extent接合成一个较大的空闲扩展区.3. 执行实例恢复(Instance recovery)在实例恢复过程中,SMON的工作包括三个环节:应用Redo执行前滚、打开数据库提、回滚.4. 离线(Offline)回滚段在自动回滚段管理(AUM)中负责Offline不再需要的回滚段,日志中会记录类似如下信息:SMON offlining US=11SMON offlining US=12SMON offlining US=135. 执行并行恢复日志中记录一下信息SMON: Parallel transaction recovery triedAlso Recordsome English Note About SMON:5.进程监视进程(Process Monitor Process,PMON)1. 负责在出现异常中止的连接之后完成清理。PMON 会回滚未提交的工作,并释放为失败进程分配的SGA 资源. PMON将发出未提交工作的回滚,释放锁,和释放分配给故障进程的SGA资源2. 监视其他的Oracle 后台进程,并在必要时(如果可能的话)重启这些后台进程. 例如,在数据库日志写进程事件中,LGWR故障,实例故障.这是一个严重的错误,最安全的处理方法就是去立即终止实例,让正常【的恢复处理数据.3. 向Oracle TNS 监听器注册这个实例,实例启动时,PMON 进程会询问公认的端口地址(除非直接指定),来查看是否启动并运行了一个监听器.如果数据库实例启动时有监听器在运行,PMON 会与这个监听器通信,并向它传递相关的参数,如服务名和实例的负载度量等。如果监听器未启动,PMON 则会定期地试图与之联系来注册实例.6.恢复进程(Recoverer Process,RECO)RECO负责解决分布事务中的故障。ORACLE可能在网络连接的多个机器上有多个数据库。当网络或结点失效时,根据失效何时发生,有些事务将被置于悬而未决的状态。RECO试着去与远程服务器通信,当数据库之间连接建立时,RECO进程自动解决所有的悬而未决的事务.7.任务队列进程(Job Queue Processes)作业队列进程(job queue process)的功能是进行批处理(batch processing)。这种进程用于运行用户的作业(job)。这种进程能够提供作业调度服务(scheduler service),在 Oracle 实例中调度 PL/SQL 语句及存储过程。用户只需提供作业的开始时间及调度间隔,作业队列进程就能够按用户的设定调度作业. 作业队列进程可以被动态地管理。这样当用户需要时就能够使用更多的作业队列进程。当一个作业队列进程进入空闲状态(idle)后,其使用的资源将被释放. 动态的作业队列进程可以按指定的时间间隔运行大量的作业。用户的作业是由 CJQ 进程交给作业队列进程执行的.具体步骤如下: 名为 CJQ0 的协调进程(coordinator process)从系统的 JOB$ 表中定期地查询需要运行的作业。被选出的作业将按照时间排序。 CJQ0 进程动态地生成新的作业队列进程(J000 . J999)来运行作业。 作业队列进程执行一个由 CJQ 进程选出的作业。每个工作队列进程每次只能执行一个进程。 当一个工作队列进程执行完一个作业后,就能够接受下一个作业。如果此时系统中已经没有需要被调度的作业了,此进程将进入休眠状态(sleep state);此进程还会定期地苏醒(wake up)等待分配其他作业。如果在预设的时间内没有新的作业,此进程将终止. 初始化参数 JOB_QUEUE_PROCESSES 表示实例中可以并行执行的最大作业队列进程数。但是并不是所有的作业队列进程都可以用于执行用户的作业. 提示:如果初始化参数 JOB_QUEUE_PROCESSES 被设置为 0,协调进程将不会被启动.8.归档进程(ARCH) 在重做日志文件管理中有归档与非归档两种模式.在日志进行切换的时候,如果不对原先的日志文件进行归档,而直接覆盖的话,就叫做非归档模式.相反,在写入下一个日志文件的时候,会对目标日志文件进行归档,这叫做归档模式.归档进程就是负责在重做日志切换后将已经写满的重做日志文件复制到日志文件中,以防止循环写入重做日志时将其覆盖.所以说只有在归档模式下,这个ARCH才会被启动.在任何一种操作模式下,重做日志文件都会被循环使用.所以当LGWR进程在进行日志切换,需要用到下一个日志文件时,则数据库会被暂时挂起,进行目标日志文件的归档工作,直到这个目标重做日志文件归档完毕后,数据库才会恢复正常,所以说归档日志的操作,有时候也会影响数据库的性能,特别是当需要进行频繁的大批量的数据更改的时候.归档日志进程的个数与CPU有关系的.可以查看数据库的最大归档日志进程的个数:SQL show parameter log_archive_max_processes;NAME TYPE VALUE- - -log_archive_max_processes integer 4最大值为30个.9.队列监控进程(Queue Monitor Processes,QMNn)队列监控进程(queue monitor process)是供 Oracle 工作流高级队列(Oracle Streams Advanced Queuing)使用的可选的进程,用于监控消息队列.队列监控进程和作业队列进程(job queue process)与其他 Oracle 后台进程的区别在于,这两类进程出错不会导致整个实例出错.10.其他后台进程1. MMON 进程负责执行多种和可管理性相关(manageability-related)的后台任务,例如: 当某个测量值(metrics)超过了预设的限定值(threshold value)后提交警告创建新的 MMON 隶属进程(MMON slave process)来进行快照(snapshot)捕获最近修改过的 SQL 对象的统计信息. 2. MMNL 进程负责执行轻量级的且频率较高的和可管理性相关的后台任务,例如捕获会话历史信息,测量值计算等. 3. MMAN 进程负责执行数据库系统的内部任务. 4. RBAL 进程 在使用了自动存储管理(Automatic Storage Management)的实例中,RBAL 进程负责协调磁盘组间的负载平衡工作。她可以使多个实例同时访问一个 ASM 磁盘(global open)。最终由 ORBn 进程实际执行数据扩展的负载均衡。实例中可以运行多个 ORBn 进程,分别为 ORB0,ORB1,以此类推. 5. OSMB 进程 当数据库实例使用 ASM 磁盘组时,还要启动 OSMB 进程。此进程负责和 ASM 实例(Automatic Storage Management instance)通信. 6. DIAG 进程数据库诊断进程, (The diagnosibility process) ,负责维护管理各种用于诊断的转储文件,并执行oradebug命令.7. DIA0 进程另一个数据库诊断进程,负责检测Oracle数据库中的挂起(hang)和死锁的处理.8. p000 p001 进程Pnnn(并行查询服务器进程) 当数据库内部启用并行查询选项,一个查询的资源要求可以分布在多个处理器中。当实例启动时,就启动指定数量的并行查询服务器进程,其数量由参数:PARALLEL_MIN_SERVERS参数决定。这样的进程出现在操作系统级,其命名为P000、P0001等.默认2个进程,其最大数量由PARALLEL_MAX_SERVERS 决定.9. d000 d001 进程Dnnn (调度程序进程)是共享服务器结构的一部分,有助于减少处理多个连接所需要的资源.对于数据库服务器支持的每一种协议必须至少创建一个调度程序进程,调度程序进程在数据库启动时,基于初始化参数DISPATCHERS创建,也可以在数据库打开时创建或取消.10. s000 s001 进程Server:Snnn 创建服务器进程来管理需要专用服务器的数据库连接。服务器进程可以数据文件进行I/O操作。它的最大数量由初始化参数SHARED_SERVERS确定.11. VKTM进程(virtual keeper of time)在11g之前所有的Oracle数据库后台或者前台进程如果需要获得当前时间信息,就需要调用操作系统的gettimeofday()函数或者说是相类似的函数.而VKTM进程就是专门用来获得时间信息然后将信息存放在SGA中供其它进程使用,这样其它进程当需要时间信息的时候,只要到SGA的某个内存位置去获得就好,而不用频繁调用gettimeofday()函数.毫无疑问,这样效率会更高.三.Oracle内存Oracle的内存配置与oracle性能息息相关.关于内存的配置,是最影响Oracle性能的配置.内存还直接影响到其他两个重要资源的消耗:CPU和IO. 先看Oracle内存存储的主要内容是什么:_ 程序代码(PLSQL、Java)_ 关于已经连接的会话的信息,包括当前所有活动和非活动会话_ 程序运行时必须的相关信息,例如查询计划_ Oracle进程之间共享的信息和相互交流的信息,例如锁 _ 那些被永久存储在外围存储介质上,被cache在内存中的数据(如redo log条目,数据块).每个Oracle数据库都是由Oracle Instance(实例)与数据库(数据文件,控制文件、重做日志文件)组成,其中所谓实例就是用户同数据库交互的媒介,用户通过于一个实例相连来操作数据库。而实例又是由统一的内存结构(SGA,PGA,UGA)和一批内存驻留进程组成.实例在操作系统中用ORACLE_SID来标识,在Oracle中用参数INSTANCE_NAME来标识, 它们两个的值是相同的。数据库启动时,系统首先在服务器内存中分配系统全局区(SGA), 构成了Oracle的内存结构,然后启动若干个常驻内存的操作系统进程,即组成了Oracle的 进程结构,内存区域和后台进程合称为一个Oracle实例.1. SGA(The User Global Area)SQL show sgaTotal System Global Area 301305856 bytesFixed Size 1299540 bytesVariable Size 184552364 bytesDatabase Buffers 109051904 bytesRedo Buffers 6402048 bytesFixed Size : SGA中固定组件(它在编译oracle 数据库本身时就固定于其中)的大小。它是固定大小的内存,用来指向SGA的其它部分.SGA这一部分的大小是不能改变的.里面存储了 SGA 各部分组件的信息,可以看作引导建立 SGA 的区域Variable Size : 包括 shared pool ,java pool ,large pool, 管理DB_BLOCK_BUFFERS 的内存,管理控制文件信息的内存,等等其他管理和控制 oracle 内部结构的内存.SQL show parameter sgaNAME TYPE VALUE- - -lock_sga boolean FALSEpre_page_sga boolean FALSEsga_max_size big integer 288Msga_target big integer 288MLock_sga: 为了保证SGA都被锁定在物理内存中,而不必页入/页出,可以通过参数LOCK_SGA来控制。这个参数默认值为FALSE,当指定为TRUE时,可以将全部SGA都锁定在物理内存中。当然,有些系统不支持内存锁定,这个参数也就无效了.Pre_page_sga: oracle实例启动时,会只载入各个内存区最小的大小。而其他SGA内存只作为虚拟内存分配,只有当进程touch到相应的页时,才会置换到物理内存中。我们可以通过设置PRE_PAGE_SGA参数,让实例一启动后,所有SGA都分配到物理内存.Sga_Max_Size: SGA区包括了各种缓冲区和内存池,而大部分都可以通过特定的参数来指定他们的大小.过多的使用虚拟内存导致page in/out,会大大影响系统的性能,甚至可能会导致系统crash。所以需要有一个参数来控制SGA使用虚拟内存的最大大小,这个参数就是SGA_MAX_SIZE.这是针对操作系统给的一个限制.Sga_target: 10g 以后有了新特性,自动共享内存管理(Automatic Shared Memory Management ASMM).而控制这一特性的,也就仅仅是这一个参数SGA_TARGE。设置这个参数后,就不需要为每个内存区来指定大小了.SGA_TARGET指定了SGA可以使用的最大内存大小,而SGA中各个内存的大小由Oracle自行控制,不需要人为指定.Oracle可以随时调节各个区域的大小,使之达到系统性能最佳状态的个最合理大小,并且控制他们之和在SGA_TARGET指定的值之内.一旦给SGA_TARGET指定值后(默认为0,即没有启动ASMM),就自动启动了ASMM特性.如果不设置SGA_TARGET,则自动共享内存管理功能被禁止.实际控制内存使用的最大值是Sga_target.SQL select name,value ,ISSYS_MODIFIABLE from v$parameter where name like sga%;NAME VALUE ISSYS_MOD- - -sga_max_size 612368384 FALSEsga_target 612368384 IMMEDIATE如果ISSYS_MODIFIABLE 返回的是false,说明该参数无法用alter system语句动态修改,需要重启数据库生效.所以sga_max_size 是不可以动态调整的。但是我们可以对sga_target 进行动态的调整.SQL alter system set sga_target=200M;System altered.SQL show parameter sgaNAME TYPE VALUE- - -sga_max_size big integer 288Msga_target big integer 200M如果将sga_max_size修改比target小,会导致数据库启动失败,错误信息如下:ORA-00823: Specified value of sga_target greater than sga_max_sizeA. Data Buffer CacheBuffer Cache是SGA区中专门用于存放从数据文件中读取的的数据块拷贝的区域。Oracle进程如果发现需要访问的数据块已经在buffer cache中,就直接读写内存中的相应区域,而无需读取数据文件,从而大大提高性能(内存的读取效率是磁盘读取效率的14000倍).Buffer cache对于所有oracle进程都是共享的,即能被所有oracle进程访问.1. Buffer cache的管理Oracle对于buffer cache的管理,是通过两个重要的链表实现的:写链表和最近最少使用链表(the Least Recently Used LRU).写链表所指向的是所有脏数据块缓存(即被进程修改过,但还没有被回写到数据文件中去的数据块,此时缓冲中的数据和数据文件中的数据不一致).而LRU链表指向的是所有空闲的缓存、pin住的缓存以及还没有来的及移入写链表的脏缓存。空闲缓存中没有任何有用的数据,随时可以使用。而pin住的缓存是当前正在被访问的缓存.LRU链表的两端就分别叫做最近使用端(the Most Recently Used MRU)和最近最少使用端(LRU).2. Buffer cache的数据块访问当一个Oracle进程访问一个缓存时,这个进程会将这块缓存移到LRU链表中的MRU而当越来越多的缓冲块被移到MRU端,那些已经过时的脏缓冲(即数据改动已经被写入数据文件中,此时缓冲中的数据和数据文件中的数据已经一致)则被移到LRU链表中LRU端.当一个Oracle用户进程第一次访问一个数据块时,它会先查找buffer cache中是否存在这个数据块的拷贝。如果发现这个数据块已经存在于buffer cache(即命中cache hit),它就直接读从内存中取该数据块。如果在buffer cache中没有发现该数据块(即未命中cache miss),它就需要先从数据文件中读取该数据块到buffer cache中,然后才访问该数据块。命中次数与进程读取次数之比就是我们一个衡量数据库性能的重要指标:buffer hit ratio(buffer命中率).可以通过以下语句获得自实例启动至今的buffer命中率:SQL select (1-(sum(decode(name, physical reads,value,0)/(sum(decode(name, db block gets,value,0)+sum(decode(name,consistent gets,value,0) * 100 Hit Ratio from v$sysstat; Hit Ratio-90.5794114一个良好性能的系统,命中率一般保持在95%左右.上面提到,如果未命中(missed),则需要先将数据块读取到缓存中去。这时,oracle进程需要从空闲列表种找到一个适合大小的空闲缓存。如果空闲列表中没有适合大小的空闲buffer,它就会从LRU端开始查找LRU链表,直到找到一个可重用的缓存块或者达到最大查找块数限制。在查找过程中,如果进程找到一个脏缓存块,它将这个缓存块移到写链表中去,然后继续查找。当它找到一个空闲块后,就从磁盘中读取数据块到缓存块中,并将这个缓存块移到LRU链表的MRU端.当请求分配buffer时,已经没有适合大小的空闲buffer时,需要从LRU链表上获取到可重用的buffer。但是,LRU链表上的buffer并非都是立即可重用的,还会存在一些块正在被读写或者已经被别的用户所等待。根据LRU算法,查找可重用的buffer是从链表的LRU端开始查找的,如果这一段的前面存在这种不能理解被重用的buffer,则需要跳过去,查找链表中的下一个buffer。“free buffer inspected”就是被跳过去的buffer的数目.3. Flush Buffer回顾一下前面一个用户进程访问一个数据块的过程,如果访问的数据块不在buffer cache中,就需要扫描LRU链表,当达到扫描块数限制后还没有找到空闲buffer,就需要通知DBW0将脏缓存回写到磁盘。如果一个系统中存在大量的脏缓冲,那么就可能导致用户进程访问数据性能下降.我们可以通过人工干预将所有脏缓冲回写到磁盘去,这就是flush buffer.在9i,可以用以下语句:alter system set events = immediate trace name flush_cache;在10g,可以用以下方式(9i的方式在10g仍然有效): alter system flush buffer_cache;效果测试:1. 建立一个测试表create table test_10 as select * from dba_objects;2. 对这个表进行分析analyze table test_10 compute statistics;3. 查看此表的占用块数select blocks,empty_blocks from dba_tables where table_name=TEST_10 select blocks,empty_blocks from dba_tables where table_name=TEST_10; 4. 查看此时Buffer cache中空闲的块(不包含脏数据)select count(*) from x$bh where state=0; x$bh-buffer header 它记录了数据块头信息,=0 表示,释放的数据块5. 手动刷新Buffer Cachealter system set events = immediate trace name flush_cache;alter system flush buffer_cache;select count(*) from x$bh where state=0; 测试结果:对比刷新前后的空闲块的数量.4. Buffer Cache的重要参数以及视图_ db_block_sizebuffer中默认的块大小.默认为8K_ db_file_multiblock_read_count全表扫描时,Oracle一次性读取的块的数量.例如:块大小为4KB,缓冲区为64KB,那么一次性最多为64/4=16个块,所以当这个参数设置操作16后也不能提高性能. _ V$sga_Dynamic_Components可以根据视图V$sga_Dynamic_Components查看到各种buffer的大小._ db_16k_cache_size 默认Buffer Cache缓存的是8k大小的块.因为在通常创建的表空间都是默认8k块大小.如果创建了一个16K块大小的表空间,则需要通过设置参数db_16k_cache_size.如下: Altere system set db_16k_cache_size=10M; - 专门为16k块提供的缓存区域 若不设置就会报一下错误. 10G中提供了自动内存管理,通过使用sga_target在在多个组件间自动分配内存以保证最有效的内存使用.如shared pool javapool largepool buffer cache都无需显式设置这些组件的大小,默认都是0,当某个组件需要内存时,可以通过内部自动调整机制请求内存转移.B. Redo Log Buffer为了避免,或者说为了修复这些状况所导致的数据丢失现象,oracle引入了日志缓冲区和日志文件的概念.所谓日志,就是将所有数据库中所有改变数据块的操作,都原原本本的记录下来. 从而达到恢复数据库的目的.如果是实时写入日志文件,必将造成大量的IO以及等待.,所以Oracle采用了批量写入的方式.为了临时存放所产生的日
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 教育行业发展趋势报告:2025年教育行业未来发展方向与挑战
- 金融科技赋能2025年普惠金融普惠性评估模型创新与实践研究报告
- 玉露香梨采摘协议协议书
- 父母房产分给子女协议书
- 股东欠债股份转让协议书
- 股份财产分配协议书范本
- 物管装修垃圾清运协议书
- 网约车区域代理协议合同
- 银行共同合作协议书范本
- 物流信息部签约合同范本
- 建设项目使用林地可行性报告
- 新安全生产法2025全文
- 感恩地球活动方案
- 2025年中国共产党支部工作条例(试行)暨党支部建设标准化工作知识竞赛考试试题(综合题库)(含答案)
- 2025年江苏省扬州树人学校七年级英语第二学期期末综合测试试题含答案
- 中试基地相关管理制度
- 2025年云南省中考数学试卷真题及解析答案
- 2025至2030中国安全劳保用品行业发展分析及产业运行态势及投资规划深度研究报告
- 2025年广东省广州市华兴教育港澳台联考学校高考英语三模试卷
- 2025事业单位工勤技能考试考试题库及答案
- 拐杖的使用试题及答案
评论
0/150
提交评论