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
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
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
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
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'
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已失去作用.