0
点赞
收藏
分享

微信扫一扫

Oracle 日志故障01

王远洋 2022-08-17 阅读 103


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.

 

 

 

 

 

 

 

举报

相关推荐

0 条评论