`
itspace
  • 浏览: 981760 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Oracle 进程之DBWR运行原理

阅读更多

在讲DBWR进程之前,简单介绍下working set。即working set=LRU+LRUW。LRU和LRUW总是成对出现。LRU指的是替换列,主要分为主列和辅助列。主列指的是已使用的缓冲区列,以hot区域和cold区域区分管理。LRUW指的是记录列。也分为主列和辅助列。主列主要指的是已修改的缓冲区列。辅助列指的是当前DBWR写入中的缓冲区列。DBWR运行原理如下:

当进程在辅助LRU链表和主LRU链表上扫描以查找可以覆盖的buffer header(空闲缓冲区)时,如果已经扫描的buffer header的数量到达一定的限度(由隐藏参数:_db_block_max_scan_pct决定)时,触发DBWR进程。 _db_block_max_scan_pct表示已经扫描的buffer header的个数占整个LRU链表上buffer header总数的百分比。通过DBWR保证拥有空闲缓冲区为止,这时,搜索可用buffer header的进程挂起,在v$session_wait中表现为等待“free buffer wait”事件,同时增加v$sysstat中的“dirty buffers inspected”和“DBWR make free requests”的值。
引用
NAME                                          VALUE                PDESC
--------------------------------------------- -------------------- --------------------------------------------------
_db_block_max_scan_pct                        40                   Percentage of buffers to inspect when looking for free


引用
SQL> select KVITVAL,KVITTAG,KVITDSC from x$kvit
  2  where KVITTAG='kcbfsp';    

   KVITVAL KVITTAG                             KVITDSC
---------- ----------------------------------- ----------------------------------------------------------------
        40 kcbfsp                              Max percentage of LRU list foreground can scan for free
SQL> col VALUE for 999999999999
SQL> select * from v$sysstat
  2  where name like '%dirty buffers inspected%';
STATISTIC# NAME                                               CLASS                  VALUE
---------- --------------------------------------------- ---------- ----------------------
        76 dirty buffers inspected                                8                      0



当DBWR在获得cache buffer lru chain后,从cold区域的尾部开始检索LRUW列,主LRUW链表上查找已经更新完而正在等待被写入数据文件的buffer header时,如果找到的buffer header的数量超过一定限度(由隐藏参数:_db_writer_scan_depth_pct决定,表示已经扫描的脏数据块的个数占整个主LRUW链表上 buffer header总数的百分比。)时,DBWR就不再继续往下扫描,而转到辅助 LRUW链表上将其上的脏数据块写入数据文件。

引用
NAME                                          VALUE                PDESC
--------------------------------------------- -------------------- --------------------------------------------------
_db_writer_scan_depth_pct                     25                   Percentage of LRU buffers for dbwr to scan when looking for dirty


若找到想记录到磁盘上的缓冲区,在获得buffer lock后记录到磁盘,而记录到磁盘上的缓冲区变更为空闲缓冲区,并移动到LRU列。每当DBWR检索LRUW列时,DBWR lru scans统计值和DBWR buffers scanned统计值都会增加。

引用
SQL> select name,value from v$sysstat where name='DBWR lru scans';

NAME                                                                  VALUE
---------------------------------------------------------------- ----------
DBWR lru scans                                                            0

SQL> select name,value from v$sysstat where name='DBWR buffers scanned';

NAME                                                                  VALUE
---------------------------------------------------------------- ----------
DBWR buffers scanned                                                      0



如果主LRUW链表和辅助LRUW链表上的脏数据块的总数超过一定限度,也将触发DBWR进程。该限度由隐藏参数:_db_large_dirty_queue决定。
引用
NAME                                          VALUE                PDESC
--------------------------------------------- -------------------- --------------------------------------------------
_db_large_dirty_queue                         25                   Number of buffers which force dirty queue to be written

SQL> col KVITTAG for a35
SQL> set linesize 300
SQL> select KVITVAL,KVITTAG,KVITDSC from x$kvit
  2  where KVITTAG='kcbldq';

   KVITVAL KVITTAG                             KVITDSC
---------- ----------------------------------- ----------------------------------------------------------------
        25 kcbldq                              large dirty queue if kcbclw reaches this


每隔10秒钟唤醒一次DBWR,由隐含参数_dbwr_scan_interval决定,在9i中该值为10s,在10g中该值调整为300s。
引用
NAME                                          VALUE                PDESC
--------------------------------------------- -------------------- --------------------------------------------------
_dbwr_scan_interval                           10                   dbwriter scan interval


另外要检索LRU和LRUW列,必须获得cache buffer lru chains锁存器,因此当并发进程检索LRU和LRUW列时,将引起latch:cache buffer lru chains等待事件。查看cache buffer lru chains锁存器由隐含参数_db_block_lru_latches或者可以用v$latch_children视图
引用
NAME                                          VALUE                PDESC
--------------------------------------------- -------------------- --------------------------------------------------
_db_block_lru_latches                         16                   number of lru latches

SQL> select count(*) from v$latch_children where name='cache buffers lru chain';

  COUNT(*)
----------
        16

Oracle 有多种缓冲池(buffer pool),各缓冲池分别使用这些锁存器:
引用
SQL> select d.blk_size,c.child#,p.bp_name,c.gets,c.sleeps
  2  from x$kcbwds d,v$latch_children c,x$kcbwbpd p
  3  where d.set_latch=c.addr
  4  and d.set_id between p.bp_lo_sid and p.bp_hi_sid
  5  order by c.child#;

  BLK_SIZE     CHILD# BP_NAME                    GETS     SLEEPS
---------- ---------- -------------------- ---------- ----------
      8192          1 KEEP                         28          0
      8192          2 KEEP                         28          0
      8192          3 RECYCLE                      28          0
      8192          4 RECYCLE                      28          0
      8192          5 DEFAULT                   28531          0
      8192          6 DEFAULT                 1048168          0
      2048          7 DEFAULT                      28          0
      2048          8 DEFAULT                      28          0
      4096          9 DEFAULT                      28          0
      4096         10 DEFAULT                      28          0
      8192         11 DEFAULT                      28          0

  BLK_SIZE     CHILD# BP_NAME                    GETS     SLEEPS
---------- ---------- -------------------- ---------- ----------
      8192         12 DEFAULT                      28          0
     16384         13 DEFAULT                      28          0
     16384         14 DEFAULT                      28          0
     32768         15 DEFAULT                      28          0
     32768         16 DEFAULT                      28          0

16 rows selected.

另外锁存器的数量和DBWR数,CPU数量有关,若DBWR数小于4个,则创建4*CPU_COUNTlru个锁存器;若DBWR数大于4,则创建DB_WRITER_PROCESSED*CPU_COUNT个锁存器。
引用
SQL> show parameter cpu_count

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
cpu_count                            integer     4
SQL> show parameter db_writ

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_writer_processes                  integer     1
0
0
分享到:
评论

相关推荐

    oracle数据库体系结构之一【进程结构】

    总结来说,Oracle数据库的进程结构设计是其高效运行的基础,各种后台进程协同工作,保证了数据的安全性、一致性和高性能。理解这些进程的工作原理和交互方式,对于管理和维护Oracle数据库系统至关重要。

    关于Oracle数据库后台进程的思考.pdf

    在关系型数据库管理系统中,Oracle作为一款...通过对DBWR和LGWR这两个关键进程的工作原理和行为模式的深入了解,数据库管理员和技术人员能够更好地掌握数据库性能调优的关键点,进一步提升数据库的整体性能和可靠性。

    Oracle9i原理及应用

    后台进程如DBWR、LGWR、PMON等分别负责数据块的写入、重做日志的记录和进程监控,保证了数据库运行的稳定性。 第二章至第四章深入到数据模型的层面,讲解了关系型数据库理论和Oracle9i中的具体实现。表是关系型...

    oracle原理中文版

    - **服务器进程**:每个用户进程都会有一个对应的服务器进程与之交互,服务器进程负责处理来自用户进程的请求。 ### 系统全局区(SGA)与程序全局区(PGA) - **系统全局区(SGA)**:是Oracle实例的一个共享内存...

    oracle 精髓资料收集

    Oracle进程主要包括用户进程、服务器进程、后台进程等。用户进程负责与客户端应用程序交互,服务器进程处理SQL语句并返回结果,后台进程如DBWR(数据库写入进程)、LGWR(日志写入进程)和SMON(系统监控进程)则...

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

    后台进程是Oracle实例的重要组成部分,包括DBWR(数据库写入进程)、LGWR(日志写入进程)、PMON(进程监控进程)等,它们负责数据的持久化、日志同步、资源清理等关键任务。 总的来说,理解Oracle的内存结构和进程...

    Oracle体系结构.ppt

    SGA 是所有Oracle进程共享的一块内存区域,它包含数据缓冲区缓存(用于存储从磁盘读取的数据块)、重做日志缓冲区(记录事务的改动)、数据库高速缓存(存储PL/SQL代码和执行计划)、共享SQL区(存储最近执行的SQL...

    2 Oracle体系结构.pptx

    当数据被修改时,这些修改首先在缓存中发生,然后由后台进程DBWR定期将脏缓存块写回数据文件。如果缓存中没有足够的空闲块,DBWR也会被触发写回数据以释放空间。 重做日志缓冲区则用于暂存数据库的重做日志记录,...

    oracle dba基础知识

    - PMON(Process Monitor):进程监控进程,清理失败进程的资源,确保数据库稳定运行。 - LGWR(Log Writer):将重做日志缓冲区中的更改写入重做日志文件。 - DBWR(Database Writer):将数据高速缓存中的更改写入...

    Oracle系列培训教程之四:数据库体系结构

    每次启动Oracle数据库时,都会分配一个名为系统全局区(System Global Area,SGA)的内存区域,并启动一个或多个Oracle进程。SGA主要包括以下部分: 1. 共享池(Shared Pool):存储SQL语句、PL/SQL块和数据字典...

    expert-oracle-db-architecture

    本书针对Oracle数据库的内部工作原理进行了详尽的解析。 在Oracle数据库中,核心概念包括数据存储、内存结构、进程架构、并发控制、恢复机制等。首先,数据存储涉及数据文件、控制文件、重做日志文件和系统表空间等...

    Oracle体系结构

    程序全局区(PGA)是每个单独的Oracle进程(如服务器进程和后台进程)私有的内存区域,它包含了私有SQL区、会话内存区和排序区,用于存储特定进程的工作数据和控制信息。 在Oracle数据库操作中,有两种主要模式:...

    Oracle Instance 全图

    Oracle实例是Oracle数据库的核心组成部分,它包含了运行数据库所需的所有内存结构和后台进程。在Oracle9i这个版本中,虽然现在看来有些老旧,但其基础知识仍然是理解现代Oracle数据库的基础。本教程将带你深入理解...

    Oracle_RAC原理浅谈

    Oracle RAC的内部架构包括密码文件、实例、系统全局区(SGA)、重做日志缓冲区、数据字典缓存、库缓存、数据库写入器(DBWR)、系统监视器(SMON)、进程监视器(PMON)、检查点进程(CKPT)、日志写入器(LGWR)...

    oracle培训PPT

    后台进程如DBWR(数据库写入进程)、LGWR(日志写入进程)和PMON(进程监控进程)等协同工作,确保数据库的正常运行。 数据库的物理结构包括数据文件、重做日志文件和控制文件。数据文件存储用户数据、数据字典和...

    Oracle体系结构1.ppt

    DBA还需要熟悉Oracle的工作原理,例如用户进程如何通过网络与服务器进程交互,以及SQL语句的解析、执行和结果返回的过程。 总的来说,Oracle数据库的复杂体系结构要求DBA不仅要有深厚的理论知识,还要具备实践操作...

    Oracle基础(Oracle体系结构+PL/SQL命令)

    4. **进程(Process)**:Oracle数据库有多种后台进程,如数据库写入进程(DBWR)、检查点进程(CKPT)、归档进程(ARCn)等,它们负责执行不同的数据库操作。还有用户进程,如SQL*Plus,它们与服务器进程交互,处理...

    oracle rac 工作原理

    同时,每个实例也有自己的后台进程,如DBWR(数据库写入进程)、LGWR(日志写入进程)等。此外,所有节点共享数据文件和控制文件,以实现数据的统一访问。 RAC的一个关键特性是缓存融合(Cache Fusion)。这个技术...

    Oracle体系结构46256987101.ppt

    本篇文章将深入探讨Oracle体系结构的主要组件,包括例程、内存结构、后台进程、数据库物理和逻辑结构,以及服务器工作原理。 1. **Oracle 例程 (Instance)** Oracle 例程由系统全局区(SGA)和后台进程组成,是...

Global site tag (gtag.js) - Google Analytics