在数据库中所有的文件都可以丢失,唯有OnlineRedo Log Files和Archive RedoLog Files不可以丢失,否则数据库将无法恢复。
一、什么是联机重做日志文件
联机重做日志文件的主要用于数据库的备份和恢复,它记录了数据的所有变化情况,提供了数据的恢复机制(Oracle在对数据进行操作时,会先写入联机重做日志),它被组织成组,至少有两组日志。
Oracle先写第一组,当第一组写满了,再写第二组,依此类推,如果第三组也写满了,就重新从第一组写起,每一组要保证有两个联机重做日志文件,且分属不同的磁盘,以确保备份和可靠性。
联机重做日志的组中所有的副本都是一模一样的。LGWR这个后台进程会同时向多个联机重做日志的拷贝写入数据,Oracle服务器至少需要两组联机重做日志。
联机重做日志组中的成员具有相同的大小,并被分配了相同的序列号,每次写入日志时会设定一个序列号,根据序列号就可以确定具体的日志。
二、联机重做日志的多路复用
为了防止联机重做日志文件损坏而导致数据库无法恢复,可以复制多份联机重做日志,将其放在不同的磁盘上;即使无法放在多个磁盘上,也建议在同一块磁盘上存放多个备份,这样可以避免I/O故障。联机重做日志的多路复用可能会影响性能,但数据库的重中之重是可靠性。
一个组的成员应该均匀的分配在不同的磁盘上
三、联机重做日志的工作原理
联机重做日志文件的写入是个循环的过程,当第一组写满了将会切换到第二组继续写入,这个切换的过程成为日志切换。日志切换会引发一次检查点(检查点是将脏数据从缓存写入磁盘的时刻,这个写入的进程是DBWn),但反之不成立。同时,日志切换也会将信息写入Controlfile(由CKPT这个进程完成)。
联机重做日志的写入时机包括
1.事物commit时(commit并不是将数据写入data file,而是写入联机重做日志); 2.每3秒钟写一次; 3.当Redo LogBuffer(SGA的重要组成部分)达到三分之一满时; 4.Redo Log Buffer中有超过1MB的数据变化信息; 5.在DBWn这个进程将变化的blocks从缓存中写入到数据文件之前(Checkpoint检查点发生之前)。
四、Log Switch 和 Checkpoint Switch
1. Log Switches
通常情况下LS发生在一组Redo Log File 写满后,但也可以手动控制切换。
[oracle@localhost~]$ sqlplus /nolog
1
2
| 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
SQL> desc v$log;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| 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;
1
2
3
4
5
6
7
| 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;
1
2
3
| -- 日志切换
System altered.
|
SQL> select group#, thread#, sequence#,status from v$log;
1
2
3
4
5
6
| GROUP# THREAD# SEQUENCE# STATUS
---------- ---------- ---------- ----------------
1 1 34 ACTIVE
2 1 35 CURRENT
-- 切换到第二组,序号也变成了35
3 1 33 INACTIVE
|
2. 检查点的切换
当联机重做日志发生了Logswitch,会引发checkpoint。
检查点的切换也可以强制进行,通过指定FAST_START_MTTR_TARGET的值可以实现:
这个值是表示每隔多少秒,DBWn进程会写一次data file,减小这个值能使数据更完整的保存,但会相应的影响性能。
SQL> show parameter fast
1
2
3
4
5
6
| 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;
SQL> show parameter fast
1
2
3
4
5
6
7
|
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;
1
2
| -- 此时会引发检查点,强制让DBWn将数据写入Data File
System altered.
|
|