代码改变世界

ORACLE——重做日志文件管理

2012-08-09 22:53  潇湘隐者  阅读(15908)  评论(8编辑  收藏  举报

联机重做日志文件概念

联机日志文件又叫重做日志文件,记录了对数据库修改的信息,包括用户对数据修改和数据库管理员对数据库结构的修改。它主要用于在发生故障的时候和数据库备份文件配合恢复数据库,一般发生故障有2个情况:一个是介质损坏另外一个是用户误操作。每个数据库至少有两个日志文件组,每组至少包含1个或者多个日志成员,这里要多个日志成员的原因是防止日志文件组内某个日志文件损坏后及时提供备份,所以同一组的日志成员一般内容信息相同,但是存放位置不同。

在Oracle数据库中,执行数据修改操作后,并不是马上写入数据文件,而是首先生成重做信息,并写入SGA中的一块叫LOG_BUFFER的固定区域,LOG_BUFFER的空间并不是无限大,事实上它非常小,一般设置在3~5MB左右。LOG_BUFFER有一定的触发条件,当满足触发条件后,会有相应进程将LOG_BUFFER中的内容写入一个特定类型的文件,就是传说中的联机重做日志文件。

联机重做日志文件是循环使用的(见下图)。当第一个日志文件达到一定数量时,就会停止写入,而转向第二个日志文件,第二个满转向第三个日志文件.第三个满就向第一个日志文件写入.而第一个日志文件有没有自动备份就涉及到归档或者不归档的问题.当数据库自动对原来的日志文件进行备份的话就叫归档模式,不需要对数据库进行自动备份就叫非归档模式.

clip_image002

那么什么情况触发LGWR进程写日志文件呢?以下情况将触发LGWR进程写操作:

1).当commit事务发生

2).当redo log buffer存储达到1/3

3).当重做日志缓冲区有超过一个兆字节的更改记录

4).在DBWN将buffer cache修改过的数据块的信息写入到数据文件之前

触发CHECK POINT事件的情况:

1).每次日志切换时。

2).实例通过normal,transactional,immediate选项关闭时

3).通过设置初始化参数FAST_START_MTTR_TARGET强制发生

4) .数据库管理员手工设置ALTER SYSTEM CHECKPOINT、 ALTER TABLESPACE, DATAFILE OFFLINE时。

5).使用alter tablespace[OFFLINE NORMAL|READ ONLY|BEGIN BACKUP] 语句导致指定数据文件发生检查点

非归档模式只能做冷备份,归档模式可以做热备份并且可以做增量备份和部分恢复.

在非归档模式下执行数据库备份时,基本上数据管理员通过重做日志文件不能够恢复全部的数据,所以必须备份所有的数据文件和控制文件,而且必须使用 shutdown normal等命令关闭数据库.

而在归档模式下.当出现介质损坏(硬盘损坏或者误删数据文件)或者例程失败(服务器断电),数据库管理员可以通过归档日志来防止数据丢失,而非归档模式只能应对instance失败.在归档模式下,数据库处于open状态,仍然可以备份数据库,而不影响数据库的正常使用.不仅可以做完全恢复而且可以将数据库恢复到特定的点.

非归档模式和归档模式各有各的优点,选择时可以参考:1,数据库中数据变化的频繁程度;2,企业对数据丢失的态度;3,数据库是否需要7x24运行,因为非归档模式需要关闭数据库才能进行备份.

查看归档模式

ORACLE数据库拥有2种归档模式,ARCHIVELOG和NOARCHIVELOG。可以通过下面方式查看数据库的归档模式

 

(1): SELECT NAME, LOG_MODE FROM V$DATABASE

(2):

SQL> archive log list

数据库日志模式 存档模式

自动存档 启用

存档终点 USE_DB_RECOVERY_FILE_DEST

最早的联机日志序列 106

下一个存档日志序列 108

当前日志序列 108

SQL> archive log list

Database log mode No Archive Mode

Automatic archival Disabled

Archive destination USE_DB_RECOVERY_FILE_DEST

Oldest online log sequence 2861

Current log sequence 2866

 

 

日志模式切换

 

非归档模式切换归档模式

1、关闭服务:

SQL> SHUTDOWN IMMEDIATE;

2、不加载数据文件(只加载控制文件和日志文件)启动服务:

SQL> STARTUP MOUNT;

3、查看日志归档模式:

SQL> ARCHIVE LOG LIST

数据库日志模式 非存档模式

自动存档 禁用

存档终点 USE_DB_RECOVERY_FILE_DEST

最早的联机日志序列 163

当前日志序列 165

4、配置数据库启用日志归档模式

SQL> ALTER DATABASE ARCHIVELOG;

数据库已更改。

5、加载并打开数据文件:

SQL> ALTER DATABASE OPEN;

数据库已更改。

6、再次查看日志归档模式

SQL> ARCHIVE LOG LIST

数据库日志模式 存档模式

自动存档 启用

存档终点 USE_DB_RECOVERY_FILE_DEST

最早的联机日志序列 163

下一个存档日志序列 165

当前日志序列 165

SQL> ARCHIVE LOG START

已处理的语句

7:修改参数LOG_ARCHIVE_START

SQL> ALTER SYSTEM SET LOG_ARCHIVE_START=TRUE SCOPE=SPFILE;

系统已更改。

归档模式切换到非归档模式

1、关闭服务

SQL> SHUTDOWN IMMEDIATE;

2、启动服务(不加载数据文件)

SQL> STARTUP MOUNT;

3、设置数据库为非归档模式

SQL> ALTER DATABASE NOARCHIVELOG;

数据库已更改。

4、加载并打开数据文件

SQL> ALTER DATABASE OPEN;

数据库已更改。

日志切换和检查点切换

 

SQL>ALTER SYSTEM SWITCH LOGFILE;

 

日志切换就是停止写当前日志组,转而写另外一个新的日志组、系统可以自动切换,也可以手工切换。当发生SWITCH LOGIFLE时,系统会在后台完成CHECKPOINT的操作。CHECKPOINT是一个事件,它用于减少instant recovery的时间.当CHECKPOINT发生时,它会触发DBWR进程,把database buffer中变化了的数据写入数据文件,同时chkp进程更新control file和datafile header,以使它们保持一致。检查点其实是一个后台进程,用来保证所有修改过的数据库缓冲区的东西都写入数据库文件。它由参数LOG_CHECKPOINT_TIMEOUT和LOG_CHECKPOINT_INTERVAL来决定。检查点完成后,系统将更新数据库头和控制文件,也保证数据库的同步。这里主要体现在一个系统改变号上SCN(也叫检查点号)。它分别出现在v$log表的FIRST_CHANGE#列和V$DATAFILE的CHECKPOINT_CHANGE#列还有V$DATABASE的CHECKPOINT_CHANGE#上。 只要说明三个值相同,那么数据库就没有不同步的现象。否则就要进行介质恢复。这里可以通过日志切换改变新的检验点号。当然引起SCN改变的情况还有很多。

 

SQL>ALTER SYSTEM CHECKPOINT;

 

强制设置检查点间隔

 

ALTER SYSTEM SET FAST_START_MTTR_TARGET = n

 

 

联机日志文件的规划

联机日志文件的规划原则如下:

1:分散放开,多路复用。一般会将同一组的不同日志成员文件放到不同的磁盘或不同的裸设备上。以提高安全性。

2:把重做日志放在速度最快的硬盘上(即:日志所在的磁盘应当具有较高的I/O),一般会将日志文件放在裸设备上。

3:把重做日志文件设为合理大小:例如,增大日志文件大小可以加快一些大型的INSERT、UPDATE、DELETE操作,也能降低日志文件切换频率。减少一些日志等待事件。一般根据具体业务情况有所不同。一般日志组大小应满足自动切换间隔至少15-20分钟左右业务需求

4:ORACLE推荐,同一个重做日值组下的所有重做日志文件大小、成员个数一致.

联机重做日志状态

日志文件组的状态一般有INACTIVE、ACTIVE、CURRENT、UNUSED、CLEARING、CLEARING_CURRNT等六种状态:

SQL> SELECT STATUS FROM V$LOG;

UNUSED : 表示该联机重做日志文件组对应的文件还从未被写入过数据,通常刚刚创建的联机重做日志文件组会显示成这一状态。当日志切换到这一组时,就会改变状态。

CURRENT : 表示当前正在使用的日志文件组。该联机重做日志组是活动的。当前Oracle数据库正在使用的联机重做日志文件组。

ACTIVE : 表示该组是活动的但不是当前组,实例恢复时需要这组日志。如果处于这一状态,表示虽然当前并未使用,不过该文件中内容尚未归档,或者文件中的数据没有全部写入数据文件,一旦需要实例恢复,必须借助该文件中保存的内容。

INACTIVE: 表示实例恢复已不再需要这组联机重做日志组了。表示对应的联机重做日志文件中的内容已被妥善处理,该组联机重做日志当前处于空闲状态。

CLEARING:表示该组重做日志文件正被重建(重建后该状态会变成UNUSED)。

CLEARING_CURRENT:表示该组重做日志重建时出现错误。

日志文件的状态有STALE,INVALID 、DELETED、空白 四种状态。可以通过下面语句查看

SELECT STATUS FROM V$LOGFILE

INVALID : 表示该文件是不可以被访问的。

STALE : 表示该文件中的内容是不完全的。

空白 : 表示该文件正在使用。

DELETED : 表示该文件已不再有用了。

ARCHIVED列值为YES表示已经归档,NO表示未归档。 SEQUENCE列值表示日志序列号,每进行一次日志切换就+1。

创建新的日志组

ALTER DATABASE ADD LOGFILE GROUP 1('/oradata/redo01_1.log', '/oradata/redo01_2.log') SIZE 8G REUSE;

 

一开始增加的日志文件,日志序列为0,状态为UNUSED,因为没有使用过,进行切换后,就可以正常使用了。

 

删除旧的日志组

ALTER DATABASE DROP LOGFILE GROUP 1;

注意事项:

1)执行删除日志组命令后,其实只是在数据字典中删掉了对于日志信息。你查看对应的日志文件,你会发现日志文件还在,只有手动删除日志文件,才能真正的删除日志文件。

2)不能删除仅有的2个文件组;

例如,数据库只有两组重做日志文件,删除其中一组ALTER DATABASE DROP LOGFILE GROUP 2;

ORA-01567: 删除日志 2 时将为实例 orcl (线程 1) 保留两个以下的日志文件

ORA-00312: 联机日志 2 线程 1: 'E:\APP\KERRY\ORADATA\ORCL\REDO02.LOG'

clip_image004

3)不能删除正在活动的文件组(即CURRENT、ACTIVE状态的日志文件);

Windows平台:

clip_image006

Linux平台:

 

SQL> alter database drop logfile group 10;

ERROR at line 1:
ORA-01623: log 10 is current log for instance WFCSDB03 (thread 1) - cannot drop
ORA-00312: online log 10 thread 1: '/oradata/raw/redo04_1.raw'
ORA-00312: online log 10 thread 1: '/oradata/raw/redo04_2.raw'

 

 

clip_image008

 

SQL> alter system switch logfile;    

System altered.

SQL> select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------
         1          1        265 1.0733E+10          2 NO  INACTIVE              54310652 08-AUG-12
         7          1        263 4194304000          2 NO  INACTIVE              54310551 08-AUG-12
         8          1        264 4194304000          2 NO  INACTIVE              54310641 08-AUG-12
         9          1        266 4194304000          2 NO  INACTIVE              54310659 08-AUG-12
        10          1        267 4194304000          2 NO  ACTIVE                54310666 08-AUG-12
        11          1        268 4194304000          2 NO  CURRENT               56534648 09-AUG-12
        12          1        262 4194304000          2 NO  INACTIVE              54310376 08-AUG-12

7 rows selected.

SQL> alter database drop logfile group 10;
alter database drop logfile group 10
*
ERROR at line 1:
ORA-01624: log 10 needed for crash recovery of instance WFCSDB03 (thread 1)
ORA-00312: online log 10 thread 1: '/oradata/raw/redo04_1.raw'
ORA-00312: online log 10 thread 1: '/oradata/raw/redo04_2.raw'

 

 

 

clip_image010

4)不能删除当前组的成员,当日志组只有一个成员时,不能删除日志组成员。

5)不能删除还没有归档的文件组。

增加日志组文件

ALTER DATABASE ADD LOGFILE MEMBER 'E:\APP\KERRY\ORADATA\ORCL\REDO011.LOG' TO GROUP 1

删除日志组文件

不能删除日志组中唯一的日志文件,可以使用删除组的方法直接删除组;不能删除没有归档或者还在活动的日志;

ALTER DATABASE DROP LOGFILE MEMBER 'E:\APP\KERRY\ORADATA\ORCL\REDO011.LOG'

重命名日志组文件

 

ALTER DATABASE RENAME FILE 'E:\APP\KERRY\ORADATA\ORCL\REDO02.LOG' TO 'D:\REDO02.LOG';

注意2点:

一不能移动正在使用的日志文件,否则执行脚本会报如下错误:

clip_image012

二确保执行命令前把目标文件已经移动到新目录下了,否则会报如下错误:

ORA-01511:重命名日志/数据文件时出错

ORA-01512:重命名日志文件E:\APP\KERRY\ORADATA\ORCL\REDO02.LOG出错,未找到新文件D:\REDO02.LOG

ORA-27041: 无法打开文件。

 
 

清空日志文件数据

清空是说删除日志文件的内容。主要用于数据库无法进行有效恢复的时候。比如标识为current的日志文件组所有文件都坏了等。只有非active 和非current状态的组才能被清空

ALTER DATABASE CLEAR LOGFILE 'XXX\XXX\XX.LOG';

ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP NUMBER;

查询日志组相关信息

 

下面是重做日志相关的数据字典

 

SELECT * FROM V$LOG;

SELECT * FROM V$LOGFILE;

SELECT * FROM V$ARCHIVED_LOG;

SELECT * FROM V$RECOVER_FILE

SELECT * FROM V$LOG_HISTORY;

SELECT * FROM V$LOGHIST;

 

--查看闪回日志使用状况

 

SELECT * FROM V$FLASH_RECOVERY_AREA_USAGE;

 

--查看日志组切换时间间隔

SELECT N.RECID                               AS RECID         ,
       N.FIRST_TIME                          AS FIRST_TIME    ,
       M.FIRST_TIME                          AS END_TIME      ,
       ROUND((M.FIRST_TIME - N.FIRST_TIME) * 24 * 60, 2)AS MINUTES
  FROM V$LOG_HISTORY M, V$LOG_HISTORY N
 WHERE M.RECID = N.RECID + 1
 ORDER BY M.RECID