网站首页 > 数据库 / 正文
一、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的进程
- 上一篇:Linux基本命令
- 下一篇:三分钟了解Oracle内存管理方式
猜你喜欢
- 2024-11-26 Oracle优化Hints功能并行parallel(二)
- 2024-11-26 Oracle 之Hugepage
- 2024-11-26 某国企Oracle数据库误truncate table恢复案例
- 2024-11-26 「数据库数据恢复」Oracle数据库误truncate table的数据恢复
- 2024-11-26 Oracle11g RAC集群启动流程
- 2024-11-26 Oracle Rman主要组件分析讲解
- 2024-11-26 LINUX 服务介绍
- 2024-11-26 ORACLE RAC基础知识之集群高可用
- 2024-11-26 oracle基础知识-oracle11g数据库内核参数优化
- 2024-11-26 云贝数据 | PG数据库各种进程死掉会发生什么