V$LOG视图展示ORACLE online redo的信息.
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,表示当前系统的变化状态:
2 /
GET_SYSTEM_CHANGE_NUMBER
-- ----------------------
6139710
各数据文件SCN:
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的数据该日志不能清除.例如:
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,显然有一部脏数据未提交到数据文件.此时执行
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已失去作用.