Redo active状态解析

当我们手动执行日志切换的时候:

SQL> alter system switch logfile;

系统已更改。


SQL> select group#,sequence#,status,archived from v$Log;

GROUP# SEQUENCE# STATUS ARC
---------- ---------- ---------------- ---
1 23 CURRENT NO
2 21 INACTIVE YES
3 22 ACTIVE YES

我们看日志文件组3已经归档,但是状态为ACTIVE的。
某个日志文件为ACTIVE状态,其实是表示这个文件的检查点还没有作完。而检查点没有做完的根本原因是dbwr执行的dirty buffer写出还没有执行完成,也就是说ckpt进程会等待dbwr写出数据完成,等待的过程就是表示等待将current日志中修改过的数据块信息写入到数据文件的过程。因为这些信息其实是实例恢复的时候要用到的信息,如shutdown abort时,oracle会利用redo日志中的信息对数据库进行实例恢复。
同时有一点需要补充的是:
当检查点发生的时候,不仅仅dbwr进程会触发(记住有的检查点不是一定要触发dbwr的),lgwr也会跟着触发,他会把检查点发生时的SCN之前的存储在redo log buffer中的redo,写入到我们的redo log file中。那么all in all,检查点的发生,就是lgwr和dbwr写buffer到磁盘文件的过程。但是效率却截然不同。
回到正题,log switch的时候会触发检查点,因此lgwr进程会把log buffer中的redo log写入redo log file中,如果我们这个时候设置了log_checkpoints_to_alert=TRUE,则我们可以在alert_icmnlsdb.log日志中,看到如下信息:
-------------------------------------------------------------
Sat Dec 29 12:59:43 2007
Beginning log switch checkpoint up to RBA [0x18.2.10], SCN: 0x0000.0003b0f6
Thread 1 advanced to log sequence 24
Current log# 2 seq# 24 mem# 0: D:/ORACLE/ORADATA/ICMNLSDB/REDO02.DBF
Sat Dec 29 12:59:43 2007
ARC0: Evaluating archive log 1 thread 1 sequence 23
ARC0: Beginning to archive log 1 thread 1 sequence 23
Creating archive destination LOG_ARCHIVE_DEST_1: 'D:/ORACLE/ARCHIVED_DEST/ARC00023.001'
ARC0: Completed archiving log 1 thread 1 sequence 23
---------------------------------------------------------------
注意信息中的SCN,这就是我们通过log switch触发checkpoint时的SCN,那么当checkpoint做完后,ckpt进程会把这个SCN更新到数据文件头上。但是这个checkpoint在这个时候确实是要等待dbwr将dirty buffer写完到数据文件后才算结束(dbwr要写到RBA(Beginning log switch checkpoint up to RBA [0x18.2.10]).因此如果日志切换到这个active的日志的时候,由于checkpoint要等待dbwr将RBA之前的所有dirty buffer写出,因此整个过程会等待。当然我们还要注意dbwr可能是执行多次写才能到RBA。这个和dbwr的写机制是有密切的关系。

from:http://space.itpub.net/12361284/viewspace-52651

Redo Log :用于instance recovery

archive log:用于media recovery

你可能感兴趣的:(Active)