日志组ACTIVE代表什么?
1.日志切换过了,已经归档
2.日志中涉及到的脏数据还没被DBWR写盘
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------- ------------- -------------------
1 1 5 52428800 1 YES ACTIVE 595065 2011-06-13 05:27:10
2 1 6 52428800 1 NO CURRENT 595070 2011-06-13 05:27:11
3 1 4 52428800 1 YES ACTIVE 595058 2011-06-13 05:27:02
SQL> select * from v$logfile;
GROUP# STATUS TYPE MEMBER IS_
---------- ---------- ------- --------------------------------------------- ---
3 ONLINE /u01/oracle/oradata/db20/redo03.log NO
2 ONLINE /u01/oracle/oradata/db20/redo02.log NO
1 ONLINE /u01/oracle/oradata/db20/redo01.log NO
SQL>
第一组和第三组 都是 active 损坏日志文件
SQL> ! cp /etc/passwd /u01/oracle/oradata/db20/redo01.log
SQL> shut abort
ORACLE instance shut down.
SQL>
SQL> startup
ORACLE instance started.
Total System Global Area 285212672 bytes
Fixed Size 1218992 bytes
Variable Size 113247824 bytes
Database Buffers 167772160 bytes
Redo Buffers 2973696 bytes
Database mounted.
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: '/u01/oracle/oradata/db20/redo01.log'
ORA-27046: file size is not a multiple of logical block size
Additional information: 1
SQL> open时检测到日志文件头不对
尝试清洗一下
SQL> alter database clear logfile group 1;
alter database clear logfile group 1
*
ERROR at line 1:
ORA-01624: log 1 needed for crash recovery of instance db20 (thread 1)
ORA-00312: online log 1 thread 1: '/u01/oracle/oradata/db20/redo01.log'
SQL> 不可以清洗 实例恢复需要
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------- ------------- -------------------
1 1 5 52428800 1 YES ACTIVE 595065 2011-06-13 05:27:10
3 1 4 52428800 1 YES ACTIVE 595058 2011-06-13 05:27:02
2 1 6 52428800 1 NO CURRENT 595070 2011-06-13 05:27:11
SQL> 检查日志组 发现第一组上一次状态就是ACTIVE时崩溃的
通过日志序列号得知 第一组之前的第三组日志中的记录也是需要恢复的 先恢复下
SQL> recover database;
ORA-00283: recovery session canceled due to errors
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: '/u01/oracle/oradata/db20/redo01.log'
ORA-27046: file size is not a multiple of logical block size
Additional information: 1
SQL> 当恢复读取到redo01.log中时 文件格式不对
因为有归档 但数据并不认为此次恢复需要归档, 手动提供归档
SQL> ! ls /home/oracle/arc1/1_*_753686542.dbf
/home/oracle/arc1/1_1_753686542.dbf /home/oracle/arc1/1_3_753686542.dbf /home/oracle/arc1/1_5_753686542.dbf
/home/oracle/arc1/1_2_753686542.dbf /home/oracle/arc1/1_4_753686542.dbf
SQL> 归档号到5结束
SQL> recover database until cancel;
ORA-00279: change 595065 generated at 06/13/2011 05:27:10 needed for thread 1
ORA-00289: suggestion : /home/oracle/arc1/1_5_753686542.dbf
ORA-00280: change 595065 for thread 1 is in sequence #5
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
ORA-00279: change 595070 generated at 06/13/2011 05:27:11 needed for thread 1
ORA-00289: suggestion : /home/oracle/arc1/1_6_753686542.dbf
ORA-00280: change 595070 for thread 1 is in sequence #6
ORA-00278: log file '/home/oracle/arc1/1_5_753686542.dbf' no longer needed for this recovery
5号文件这次恢复并没用到 因为我们之前做的recover database已经把这份日志应用过了,对应的就是group 3
下一个就是需要6号归档 但我们没有,实际就是current日志,还没切换数据库就崩溃了 所以没归档 提供current在线日志
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
/u01/oracle/oradata/db20/redo02.log
Log applied.
Media recovery complete.
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open
此时只能resetlogs起库 因为日志文件不在了
SQL> alter database open resetlogs;
Database altered.
SQL>
没有丢数据 所有日志都应用了.