Redo Log之一:理解Oracle redo log

1.      什么是Redo log

Redo log包含所有的数据库变化历史,数据库的所有操作变化,均按照写入重做日志缓冲区先于数据块缓冲区、写入重做日志文件先于写入数据文件;当发生提交动作时,将重做日志缓冲区变化刷到重做日志文件。重做日志文件一般用于数据库恢复(实例恢复和介质恢复)、Log Miner、Change Data Capture、流复制、GoldenGate复制等;Redo log文件包含所有的DML变化(INSERT\UPDATE\DELETE\SELECT FOR UPDATE)、包含所有DDL语句造成的数据字典对象的更改及递归语句的更改,不包括DML语句。version 9i以上版本还会包括DDL语句;数据库操作DML/DDL数据库缓冲区与文件的关系如下图:


2.      Redo log写入方式

Oracle重做日志采用循环写入的方式,每一个Oracle实例至少拥有2组中左日志组,每组重做日志组可以有一个或多个日志成员;Oracle重做日志一般由Oracle自动切换,重做日志文件在当LGWR进程停止写入并开始写入下一个日志组时发生切换,或在用户收到发出ALTER SYSTEM SWITCH LOGFILE时发生切换。

Oracle提供了清空重做日志文件功能,可以在数据库正常运行过程中,当出现日志文件损坏而无法进行归档时,可以清空损坏的日志文件(ALTER DATABASE CLEAR LOGFILE GROUP N;),使得数据库继续运行而无需停止数据库;如果损坏的日志文件仍未进行归档,可以使用UNARCHIVED关键字进行清理日志(ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP N;)。世纪运维中,还可以在某个实例禁止某个线程,并删除该实例的所有redo log。

SQL>ALTER DATABASE DISABLE THREAD <THREAD# OF INSTANCE1>‘; 
SQL> ALTER DATABASE DROP LOGFILE GROUP 1; 
SQL> ALTER DATABASE DROP LOGFILE GROUP2;

 

3.      日志组v$log和日志成员v$logfile

1)    日志组v$log

SQL> desc v$log

 Name              Null?    Type

 ------------------------   ------------  -----------------------

 GROUP#                     NUMBER

 THREAD#                   NUMBER

 SEQUENCE#                 NUMBER

 BYTES                      NUMBER

 BLOCKSIZE                  NUMBER

 MEMBERS                   NUMBER

 ARCHIVED                   VARCHAR2(3)

 STATUS                      VARCHAR2(16)

 FIRST_CHANGE#              NUMBER

 FIRST_TIME                   DATE

 NEXT_CHANGE#               NUMBER

 NEXT_TIME                    DATE

Group#redo log组编号,redo loggroup为单位,我们经常称之为重做日志组,一个实例里至少要有两个日志组,每个组有一个或者多个成员;同一个group里的成员的大小一致。

Thread#:在RAC环境里才有意义,代表不同的实例的编号,RAC的每个实例有单独redo log,该值与实例编号一致。

SEQUENCE#redo log序列号;我们都知道重做日志是循环写的,该值记录每个实例日志组的顺序;该序号在归档日志、RMAN备份和备份集等管理都是使用该值进行区分的。

BYTES:重做日志的大小,该值记录的是日志组的大小,而日志组可以有多个成员,可见同一个日志组的日志成员大小一致。

MEMBERS:日志组包含的日志成员个数,每个日志组的成员个数可以是一个或多个。

ARCHIVED:是否已经已经归档成功,如果未开启归档则该值为NO

STATUS:日志组的当前状态;Oracle日志组有5种不同的状态, CURRENT表示当前正在使用的日志组;ACTIVE表示该日志组仍是活跃的,对应的脏块还没有写入到数据文件上或者归档模式下未完成归档,即此时实例如果异常,会使用到该日志组进行实例恢复;UNUSED表示还没有使用的,一般只有新添加的未使用过的日志组才会有这种状态,建议新添加的日志组时进行日志切换,使得日志组中没有该状态;INACTIVEACTIVE相对,也就是不包含脏数据。 CLEARING CLEARING_CURRENT这两个状态和clear logfile有关,CLEARING表示的是在运行了alter database clear logfile group N命令的日志组状态,所以这是一个运行过程中状态,一旦命令运行结束,这个状态也随之运行结果而发生改变,如果是成功的话,状态将变成UNUSED状态,如果失败或者是过程中中断了使得clear不能完成,就会变更CLEARING_CURRENT,日志切换异常或IO异常都会是状态CLEARING_CURRENT

FIRST_CHANGE#:最小的SCN号,用于实例恢复。

FIRST_TIME:最小SCN号的时间。

NEXT_CHANGE#:下一个SCN号,用于实例恢复。

NEXT_TIME:下一个SCN号的时间。

2)    日志成员v$logfile

SQL> desc v$logfile;

 Name                       Null?    Type

 ----------------------------------------- -------- ----------------------------

 GROUP#                          NUMBER

 STATUS                          VARCHAR2(7)

 TYPE                            VARCHAR2(7)

 MEMBER                         VARCHAR2(513)

 IS_RECOVERY_DEST_FILE           VARCHAR2(3)

GROUP#:与前面v$logGROUP#相同;

STATUSINVALID代表文件不可访问;STALE表示文件不完全,比如添加日志成员等操作正在执行;DELETED表示该文件已经不再使用;null表示文件正在正常使用。

 

4.      检查点与日志切换

    重做日志一般涉及到LGWRCKPTDBWRARCHn四个后台进程;LGWR后台进程是将log buffer中的数据写到日志文件的进程,是oracle相当重要的一个后台进程,LGWR进程触发的条件为以下4种情况之一:

a、    每3秒钟;也就是该进程最多休眠3秒钟,休眠时触发rdbms ipc message事件; LGWRbuffer中的数据写到日志文件时,触发log file parallel write事件;

b、    在事务提交时(COMMIT),此时会触发LGWR进程写完后才返回提交成功,在等待LGWR进程写的过程中将触发log file sync事件;

c、    DBWn进程写入数据文件之前;

d、    Redo log Buffer三分之一满时,这个数字是有一个隐含参数_log_io_size控制,该值的默认值是log buffer大小的1/3;该值的最大值为3MB,所以Redo log buffer多于1MB的变化记录时也会触发LGWR进程写;

CKPT后台进程是检查点进程,以下几种情况会触发CKPT进程进行检查点操作:

1)、实例关闭时;

2)、备份命令执行时;

3)、手动执行CheckPoint操作时;

4)、达到log_checkpoint_timoutlog_checkpoint_internalfatstart_mttr_target参数设置临界值;

5)、数据文件被online/offline时;

5.      Redo Log损坏常见解决办法

a、非当前日志且已归档,使用命令将损坏日志清空:

SQL> alter database clear logfile group n;

b、非当前日志当尚未归档,则需要用

SQL>alter database clear unarchived logfile group n;

c、如果是当前日志损坏,一般不能clear,则可能意味着丢失数据,有备份,可以采用备份进行不完全恢复;如果没有备份,只能通过将数据库启动到mount状态将损坏的日志文件删除。

Created by Tony.Tang[TangYun]2015.02

--------------End-----------------------


 

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。