Oracle 学习之--Buffer Cache深入解析
服务器进程和数据库缓冲区高速缓存:
当服务器需要块时,需要按系列步骤读取块:
1、首先,服务器使用散列函数检查是否可以从缓冲区高速缓存中获得所需要的块。如果找到缓冲区,则将它移动到LRU列表中远离LRU末尾的另一端。这是逻辑读取,因为没有发生实际的I/O。如果在缓冲区高速缓存中找不到缓冲区,则服务器进程(Server)必须从数据文件中读取。
2、对数据文件进行读取之前,服务器进程将搜索LRU列表,以获得空闲的缓冲区。所有被服务器进程修改的缓冲区都放在检查点队列中。以便在检查点期间写出到磁盘。
3、如果检查点的大小超出了其阈值,服务器会发出信号通知DBWn刷新数据缓冲区高速缓存中的脏数据缓冲区。如果服务器在搜索阈值内找不到空闲的缓冲区,将发出信号通知DBWn进行刷新。
4、找到空闲缓冲区后,服务器将块从数据文件中读入到数据库缓冲区高速缓存中过的空闲缓冲区。Oracle服务器进程把缓冲区移动到LRU列表中远离LRU末尾的位置。
5、如果对块的读取不一致,服务器会由当前块和回滚段重建块的早期版本。
DBWn进程和数据库缓冲区高速缓存:
DBWn将脏数据块写入数据文件,以确保服务器有空闲块,并以此来管理缓冲区高速缓存。DBWn响应实例中不同的事件:
1、Checkpoint Queue Exceeds Threshold:如果服务器进程发现检查点队列的大小超出其阈值,就会发出信号通知DBWn进行刷新。DBWn则将检查点队列中的缓冲区全部写出。
当检查点队列25%满就会触发DBWn的写操作:
SQL> desc x$kvit Name Null? Type ----------------------------------------- -------- ---------------------------- ADDR RAW(8) INDX NUMBER INST_ID NUMBER KVITVAL NUMBER KVITTAG VARCHAR2(64) KVITDSC VARCHAR2(64) SQL> col KVITTAG for a20 SQL> col KVITDSC for a50 SQL> set linesize 120 SQL> select KVITTAG,KVITVAL,KVITDSC,INST_ID from x$kvit where KVITTAG=‘kcbldq‘; KVITTAG KVITVAL KVITDSC INST_ID -------------------- ---------- -------------------------------------------------- ------ kcbldq 25 large dirty queue if kcbclw reaches this 1
2、Search Threshold Exceeded:如果在搜索阈值范围内,服务器进程在LRU列表中找不到空闲缓存区,就会发出信号通知DBWn刷新检查点队列。DBWn则直接将检查点队列中的脏数据缓冲区全部写出。
SQL> select KVITTAG,KVITVAL,KVITDSC,INST_ID from x$kvit where KVITTAG=‘kcbfsp‘; KVITTAG KVITVAL KVITDSC INST_ID -------------------- ---------- -------------------------------------------------- ------ kcbfsp 40 Max percentage of LRU list foreground can scan for 1
3、LGWR Singals a Checkpoint:当LGWR发出信号,指示检查点已经发生时,DBWn将脏数据缓冲区从检查点写入到磁盘上。
SQL> select * from v$log; GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIM ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- 5 1 952 10485760 2 YES INACTIVE 1360633 23-JUL-14 6 1 953 10485760 2 NO CURRENT 1360669 23-JUL-14 SQL> alter system switch logfile; System altered. SQL> alter system switch logfile; System altered. SQL> select * from v$log; GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIM ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- 5 1 954 10485760 2 YES INACTIVE 1360952 23-JUL-14 6 1 955 10485760 2 NO CURRENT 1360962 23-JUL-14 日志: Completed checkpoint up to RBA [0x3b9.2.10], SCN: 1360669 Wed Jul 23 15:08:08 2014 Beginning log switch checkpoint up to RBA [0x3ba.2.10], SCN: 1360952 Thread 1 advanced to log sequence 954 Current log# 5 seq# 954 mem# 0: +DG1/prod/onlinelog/group_5.263.848858213 Current log# 5 seq# 954 mem# 1: +RCY1/prod/onlinelog/group_5.256.848858217 Wed Jul 23 15:08:25 2014 Thread 1 cannot allocate new log, sequence 955 Checkpoint not complete Current log# 5 seq# 954 mem# 0: +DG1/prod/onlinelog/group_5.263.848858213 Current log# 5 seq# 954 mem# 1: +RCY1/prod/onlinelog/group_5.256.848858217 Wed Jul 23 15:08:33 2014 Completed checkpoint up to RBA [0x3ba.2.10], SCN: 1360952 Wed Jul 23 15:08:34 2014 Beginning log switch checkpoint up to RBA [0x3bb.2.10], SCN: 1360962 Thread 1 advanced to log sequence 955 Current log# 6 seq# 955 mem# 0: +DG1/prod/onlinelog/group_6.264.848858253 Current log# 6 seq# 955 mem# 1: +RCY1/prod/onlinelog/group_6.257.848858259 Wed Jul 23 15:08:36 2014 Completed checkpoint up to RBA [0x3bb.2.10], SCN: 1360962
4、Alter Tablespace offline Temporary or Alter Tablespace Begin Backup:如果表空间被临时脱机更改,或者启动了他的联机备份,则DBWn会将表空间的脏数据缓冲区从检查点队列写出到磁盘上。
5、Drop Object:删除某个对象后,DBWn会首先将该对象脏数据缓冲区刷新到磁盘上。
6、Clean Shutdown:(正常、立即或事务处理)
本文出自 “天涯客的blog” 博客,请务必保留此出处http://tiany.blog.51cto.com/513694/1445105