在数据库中所有的文件都可以丢失,唯有OnlineRedo Log FilesArchive RedoLog Files不可以丢失,否则数据库将无法恢复。

 

一、什么是联机重做日志文件

wKiom1Qkd-fTLNQeAAHv5YmPjLE530.jpg

 

联机重做日志文件的主要用于数据库的备份和恢复,它记录了数据的所有变化情况,提供了数据的恢复机制(Oracle在对数据进行操作时,会先写入联机重做日志),它被组织成组,至少有两组日志。

 

wKioL1QkeB3AOfDzAAGFO47_s70057.jpg

 

Oracle先写第一组,当第一组写满了,再写第二组,依此类推,如果第三组也写满了,就重新从第一组写起,每一组要保证有两个联机重做日志文件,且分属不同的磁盘,以确保备份和可靠性。

 

wKiom1QkeAayahnBAALZ1tiVbzE003.jpg

联机重做日志的组中所有的副本都是一模一样的。LGWR这个后台进程会同时向多个联机重做日志的拷贝写入数据,Oracle服务器至少需要两组联机重做日志。

 

wKioL1QkeDmR9II5AAKT7P_TMWU972.jpg

 

联机重做日志组中的成员具有相同的大小,并被分配了相同的序列号,每次写入日志时会设定一个序列号,根据序列号就可以确定具体的日志。

二、联机重做日志的多路复用

wKioL1QkeEmxKIvYAAO5tcN_Tzk147.jpg

为了防止联机重做日志文件损坏而导致数据库无法恢复,可以复制多份联机重做日志,将其放在不同的磁盘上;即使无法放在多个磁盘上,也建议在同一块磁盘上存放多个备份,这样可以避免I/O故障。联机重做日志的多路复用可能会影响性能,但数据库的重中之重是可靠性。

 

wKioL1QkeFrBjY5TAAGfKL36Qqc284.jpg

 

一个组的成员应该均匀的分配在不同的磁盘上

三、联机重做日志的工作原理

wKioL1QkeGmzQJ8hAAKSUMnpQCc002.jpg

 

联机重做日志文件的写入是个循环的过程,当第一组写满了将会切换到第二组继续写入,这个切换的过程成为日志切换。日志切换会引发一次检查点(检查点是将脏数据从缓存写入磁盘的时刻,这个写入的进程是DBWn),但反之不成立。同时,日志切换也会将信息写入Controlfile(由CKPT这个进程完成)。

 

wKiom1QkeFKzqKOzAAKa4H9Jwkc016.jpg

联机重做日志的写入时机包括

1.事物commit时(commit并不是将数据写入data file,而是写入联机重做日志);

2.3秒钟写一次;

3.Redo LogBufferSGA的重要组成部分)达到三分之一满时;

4.Redo Log Buffer中有超过1MB的数据变化信息;

5.DBWn这个进程将变化的blocks从缓存中写入到数据文件之前(Checkpoint检查点发生之前)。

 

wKioL1QkeIXzWwa9AAMOOSVUHbM061.jpg

 

四、Log Switch Checkpoint Switch

 1. Log Switches

通常情况下LS发生在一组Redo Log File 写满后,但也可以手动控制切换。

wKiom1QkeG3BFkl_AAHCINyMudY206.jpg

 

[oracle@localhost~]$ sqlplus /nolog

 

SQL*Plus: Release 11.2.0.1.0 Production on Fri Aug 29 18:13:17 2014
Copyright (c) 1982, 2009, Oracle. All rights reserved.

 

SQL> conn / as sysdba

Connected.

 

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

 

SQL> select group#, thread#, sequence#,status from v$log;

 

    GROUP#    THREAD# SEQUENCE# STATUS
---------- ---------- --------------------------------------------------
         1          1         34 CURRENT
-- 这组redo log file正在被写入
         2          1         32 INACTIVE
-- inactive 表示该联机重做日志可以被写入,或是其中的数据可以归档
         3         1         33 INACTIVE

 

SQL> alter system switch logfile;

-- 日志切换
 
System altered.

 

SQL> select group#, thread#, sequence#,status from v$log;

 

    GROUP#    THREAD# SEQUENCE# STATUS
---------- ---------- ---------- ----------------
         1         1         34 ACTIVE
         2          1         35 CURRENT
-- 切换到第二组,序号也变成了35
         3          1         33 INACTIVE

 

2. 检查点的切换

当联机重做日志发生了Logswitch,会引发checkpoint

wKioL1QkeJ_BxcItAAFchgVlATY390.jpg

检查点的切换也可以强制进行,通过指定FAST_START_MTTR_TARGET的值可以实现:

这个值是表示每隔多少秒,DBWn进程会写一次data file,减小这个值能使数据更完整的保存,但会相应的影响性能。

 

SQL> show parameter fast

 

NAME                                 TYPE        VALUE
--------------------------- -----------------------------------------
fast_start_io_target                 integer     0
fast_start_mttr_target               integer     260
-- 当前的检查点间隔是260秒
fast_start_parallel_rollback         string      LOW

 

SQL> alter system setfast_start_mttr_target=600 scope=both;

 

System altered.

 

SQL> show parameter fast

 
NAME                                TYPE        VALUE
-------------------------- -----------------------------------------
fast_start_io_target                 integer     0
fast_start_mttr_target               integer     600
-- 检查点的间隔修改为600秒,重启数据库后会生效
fast_start_parallel_rollback         string      LOW

 

除了规定检查点的间隔外,也可以手动触发检查点:

 

SQL> alter system checkpoint;

 -- 此时会引发检查点,强制让DBWn将数据写入Data File
System altered.