MySQL, Oracle, Linux, 软件架构及大数据技术知识分享平台

网站首页 > 数据库 / 正文

ORACLE内核解密之DBWR进程

2024-11-26 20:23 huorong 数据库 6 ℃ 0 评论

一、Free Buffer Waits 事件产生原因

ORACLE要进行物理读或者CR读的时候,服务器进程扫描LRU链表寻找可用来覆盖的块,找了40%BUFFER(这个比例由参数db_block_max_scan_pct控制)都未找到可以覆盖的BUFFER,这个时候进程将停止扫描LRU,唤醒DBWR开始写脏块,同时进程进入睡眠状态,开始等待。这个等待事件就是Free Buffer Waits 事件。

二、不可覆盖BUFFER的构成

前面提到进程扫描了LRU链表40%的BUFFER都是不可用的块,那么这些块都由那些特性呢?

1、不可覆盖块可能是被其他进程加BUFFER PIN LOCK的

2、TCH大于等于2的块(这些块会被移动到主LRU的热端,不能被覆盖)

3、脏块

对于脏块此时进程将脏块移动到主LRUW,当DBWR唤醒时开始从辅LRUW写脏块并且全部将辅LRUW的脏块写入磁盘。

对于减少Free Buffer Waits事件我们只能通过DBWR写脏块,提高写脏块的频率来减少Free Buffer Waits事件。

服务器进程在扫描LRU时将遇到的脏块移动到主LRUW中,当进程完成扫描,找到可覆盖的BUFFER时,在即将进入下一流程时,服务器进程首先判断试一下脏块总数是否小于总BUFFER的25%(该比例由参数DB_LARGE_DIRTY_QUEEUE设定)如果是小于25%则进入下一流程,服务器进程将脏块移动到主LRUW的块将等待DBWR唤醒时才会写入磁盘;如果脏块数接近或者大于25%那么DBWR不会等待3秒,而是直接进行唤醒DBWR开始将LRUW移动到辅LRUW开始写入磁盘。

三、DBWR唤醒机制

1、DBWR 超时3秒唤醒。

3秒超时唤醒,进程首先检查辅LRUW链表是否由脏块,如果由立即将辅LRUW链表上脏块全部写入磁盘;如果辅LRUW链表无脏块,进程检查,检查点队列长度、REDO RECORDER数量,这个过程就是增量检查点机制。如果检查点队列不够长、REDO RECORDER数量不多那么3秒唤醒DBWR也不会将脏块写入磁盘。

2、服务进程扫描LRU发现脏块总数接近或者大于总BUFFER的25%,此时进程将唤醒DBWR将脏块写入磁盘(不一定将全部脏块写入磁盘)

3、如果服务进程扫描全部BUFFER的40%还每找到可以覆盖的BUFFER那么会产生Free Buffer Waits事件,唤醒DBWR写脏块。

4、用户发出完全检查点命令会唤醒DBWR写脏块。

alter SYSTEM CHECKPOIN

5、用户发出正常关闭数据命令会唤醒DBWR写脏块。

6、日志切换会唤醒DBWR写脏块。

7、表空间或者数据文件OFFLINE时会唤醒DBWR写脏块。

8、执行DROP、TRUNCATE或者直接路劲读对象时会唤醒DBWR写脏块。


Tags:oracle的进程

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言