文章来源:汤云-ITPUB博客
Redo log包含所有的数据库变化历史,数据库的所有操作变化,均按照写入重做日志缓冲区先于数据块缓冲区、写入重做日志文件先于写入数据文件;当发生提交动作时,将重做日志缓冲区变化刷到重做日志文件。重做日志文件一般用于数据库恢复(实例恢复和介质恢复)、Log Miner、Change Data Capture、流复制、GoldenGate复制等;Redo log文件包含所有的DML变化(INSERT\UPDATE\DELETE\SELECT FOR UPDATE)、包含所有DDL语句造成的数据字典对象的更改及递归语句的更改,不包括DML语句。version 9i以上版本还会包括DDL语句;数据库操作DML/DDL数据库缓冲区与文件的关系如下图:
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
SQL> ALTER DATABASE DROP LOGFILE GROUP 1;
SQL> ALTER DATABASE DROP LOGFILE GROUP2;
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 log以group为单位,我们经常称之为重做日志组,一个实例里至少要有两个日志组,每个组有一个或者多个成员;同一个group里的成员的大小一致。
Thread#:在RAC环境里才有意义,代表不同的实例的编号,RAC的每个实例有单独redo log,该值与实例编号一致。
SEQUENCE#:redo log序列号;我们都知道重做日志是循环写的,该值记录每个实例日志组的顺序;该序号在归档日志、RMAN备份和备份集等管理都是使用该值进行区分的。
BYTES:重做日志的大小,该值记录的是日志组的大小,而日志组可以有多个成员,可见同一个日志组的日志成员大小一致。
MEMBERS:日志组包含的日志成员个数,每个日志组的成员个数可以是一个或多个。
ARCHIVED:是否已经已经归档成功,如果未开启归档则该值为NO。
STATUS:日志组的当前状态;Oracle日志组有5种不同的状态, CURRENT表示当前正在使用的日志组;ACTIVE表示该日志组仍是活跃的,对应的脏块还没有写入到数据文件上或者归档模式下未完成归档,即此时实例如果异常,会使用到该日志组进行实例恢复;UNUSED表示还没有使用的,一般只有新添加的未使用过的日志组才会有这种状态,建议新添加的日志组时进行日志切换,使得日志组中没有该状态;INACTIVE与ACTIVE相对,也就是不包含脏数据。 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号的时间。
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$log的GROUP#相同;
STATUS:INVALID代表文件不可访问;STALE表示文件不完全,比如添加日志成员等操作正在执行;DELETED表示该文件已经不再使用;null表示文件正在正常使用。
重做日志一般涉及到LGWR、CKPT、DBWR、ARCHn四个后台进程;LGWR后台进程是将log buffer中的数据写到日志文件的进程,是oracle相当重要的一个后台进程,LGWR进程触发的条件为以下4种情况之一:
a、每3秒钟;也就是该进程最多休眠3秒钟,休眠时触发rdbms ipc message事件; LGWR将buffer中的数据写到日志文件时,触发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_timout/log_checkpoint_internal/fatstart_mttr_target参数设置临界值;
5)、数据文件被online/offline时;
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-----------------------
原文链接:http://blog.itpub.net/24930246/viewspace-1429161/