`
liwenshui322
  • 浏览: 519296 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

oracle进程(第四节 DBWn、CKPT、LGWR进程之间的合作)

阅读更多

 4.DBWn,CKPT,LGWR进程

    首先,简要介绍一下: 
      DBWn:数据库块写入器(Database Block Writer)负责将脏块写入磁盘的后台进程。 
      CKPT:检查点进程(Checkpoint Process)只是更新数据文件的文件首部,以辅助建立检查点的进程(DBWn)。 
      LGWR:日志写入器(Log Writer)负责将SGA中重做日志缓冲区的内容刷新输出到磁盘。 
     

      其实这三个进程都是为了更好地完成一件事:安全高效地实现内存数据块写入数据文件,就是将内存中修改的数据反映到硬盘的数据文件上。 

      将内存数据块写入数据文件实在是一个相当复杂的过程,在这个过程中,首先要保证安全。所谓安全,就是在写的过程中,一旦发生实例崩溃,要有一套完整的机制能够保证用户已经提交的数据不会丢失;其次,在保证安全的基础上,要尽可能地提高效率。众所周知,I/O操作是最昂贵的操作,所以应该尽可能地将脏数据块收集到一定程度以后,再批量写入磁盘中。 

      直观上最简单的解决方法就是,每当用户提交的时候就将所改变的内存数据块交给DBWn,由其写入数据文件。这样的话,一定能够保证提交的数据不会丢失。但是这种方式效率最为低下,在高并发环境中,一定会引起I/O方面的争用。Oracle当然不会采用这种没有伸缩性的方式。Oracle引入了CKPT和LGWR这两个后台进程,这两个进程与DBWn进程互相合作,提供了既安全又高效的写脏数据块的解决方法。

         第一:如何保证安全? 
      用户进程每次修改内存数据块时,都会在日志缓冲区(log buffer)中构造一个相应的重做条目(redo entry),该重做条目描述了被修改的数据块在修改之前和修改之后的值。而LGWR进程则负责将这些重做条目写入联机日志文件。只要重做条目进入了联机日志文件,那么数据的安全就有保障了,否则这些数据都是有安全隐患的。LGWR是一个必须和前台用户进程通信的进程。LGWR 承担了维护系统数据完整性的任务,它保证了数据在任何情况下都不会丢失。

      假如DBWR在写脏数据块的过程中,突然发生实例崩溃时,该怎么办?我们已经知道,用户提交时,Oracle是不一定会把提交的数据块写入数据文件的。那么实例崩溃时,必然会有一些已经提交但是还没有被写入数据文件的内存数据块丢失了。当实例再次启动时,Oracle需要利用日志文件中记录的重做条目在buffer cache中重新构造出被丢失的数据块,从而完成前滚和回滚的工作,并将丢失的数据块找回来。于是这里就存在一个问题,就是Oracle在日志文件中找重做条目时,到底应该找哪些重做条目?换句话说,应该在日志文件中从哪个起点开始往后应用重做条目?注意,这里所指的日志文件可能不止一个日志文件。

      这个起点意义重大,在日志文件中位于这个起点之前的重做条目所对应的在buffer cache中的脏数据块已经被写入了数据文件,从而在实例崩溃以后的恢复中不需要去考虑。而这个起点以后的重做条目所对应的脏数据块实际还没有被写入数据文件,如果在实例崩溃以后的恢复中,需要从这个起点开始往后,依次取出日志文件中的重做条目进行恢复。考虑到目前的内存容量越来越大,buffer cache也越来越大,buffer cache中包含几百万个内存数据块也是很正常的现象的前提下,如何才能最有效的来定位这个起点呢?

      为了能够确定这个最佳的起点,Oracle引入了名为CKPT的后台进程,通常也叫作检查点进程(checkpoint process)。这个进程与DBWn共同合作,从而确定这个起点。同时,这个起点也有一个专门的名字,叫做检查点位置(checkpoint position,该检查点位置记录在控制文件里)。Oracle为了在检查点的算法上更加的具有可扩展性(也就是为了能够在巨大的buffer cache下依然有效工作),引入了检查点队列(checkpoint queue),该队列上串起来的都是脏数据块所对应的buffer header。而每次DBWn写脏数据块时,也是从检查点队列上扫描脏数据块,并将这些脏数据块实际写入数据文件的。当写完以后,DBWn会将这些已经写入数据文件的脏数据块从检查点队列上摘下来。这样即便是在巨大的buffer cache下工作,CKPT也能够快速的确定哪些脏数据块已经被写入了数据文件,而哪些还没有写入数据文件,显然,只要在检查点队列上的数据块都是还没有写入数据文件的脏数据块。同时为了能够尽量减少实例崩溃后恢复的时间,Oracle还引入了增量检查点(incremental checkpoint),从而增加了检查点启动的次数。如果每次检查点启动的间隔时间过长的话,再加上内存很大,可能会使得恢复的时间过长。因为前一次检查点启动以后,标识出了这个起点。然后在第二次检查点启动之前,DBWn可能已经将很多脏数据块已经写入了数据文件,而假如在第二次检查点启动之前发生实例崩溃,导致在日志文件中,所标识的起点仍然是上一次检查点启动时所标识的,导致Oracle不知道这个起点以后的很多重做条目所对应的脏数据块实际上已经写入了数据文件,从而使得Oracle在实例恢复时重复地处理一遍,效率低下,浪费时间。

      上面说到了有关CKPT的两个重要的概念:检查点队列(包括文件队列)和增量检查点。检查点队列上的buffer header是按照数据块第一次被修改的时间的先后顺序来排列的。越早修改的数据块的buffer header排在越前面,同时如果一个数据块被修改了多次的话,在该链表上也只出现一次。而且,检查点队列上的buffer header还记录了脏数据块在第一次被修改时,所对应的重做条目在重做日志文件中的地址,也就是LRBA(Low Redo Block Address),Low表示第一次修改时对应的RBA。每个检查点都会由checkpoint queue latch来保护。
      上面所描述的概念,用一句话来概括,其实就是DBWn负责写检查点队列上的脏数据块,而CKPT负责记录当前检查点队列的第一个数据块所对应的的重做条目在日志文件中的地址。而到底应该写哪些脏数据块,写多少脏数据块,则要到检查点队列上才能确定的。
      下面是我个人的理解:假设前台用户在某一分钟内正源源不断地进行更新数据。他每更新一个内存数据块,就会触发两个动作,其一,LGWR进程就会在日志缓冲区构造一个重做条目,保存一些修改的信息,便于今后在内存中重新构造出这块内存数据块。并把这个重做条目写入到重做日志文件。其二,CKPT进程负责将该内存块对应的buffer header加入检查点队列,buffer header相当于一个指针,通过它能够找到对应的内存块数据!那么DBWn进程在干吗呢,它在收集修改过的内存数据块,假设收集到50块的时候,就将这50块修改过的内存数据反映到硬盘的数据文件里面。不过DBWn只负责收集,修改硬盘数据交给了操作系统去处理,处理成功之后,操作系统给DBWn 一个信号,这个时候,DBWn就将这50块内存数据块对应的检查点从检查点队列上面摘下来!这样如果系统在写硬盘数据的时候突然崩溃,检查点队列里面对应的数据块都是修改了,但没来得及写入硬盘的!这样就保证了数据的安全与高效。不过这里我有一个疑问,增量检查点好像没用啊?我的理解肯定有点偏差。希望大家前来讨论!

 

参考书籍:Oracle数据库技术实用详解:教你如何成为10g OCP    

 

 

 

 

 

1
0
分享到:
评论

相关推荐

    Oracle 12c完整后台进程&内存结构图 DBA必备

    Oracle 12c 内部架构与后台进程详解 Oracle 12c 是一款功能强大且复杂的关系数据库管理系统,了解其内部架构和后台进程是 DBA 的必备知识。本文将详细介绍 Oracle 12c 的后台进程和内存结构图,帮助读者深入了解 ...

    Oracle后台进程

    CKPT进程的工作原理与DBWn和LGWR紧密相关,三者协同工作,共同保障了数据库数据的安全性和可用性。 #### 系统监控进程(SMON) 系统监控进程(SMON),全称System Monitor Process,是Oracle数据库中负责维护...

    oracle后台进程

    在Oracle数据库中,DBWn进程的数量取决于系统配置,通常情况下,每个实例至少有一个DBWn进程。当数据被修改后,修改后的数据块首先存储在数据库高速缓存中,由DBWn进程定期或按需将其写回磁盘上的数据文件。 #### 3...

    oracle 10G常见进程

    - 在定期检查点(Checkpoint)期间,CKPT进程会触发DBWn进程将数据写入磁盘。 **参数配置**: - `db_writer_processes` 参数用于指定DBWn进程的数量,默认情况下,Oracle会根据系统的CPU和处理器数量自动设定这一...

    expert one-on-one oracle 10g chap5

    这些进程包括数据库块写入器(DBWn)、日志写入器(LGWR)等,在此前的内容中已有提及。接下来,我们将更加细致地探索每个进程的功能、它们如何运作以及存在的必要性。 在讨论“进程”时,它在基于线程的操作系统...

    oracle教程02oracle体系结构.ppt

    - 服务器进程:包括PMON(进程监控器)、SMON(系统监控器)、RECO(恢复进程)、ARCn(归档进程)、DBWn(数据写入进程)、LGWR(日志写入进程)、CKPT(检查点进程)等,以及其他各种辅助进程。 4. 存储结构:...

    ORACLE实例的后台进程

    Oracle8i引入了增量检查点,使得DBWn和LGWR之间的写入更平衡,提高系统性能并预测恢复时间。 除了这些核心进程,Oracle还有其他一些进程,例如10g之后新增的MMON、MMNL和MMAN,它们分别用于数据库的自我监控、辅助...

    oracle 体系结构详解

    另外,Oracle体系结构还包括其他后台进程,如日志写入器进程(LGWR)、检查点进程(CKPT)、数据库写入器进程(DBWn)等,它们共同工作确保数据的一致性和完整性。 Oracle体系结构的知识点非常广泛,包括了对数据库...

    OracleDB体系结构

    3. **数据库写进程(DBWn)**:将修改后的块从数据库缓冲区高速缓存写入磁盘中的数据文件。 4. **检查点(CKPT)**:更新数据库的所有数据文件和控制文件,指出最新的检查点位置。 5. **日志写进程(LGWR)**:将重做日志...

    oracle043第一章

    Oracle进程包括系统监视器(SMON)、数据库写进程(DBWn)、日志写进程(LGWR)、检查点(CKPT)、进程监视器(PMON)等后台进程,以及用于用户交互的服务器进程。 4. **RMAN (Recovery Manager)**:RMAN是Oracle提供的一个...

    DBA-I 第一章 ORACLE体系结构(一).docx

    服务器进程则是Oracle服务器端的组成部分,它们处理来自用户进程的请求,包括SMON(系统监控)、PMON(进程监控)、DBWn(数据库写进程)、LGWR(日志写进程)、ckpt(检查点进程)等后台进程。这些进程协同工作,...

    Oracle DBA 面试题

    4. Oracle后台进程(Oracle Background Processes):了解Oracle数据库的后台进程,包括SMON、PMON、DBWn、LGWR、CKPT等,以及它们在数据库中的作用。 5. 补丁和升级(Patches and Upgrades):应聘者需要熟悉...

    Oracle checkpoint 检查点详解

    _checkpoint 事件由 checkpoint 进程(LGWR/CKPT 进程)发出, DBWn 会将脏块写入到磁盘中,同时数据文件和控制文件的文件头也会被更新以记录 checkpoint 信息。 Checkpoint 的主要作用有两个:一是保证数据库的...

    Oracle数据库体系结构( 中文详细版)

    10. **进程**(Processes):Oracle数据库运行时涉及多种进程,如数据库服务器进程(DBWn)、检查点进程(CKPT)、日志写入进程(LGWR)、系统监控(SMON)和进程监控(PMON)等,它们协同工作以保证数据库的正常...

    Oracle的内存结构与进程结构.docx

    ### Oracle的内存结构与进程结构 #### 一、Oracle实例(Instance) 在Oracle数据库系统中,每一个运行的数据库实例都紧密关联着一个特定的数据库。这个实例是用户访问数据库的基础平台。实例通常由两大部分组成:...

    Oracle体系结构图以及分析

    5. 检查点进程(CKPT):更新控制文件和数据文件的状态信息,确保一致性。 用户连接到Oracle服务器的过程通常涉及以下步骤: 1. 用户启动SQL客户端工具或应用程序,创建一个用户进程。 2. 用户进程通过网络或本地...

Global site tag (gtag.js) - Google Analytics