一、重做日志文件特征

  记录对数据所做的所有更改;提供恢复机制;可以划分成组;至少需要两个组(每个组至少一个成员)。
二、结构
 

 我的Oracle 9i学习日志(11)--重做日志文件及练习_Oracle

联机重做日志文件组:
一组相同的联机重做日志文件副本称作联机重做日志组。
• LGWR 后台进程向组内所有联机重做日志文件并发写入相同信息。
为保证数据库的正常操作,Oracle 服务器最少需要两个联机重做日志文件组。
联机重做日志文件成员:
组内的每个联机重做日志文件称为成员。
组内的每个成员都有相同的日志序列号和同样的大小。Oracle 服务器每次写入日志组时,都分配一个日志序列号以唯一地识别每个重做日志文件。当前日志序列号存储在控制文件和所有数据文件的头部内。
联机重做日志文件组和成员的初始集是在数据库创建时创建的。
下面的参数限制了联机重做日志文件的数量:
CREATE DATABASE 命令中的MAXLOGFILES 参数指定联机重做日志文件组的绝对最大数量。
MAXLOGFILES 的最大值和缺省值取决于您的操作系统。
CREATE DATABASE 命令所使用的MAXLOGMEMBERS 参数决定每个组的成员的最大数量。MAXLOGMEMBERS 的最大值和缺省值取决于您的操作系统。
三、工作原理
Oracle 服务器将对数据库所做的所有更改按顺序记录到重做日志缓冲区中。LGWR 进程把重做条目从重做日志缓冲区写入联机重做日志组的其中一个组,这个组叫做当前(CURRENT)联机重做日志组。LGWR 进程将在以下情况下写入:
当提交事务处理时
每隔3秒钟
当重做日志缓冲区被写满三分之一时
当重做日志缓冲区内的已更改记录超过1 MB
DBWn 将数据库缓冲区高速缓存中修改的块写入数据文件之前
重做日志文件是以循环方式使用的。每个重做日志文件组用一个日志序列号来标识,每次重新使用日志时就会覆盖原来的序列号。
日志切换:
LGWR 按顺序向联机重做日志文件写入重做信息。一旦当前联机重做日志文件组被写满,LGWR 就开始写入下一个组。这称为日志切换。
当最后一个可用联机重做日志文件已满时,LGWR 将返回第一个联机重做日志文件组并开始重新写入,第一个重做日志文件的序号也将被覆盖,每发生一次日志切换序号加1。
检查点:
在检查点期间:
大量的脏数据从数据缓冲区(对应正在经历检查点事件的日志)被DBWn 写入到数据文件中。
后台进程CKPT 更新控制文件以反映该进程已成功完成。如果检查点是由日志切换引起的,CKPT 还会更新数据文件的头部信息。
可以针对数据库中的所有数据文件执行或者只针对特定数据文件执行检查点操作。例如,检查点可发生在下面情况中:
每次日志切换时
当已通过正常、事务处理或者立即选项关闭例程时
通过设置初始化参数FAST_START_MTTR_TARGET (参数值为数字,代表多少秒执行一次)强制执行时
数据库管理员通过手动方式请求时
ALTER TABLESPACE [OFFLINE NORMAL|READ ONLY|BEGIN BACKUP] 命令导致对特定数据文件执行检查点操作时
如果初始化参数LOG_CHECKPOINTS_TO_ALERT 设置为TRUE,则有关每个检查点的信息都记录在alert_SID.log 文件内。该参数缺省值为FALSE,表示不记录检查点。
如果发生switch log,在对LGWR写log file之前要检查这个log file里原来的条目对应的数据是否写入数据文件(即checkpoint是否完成),并且检查原来的条目是否归档,如果没有就要等待完成。所以如果LGWR 跟踪文件或警报文件中的消息表明LGWR 经常不得不因为检查点操作尚未完成或者组尚未归档而等待,您就需要添加组。
 
四、强制执行日志切换和检查点
SQL> select group#, sequence#, members, status from v$log;
 
    GROUP# SEQUENCE#   MEMBERS STATUS
---------- ---------- ---------- ----------------
          1         8              1 INACTIVE
          2         9              1 CURRENT
          3         7              1 INACTIVE
 
SQL> alter system switch logfile;
 
System altered.
 
SQL> select group#, sequence#, members, status from v$log;
 
    GROUP# SEQUENCE#   MEMBERS STATUS
---------- ---------- ---------- ----------------
          1         8              1 INACTIVE
          2         9              1 ACTIVE
          3        10              1 CURRENT
 
SQL> alter system checkpoint;
 
System altered.
 
SQL> select group#, sequence#, members, status from v$log;
 
    GROUP# SEQUENCE#   MEMBERS STATUS
---------- ---------- ---------- ----------------
          1         8              1 INACTIVE
          2         9              1 INACTIVE
          3        10              1 CURRENT
 
注意:在做以下这些操作时建议先备份数据库,完成操作后立刻备份control file。请不要将log file置于不对称状态(即每组的成员的数量和大小不相等)。
五、添加联机重做日志文件组
SQL> alter database add logfile group 4
 2 ('/u01/oradata/lty/redo04a.rd0',                 
 3 '/u01/oradata/lty/redo04b.rd0')
 4 size 50m;
SQL> select group#, sequence#, status from v$log;
 
    GROUP# SEQUENCE# STATUS
---------- ---------- ----------------
          1         8 INACTIVE
          2         9 INACTIVE
          3        10 CURRENT
          4         0 UNUSED
SQL> alter system switch logfile;
 
System altered.
 
SQL> select group#, sequence#, status from v$log;
 
    GROUP# SEQUENCE# STATUS
---------- ---------- ----------------
          1        8 INACTIVE
          2         9 INACTIVE
          3        10 ACTIVE
          4        11 CURRENT
六、添加联机重做日志文件成员
SQL> alter database add logfile member
 2 '/u01/oradata/lty/redo01a.log' to group 1,
 3 '/u01/oradata/lty/redo02a.log' to group 2,
 4 '/u01/oradata/lty/redo03a.log' to group 3;
SQL> select group#,status,member from v$logfile;
 
    GROUP# STATUS MEMBER
---------- ------- ------------------------------
          3        /u01/oradata/lty/redo03.log
          2        /u01/oradata/lty/redo02.log
          1 STALE   /u01/oradata/lty/redo01.log
          4        /u01/oradata/lty/redo04a.rd0
          4        /u01/oradata/lty/redo04b.rd0
          1 INVALID /u01/oradata/lty/redo01a.log
          2 INVALID /u01/oradata/lty/redo02a.log
          3 INVALID /u01/oradata/lty/redo03a.log
注意:如果指定文件已经存在,则大小必须与指定大小一致,并且须指定REUSE选项。如:
SQL> alter database add logfile member
     2 '/u01/oradata/lty/redo02a.log' reuse
 3 to group 2;
七、删除联机重做日志文件组
SQL> alter database drop logfile group 4;
 
Database altered.
 
SQL> select group#, sequence#, status from v$log;
 
    GROUP# SEQUENCE# STATUS
---------- ---------- ----------------
          1        12 CURRENT
          2         9 INACTIVE
          3        10 INACTIVE
 
SQL> select group#,status,member from v$logfile;
 
SQL> select group#,status,member from v$logfile;
 
    GROUP# STATUS MEMBER
---------- ------- ------------------------------
          3        /u01/oradata/lty/redo03.log
          2        /u01/oradata/lty/redo02.log
          1        /u01/oradata/lty/redo01.log
          1        /u01/oradata/lty/redo01a.log
          2 INVALID /u01/oradata/lty/redo02a.log
          3 INVALID /u01/oradata/lty/redo03a.log
 
6 rows selected.
$ls –l /u01/oradata/lty
-rw-r----- 1 oracle oinstall 104858112 Mar 17 03:52 redo01a.log
-rw-r----- 1 oracle oinstall 104858112 Mar 17 03:52 redo01.log
-rw-r----- 1 oracle oinstall 104858112 Mar 17 03:25 redo02a.log
-rw-r----- 1 oracle oinstall 104858112 Mar 16 20:08 redo02.log
-rw-r----- 1 oracle oinstall 104858112 Mar 17 03:26 redo03a.log
-rw-r----- 1 oracle oinstall 104858112 Mar 17 02:47 redo03.log
-rw-r----- 1 oracle oinstall 52429312 Mar 17 03:48 redo04a.rd0
-rw-r----- 1 oracle oinstall 52429312 Mar 17 03:48 redo04b.rd0
注意:至少保留两组重做日志文件;处于current或active状态时的日志文件组不能从数据库被移除;从数据库移除以后的online redo log file继续留在磁盘上,需操作系统将其删除。
八、删除联机重做日志文件成员
SQL> alter database drop logfile member
 2 '/u01/oradata/lty/redo02a.log';
 3 ‘… …’                         #可同时删除多个。
 
Database altered.
 
SQL> select group#,status,member from v$logfile;
 
    GROUP# STATUS MEMBER
---------- ------- ------------------------------
          3        /u01/oradata/lty/redo03.log
          2        /u01/oradata/lty/redo02.log
          1        /u01/oradata/lty/redo01.log
          1        /u01/oradata/lty/redo01a.log
          3 INVALID /u01/oradata/lty/redo03a.log
注意:不能删除组中的最后一个成员;处于current或active状态时的日志文件组不能删除其中的成员;在archive模式下,未归档的log file不呢个删除其组成员;删除联机重做日志文件成员时,如果没有使用OMF 功能,则不会删除操作系统文件。
九、重定位或重命名联机重做日志文件
将log file group3的成员/u01/oradata/lty/redo03a.log改为/u01/oradata/lty/log/redo03a.rdo。
方法1:步骤
1. Shut down the database.
SQL > SHUTDOWN
2. Copy or move the online redo log files to the new location.
3. Start up the database and mount, but do not open it.
SQL > STARTUP MOUNT
4. Rename the online redo log members using the ALTER DATABASE RENAME
FILE command.
SQL> alter database rename file
      2 '/u01/oradata/lty/redo03a.log'
      3 to
      4 '/u01/oradata/lty/log/redo03a.rdo';
5. Open the database for normal operation.
SQL> ALTER DATABASE OPEN;
方法2:新增一个组,然后删除一个组。
步骤1:SQL> alter database drop logfile group 3;
    步骤2:删除group3的文件。
    步骤3:SQL> alter database add logfile group 3
 2 ('/u01/oradata/lty/redo03.log',
 3 '/u01/oradata/lty/log/redo03a.rdo')
 4 size 100m;
十、清理online redo log files
Online redo log files可能会在数据库运行过程中损坏,而在log file只有两组或损坏的文件处于current状态,不可能用drop命令删除。在这种情况下,可以用下面的命令从新初始化log files:
ALTER DATABASE CLEAR LOGFILE GROUP 2;
另外,加UNARCHIVED关键字可以避免归档损坏的log files:ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP 2;
注意:从新初始化的log file中的条目将丢失,也就意味着这些丢失的条目所对应的数据库的改变将不可恢复,日志文件将记录从哪里将不可恢复的信息。
十一、获取组和成员的信息
V$LOG 视图:
下面的查询返回控制文件中关于联机重做日志文件的信息:
SQL> SELECT group#, sequence#, bytes, members, status
2 FROM v$log;
GROUP# SEQUENCE# BYTES MEMBERS STATUS
--------- ---------- -------- --------- ---------
1 688 1048576 1 CURRENT
2 689 1048576 1 INACTIVE
2 rows selected.
下面的项是STATUS 列的常见值:
UNUSED:表示从未对联机重做日志文件组进行写入。这是刚添加的联机重做日志文件的状态。
CURRENT:表示当前的联机重做日志文件组。这说明该联机重做日志文件组是活动的。
ACTIVE:表示联机重做日志文件组是活动的,但是并非当前联机重做日志文件组。
崩溃恢复需要该状态。它可用于块恢复。它可能已归档,也可能未归档。
CLEARING:表示在执行ALTER DATABASE CLEAR LOGFILE 命令后正在将该日志重建为一个空日志。日志清除后,其状态更改为UNUSED
CLEARING_CURRENT:表示正在清除当前日志文件中的已关闭线程。如果切换时发生某些故障,如写入新日志标头时发生了输入/输出(I/O) 错误,则日志可能处于此状态。
INACTIVE:表示例程恢复不再需要联机重做文件日志组。它可能已归档,也可能未归档。
V$LOGFILE 视图:
若要获取组内所有成员的名称,请查询V$LOGFILE 视图。
SQL> SELECT member FROM V$LOGFILE;
MEMBER
-------------------------------------
/u01/home/db03/ORADATA/u03/log02a.rdo
/u01/home/db03/ORADATA/u03/log01a.rdo
STATUS 列的值可以为下列之一:
INVALID:表明该文件不可访问
STALE:表示文件内容不完全
DELETED:表明该文件已不再使用
空白表明文件正在使用中
十一、归档的重做日志文件
缺省情况下,数据库是在NOARCHIVELOG 模式下创建的。
归档联机重做日志文件有两种方法:手动、自动(建议采用的方法)。
LOG_ARCHIVE_START 初始化参数表明例程启动时,使用手动还是自动归档。
TRUETRUE 表示归档是自动的。ARCn 将在每次日志切换时开始将已满的日志组归档。
FALSEFALSE 是缺省值,表示DBA 将手动归档已满的重做日志文件。每次归档联机重做日志文件时,DBA 必须手动执行一条命令。可以对所有或特定的联机重做日志文件进行手动归档。
成功归档后: 将在控制文件中加入一个条目, 记录:归档日志名、日志序列号以及高和低系统更改号(SCN)
在以下操作完成前,不能再使用已满的重做日志文件:
执行检查点操作
ARCn 将文件归档
Archive redo log files可以进行多元备份,由DBA 维护。
有关归档日志的信息可从V$INSTANCE 获取。
SQL> SELECT archiver
2 FROM v$instance;
ARCHIVE
---------
STOPPED
 
所遇到的问题描述:
SQL> select * from v$logfile;
 
    GROUP# STATUS TYPE    MEMBER
---------- ------- ------- ------------------------------
          3        ONLINE /u01/oradata/lty/redo03.log
          2        ONLINE /u01/oradata/lty/redo02.log
          1        ONLINE /u01/oradata/lty/redo01.log
          1        ONLINE /u01/oradata/lty/redo01a.log
          3 INVALID ONLINE /u01/oradata/lty/redo03a.log
Log file group 3有一个成员文件不能用,在执行SQL> alter system switch logfile;将第三组切换到current后这个文件状态恢复正常。
练习:
1 a List the number and location of existing log files.
Hint: Query the V$LOGFILE dynamic performance view.
b Display the number of online redo log file groups and members your database has.
Hint: Query the V$LOGFILE dynamic performance view.
2 In which database mode is your database configured? Is archiving enabled?
Hints
- Query the V$DATABASE dynamic performance view.
- Query the V$INSTANCE dynamic performance view.
解析:SQL> select log_mode from v$database;
LOG_MODE
------------
ARCHIVELOG
3 Add an online redo log file member to each group in your database located on u04,
using the following naming conventions:
Add member to Group 1: log01b.rdo
Add member to Group 2: log02b.rdo
Verify the result.
Hints
- Execute the ALTER DATABASE ADD LOGFILE MEMBER command to add an
online redo log file member to each group.
- Query the V$LOGFILE dynamic performance view to verify the result.
4 Add an online redo log file group with two members located on u03 and u04 using
the following naming conventions and verify the result.
Add Group 3: log03a.rdo and log03b.rdo
Hints
- Execute the ALTER DATABASE ADD LOGFILE command to create a new
group.
- Query the V$LOGFILE dynamic performance view to display the name of the
new members of the new group.
- Query the V$LOG dynamic performance view to display the number of online
redo log file groups and members.
5 Remove the online redo log file group created in step 4.
Hints
- Use ALTER SYSTEM SWITCH LOGFILE if the log files are active. The number
of log switches required will vary. Note: Query the database to see which log file
is active then decide how many times you need to perform the ALTER SYSTEM
SWITCH LOGFILE command.
- Execute the ALTER DATABASE DROP LOGFILE GROUP command to remove
the log group.
- Query the V$LOG dynamic performance view to verify the result.
- Remove the operating system files for the group.
6 Resize all online redo log files to 1024 KB.
Hints
- You cannot resize log files, therefore, add new logs and drop the old.
- Execute the ALTER DATABASE ADD LOGFILE GROUP command to add two
new groups with the size 1024 KB.
- Query the V$LOG dynamic performance view to check the active group.
- Execute the ALTER SYSTEM SWITCH LOGFILE command to force log switches
and change the group stage to inactive. The number of log switches required will
vary. Note: Query the database to see which log file is active, and then decide
how many times you should perform the ALTER SYSTEM SWITCH LOGFILE
command.
- Execute the ALTER DATABASE DROP LOGFILE command to remove the
unused groups.
- Query the V$LOG dynamic performance view to verify the result.