在数据库中所有的文件都可以丢失,唯有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
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。
检查点的切换也可以强制进行,通过指定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.