ORACLE 视图之V$LOG

V$LOG视图展示ORACLE online redo的信息.

代码
SQL> select * from v$log
  
2  /
 
    
GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARCHIVED STATUS           FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- -------- ---------------- ------------- -----------
         1          1          6   52428800          1 NO       INACTIVE               6139037 2009-12-8 2
         
2          1          8   52428800          1 NO       CURRENT                6139054 2009-12-8 2
         
3          1          0   52428800          1 NO       UNUSED                 6139039 2009-12-8 2

 

可以看该实例有三个日志组(GROUP#),每个日志组有一个成员(MEMBERS). 状态INACTIVE表示crash recovery不需要此日志文件.CURRENT表示是当前日志文件,

UNUSED建立之后未曾写入.FIRST_CHANGE#表示该日志组 LOWEST SCN.

首先来看两个重要的SCN,第一个系统SCN,表示当前系统的变化状态:

SQL> select dbms_flashback.get_system_change_number from dual
  
2  /
 
GET_SYSTEM_CHANGE_NUMBER
------------------------
                 6139710

 各数据文件SCN:

代码
SQL>  select FILE#,STATUS,CHECKPOINT_CHANGE#,RESETLOGS_CHANGE# from V$DATAFILE_HEADER
  
2  /
 
     
FILE# STATUS  CHECKPOINT_CHANGE# RESETLOGS_CHANGE#
---------- ------- ------------------ -----------------
         1 ONLINE             6140215           5925484
         
2 ONLINE             6140215           5925484
         
3 ONLINE             6140215           5925484
         
4 ONLINE             6140215           5925484
         
5 ONLINE             6140215           5925484
         
6 ONLINE             6140215           5925484
         
7 ONLINE             6140215           5925484

从控制文件获得各数据文件SCN,即从V$DATAFILE视图,在数据库正常运行时,他们两个是相同的.

V$LOG FIRST_CHANGE#,下一个序号的日志的FIRST_CHANGE#之间的日志信息,都保存在这个日志文件中,如果有一个数据文件的CHECKPOINT_CHANGE#在他们之间,说明这个日志中有没有CHECKPOINT的数据该日志不能清除.例如: 

 

代码
SQL> select * from v$log
  
2  /
 
    
GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARCHIVED STATUS           FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- -------- ---------------- ------------- -----------
         1          1         14   52428800          2 NO       INACTIVE               6176759 2009-12-8 2
         
2          1         15   52428800          1 NO       ACTIVE                 6176761 2009-12-8 2
         
3          1         16   52428800          1 NO       CURRENT                6176772 2009-12-8 2
 
SQL
> select FILE#,STATUS,CHECKPOINT_CHANGE#,ONLINE_CHANGE# from v$datafile
/ 
    
FILE# STATUS  CHECKPOINT_CHANGE# ONLINE_CHANGE#
---------- ------- ------------------ --------------
         1 SYSTEM             6176761        5925484
         
2 ONLINE             6176761        5925484
         
3 ONLINE             6176761        5925484
         
4 ONLINE             6176761        5925484
         
5 ONLINE             6176761        5925484
         
6 ONLINE             6176761        5925484
         
7 ONLINE             6176761        5925484

 

 数据文件的SCN是6176761 小于系统SCN 6176897 日志组2的FIRST_CHANGE#是6176761,显然有一部脏数据未提交到数据文件.此时执行

代码
SQL>  ALTER DATABASE CLEAR LOGFILE GROUP 2
  
2  /
ALTER DATABASE CLEAR LOGFILE GROUP 2
ORA
-01624: 日志 2 是紧急恢复实例 log2 (线程 1) 所必需的
ORA
-00312: 联机日志 2 线程 1'D:\ORACLE\PRODUCT\10.2.0\ORADATA\LOG2\REDO02.LOG'

这时执行alter system CHECKPINIT. 或者等一会ALTER DATABASE CLEAR LOGFILE GROUP 2就会成功.再 看v$datafile的CHECKPOINT_CHANGE#

可能已经等于当前日志的SCN了,上一个日志对于CRASH RECORY已失去作用.

posted @ 2009-12-08 22:27  Christmas  阅读(1503)  评论(0编辑  收藏  举报