Inactive:表示当前这组日志记录的脏块被写入到data file了,即已经写入到磁盘了,如果是归档的状态,表示该日志也已经归档。这个日志组是可以删除的。
Active:日志组虽然当前未被使用,不过该文件中的内容尚未归档,或者对应的脏数据未被全部写入磁盘或者可能完全写入磁盘了,一旦需要实例恢复,必须借助该文件中保存的内容。
Current:代表当前日志组,修改数据块生成的日志都在buffer cache里面,还未被写出,这组日志也是不允许被删除的。
如果是inactive状态的日志组被破坏了,不会造成数据的丢失的。
如果是active状态日志被破坏,一般情况下对应的脏块是没有完全被写入的,维护起来相对于比较复杂。
对于current日志组,对于正常关库来说,日志所记录的脏块写入到数据文件里面并且产生了新的检查点,对于关库状态这组日志被破坏数据是不会丢失的。
非当前日志组被破坏的情况
(1)当inactive日志组只有一个日志成员
SQL> select group#,member from v$logfile;
GROUP# MEMBER
---------- ------------------------------------------------------------
1 /u01/app/oracle/oradata/oradb/redo01a.log
2 /u01/app/oracle/oradata/oradb/redo02.log
3 /u01/app/oracle/oradata/oradb/redo03.log
4 /disk1/oradata/oradb/redo04a.log
4 /disk2/oradata/oradb/redo04b.log
SQL> select group#,sequence#,status from v$log;
GROUP# SEQUENCE# STATUS
---------- ---------- ----------------
1 16 INACTIVE
2 18 CURRENT
3 15 INACTIVE
4 17 INACTIVE
删除组1的日志文件,组1的状态是inactive。
SQL> shutdown abort; --将数据库关闭
ORACLE instance shut down.
SQL>
[oracle@Database2 ~]$ rm /u01/app/oracle/oradata/oradb/redo01a.log --删除inactive的日志组成员
SQL> startup; --启动数据库
ORACLE instance started.
Total System Global Area 1068937216 bytes
Fixed Size 2260088 bytes
Variable Size 671089544 bytes
Database Buffers 390070272 bytes
Redo Buffers 5517312 bytes
Database mounted. --数据库在mount时候关库了
ORA-03113: end-of-file on communication channel
Process ID: 3264
Session ID: 1 Serial number: 5
下面是数据库启动的后台日志
Beginning crash recovery of 1 threads --因为是abort关闭,所以这里需要做实例恢复
Started redo scan
Completed redo scan
read 11 KB redo, 26 data blocks need recovery
Started redo application at
Thread 1: logseq 18, block 206
Recovery of Online Redo Log: Thread 1 Group 2 Seq 18 Reading mem 0
Mem# 0: /u01/app/oracle/oradata/oradb/redo02.log
Completed redo application of 0.01MB
Completed crash recovery at
Thread 1: logseq 18, block 229, scn 106174
26 data blocks read, 26 data blocks written, 11 redo k-bytes read
LGWR: STARTING ARCH PROCESSES
Sat Nov 24 00:21:57 2018
ARC0 started with pid=20, OS id=3266
...........................................................................
ARC5 started with pid=25, OS id=3276
Errors in file /u01/app/oracle/diag/rdbms/oradb/oradb/trace/oradb_lgwr_3244.trc:
ORA-00313: open failed for members of log group 1 of thread 1
在打开删除的日志组的日志文件时候报错
ORA-00312: online log 1 thread 1: '/u01/app/oracle/oradata/oradb/redo01a.log'
ORA-27037: unable to obtain file status
要打开数据库要保证数据库的控制文件记录的所有数据文件,所有日志组文件是可以正常访问的,其次是去检查数据库的一致性。
SQL> startup mount; --将数据库启动到mount的状态下
ORACLE instance started.
Total System Global Area 1068937216 bytes
Fixed Size 2260088 bytes
Variable Size 671089544 bytes
Database Buffers 390070272 bytes
Redo Buffers 5517312 bytes
Database mounted.
SQL> select group#,sequence#,status from v$log; --在mount状态下查看组1的状态
GROUP# SEQUENCE# STATUS
---------- ---------- ----------------
1 16 INACTIVE
4 17 INACTIVE
3 15 INACTIVE
2 18 CURRENT
可以看到组1是非当前日志组
SQL> archive log list; --这个库是一个归档库
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /arch
Oldest online log sequence 15
Next log sequence to archive 18
Current log sequence 18
SQL> alter database clear logfile group 1; --这个命令是清空日志组里面记录的日志信息,当去open数据库的时候,就可以不去检查这组日志了,将日志组的内容清空
Database altered.
[oracle@Database2 trace]$ ls -l /u01/app/oracle/oradata/oradb/redo01a.log --可以看到clear之后之前被删除的日志文件被重建了
-rw-r-----. 1 oracle oinstall 52429312 Nov 24 03:54 /u01/app/oracle/oradata/oradb/redo01a.log
SQL> alter database open;
Database altered.
SQL> select group#,sequence#,status from v$log;
GROUP# SEQUENCE# STATUS
---------- ---------- ----------------
1 19 CURRENT
2 18 INACTIVE
3 15 INACTIVE
4 17 INACTIVE
如果破坏的是inactive,非当前日志组,解决起来非常简单,这组日志所记录的脏块已经被写入到datafile里面了,这组日志被clear了是不影响数据库的安全的,通过clear的方式就可以将库打开了。
碰到数据库打不开要去看告警日志,看是数据文件的原因还是日志组的原因,还是一致性的问题。如果是日志组的问题要去确定破坏的是哪组日志,然后再去判断是当前日志还是非当前日志,如果是非当前日志处理起来使用clear就行了。如果是当前日志组就要查看日志组是正常关库还是非正常关库的。
(2)inactive日志组有两个成员
SQL> select group#,member from v$logfile;
GROUP# MEMBER
---------- ------------------------------------------------------------
1 /u01/app/oracle/oradata/oradb/redo01a.log
2 /u01/app/oracle/oradata/oradb/redo02.log
3 /u01/app/oracle/oradata/oradb/redo03.log
4 /disk1/oradata/oradb/redo04a.log
4 /disk2/oradata/oradb/redo04b.log
SQL> select group#,sequence#,status from v$log;
GROUP# SEQUENCE# STATUS
---------- ---------- ----------------
1 19 CURRENT
2 18 INACTIVE
3 15 INACTIVE
4 17 INACTIVE
[oracle@Database2 trace]$ rm -rf /disk2/oradata/oradb/redo04b.log
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup; --可以看到当日志组处于inactive状态下,删除日志文件中的其中一个还是可以将库打开,只不过后台会有报错。
ORACLE instance started.
Total System Global Area 1068937216 bytes
Fixed Size 2260088 bytes
Variable Size 671089544 bytes
Database Buffers 390070272 bytes
Redo Buffers 5517312 bytes
Database mounted.
Database opened
[oracle@Database2 trace]$ cd /u01/app/oracle/diag/rdbms/oradb/oradb/trace/
[oracle@Database2 trace]$ tail -f alert_oradb.log
Errors in file /u01/app/oracle/diag/rdbms/oradb/oradb/trace/oradb_lgwr_3522.trc:
ORA-00313: open failed for members of log group 4 of thread 1
ORA-00312: online log 4 thread 1: '/disk2/oradata/oradb/redo04b.log'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
SQL> alter database drop logfile member '/disk2/oradata/oradb/redo04b.log';
Database altered.
SQL> alter database add logfile member '/disk2/oradata/oradb/redo04b.log' to group 4;
Database altered.