5 重做日志文件

时间:2022-04-13 08:15:08

 

重做日志文件时为了数据库恢复的物理文件,其中保存了数据库的变更操作信息。

通过重做日志文件通常是通过重做(REDO)或者是回退(UNDO)实现的。

重做(REDO)就是有些原因到导致事务对数据库的操作的修改在写入数据文件之前丢失了,此时就可以利用重做日志文件做该事务对数据库的变更。

回退(UNDO)如果用户在事务提交之前想回滚事务,那么可以利用重做日志文件撤销事务对数据库所做的变更。

 

重做日志文件的工作原理:每个数据库至少有两个重做日志文件,采用循环邪写的方式进行工作。这样就能保证当一个重做日志文件在进行归档时,还有另一个重做日志文件可用。当一个重做日志文件被写满后,后台进行就

                                    开始写下一个重做日志文件。当所有的重做日志文件都写满后,LGWR进程再重新开始写入第一个重做日志文件,开始新的循环。

通常LGWR进程再开始下一个重做日志之前要确定:

                      该重做日志文件中的所有重做记录所对应的变更操作结果必须全部写入数据文件中。如果数据库处于“归档模式”,要确定对该重做日志文件进行了归档。

 

重做日志文件切换与日志序列号

      重做日志文件切换是指LGWR对一个重做日志文件停止写入,开始对另一个重做日志文件写入的过程。

      日志序列号:当每次发生重做日志切换时,数据库赋予重做日志文件一个日志序列号(log sequence number),LGWR进程将该序列号写入相应的重做日志文件。

 

重做日志文件组的概念:每个重做日志文件的拷贝称为重做日志文件组的成员(MEMBER)。重做日志文件组使用数字标号,如group 1、group 2等。

重做日志文件故障响应:当重做日志文件组中某个成员文件不可用时,LGWR进程无法对该重做日志文件进行写入操作,数据库将表示该重做日志文件的状态为INVALID,将错误信息写入LGWR进程跟增文件中,

                               同时,还会将该重做日志文件不可用的原因写入报警文件中。

 

重做日志文件规划

   (1)重做日志文件组的数量:在oracle数据库中,重做日志文件采用循环写的方式工作,因此至少需要两个可用的重做日志文件组。重做日志文件组的数量应该在保证不影响LGWR进程工作的前提下劲量的少。

                                            其中日志组的最大数量由控制文件中的最大参数MAXLOGFILES指定。

    (2)重做日志文件的数量:在每个重做日志文件组中,至少需要一个可用的重做日志文件成员。Oracle建议每个重做日志文件组中至少有两个可用的重做日志文件成员,以多路复用的形式存在,分散在不同的磁盘上,

                                          以免由于某个成员文件的丢失或介质损坏而导致数据库无法正常运行。其最大数量由控制文件的最大参数MAXLOGMEMBERS指定。

    (3)重做日志文件的存储分布:重做日志文件组的成员文件应该分散存储到不同的磁盘,当一个磁盘损坏时值影响当前磁盘上的重做日志文件,保证LGWR进程可以继续工作,数据库实例不会关闭。

    (4)重做日志文件的大小:设置重做日志文件的大小要考虑到是否要进行归档,如果要进行归档,那么要考虑到物理归档设备上的大小,防止浪费空间。比如一个磁盘100M 归档文件的大小为60M那么还有40M是空闲的,不可使用,如果调整为50M

                                          那么可以做两个归档文件。

 

创建重做日志文件组及其成员

      1.创建重做日志文件组

         为数据库添加重做日志文件组使用ALTER DATABASE ADD LOGFILE

         例:为oracle数据库创建一个新的重做日志文件组,并包含两个成员文件。

SQL> alter database add logfile
2 ('D:\DISK4\REDO04.LOG','D:\DISK5\REDO05.LOG') size 10M;

数据库已更改。

   这种情况是在创建的时候没有指定重做日志文件组号,则系统会自动在当前系统最大重做日志文件组号的基础上加1.也可以使用group字句指定新建的重做日志文件组号。

SQL> alter database add logfile GROUP 5
2 ('D:\DISK4\REDO04.LOG','D:\DISK5\REDO05.LOG') size 10M;

数据库已更改。

  可以通过数据字典视图V$LOGFILE查询当前数据库所有重做日志文件组及其成员信息

      

SQL> select group#,member from v$logfile order by group#;

GROUP#
----------
MEMBER
--------------------------------------------------------------------------------

1
E:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO01.LOG

2
E:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO02.LOG

3
E:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO03.LOG


GROUP#
----------
MEMBER
--------------------------------------------------------------------------------

4
D:\DISK5\REDO05.LOG

4
D:\DISK4\REDO04.LOG

    2.创建重做日志文件

例:为group 1,2,3创建一个成员文件。

SQL> alter database add logfile
2 member
3 'D:\DISK5\REDO01B.LOG' TO GROUP 1,
4 'D:\DISK5\REDO02B.LOG' TO GROUP 2,
5 'D:\DISK5\REDO03B.LOG' TO GROUP 3;

数据库已更改。

  有几点要注意的: 同一个重做日志文件组中的成员文件存储位置尽量分散在不同的磁盘上。

                               不需要指定新建成员文件大小,新建成员文件的大小由重做日志文件组中已有成员的大小决定。

 可以查看各个重做日志文件的状态信息

SQL> select group#,member,status from v$logfile order by group#;

  新建的重做日志文件组成员状态为INVALID,这是由于新建的成员文件还没有被使用。

 

修改重做日志文件的名称与位置

     1.数据库关闭状态下修改重做日志文件的名称与位置

      步骤为

      (1)关闭数据库。

      (2)在操作系统中修改重做日志文件的名称与位置。

      (3)启动数据库到加载状态。

      (4)执行SQL语句

      (5)打开数据库

      (6)检查修改后的重做日志文件的名称与位置

SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。

SQL> host move D:\DISK5\REDO01b.LOG d:\DISK4
移动了 1 个文件。

SQL> STARTUP MOUNT
ORACLE 例程已经启动。

Total System Global Area 2522038272 bytes
Fixed Size 2178376 bytes
Variable Size 1409286840 bytes
Database Buffers 1090519040 bytes
Redo Buffers 20054016 bytes
数据库装载完毕。

SQL> ALTER DATABASE RENAME FILE 'D:\DISK5\REDO01B.LOG' TO 'd:\DISK4\REDO01B.LOG'
;

数据库已更改。

  2.数据库运行状态下修改重做日志文件的名称与位置

步骤

       (1)查看要进行名称与位置修改的重做日志文件所属的重做日志文件组是否为不活动的或者未使用的重做日志文件组。

       (2)在操作系统中修改重做日志文件的名称与位置。

       (3)执行SQL语句

       (4)检查修改后的重做日志文件名称与位置

这个关键是要看文件组是否为不活动的或者为使用的。

 

删除重做日志文件组及其成员

     1.删除重做日志文件组成员文件

      需要注意一下的事项:

      (1)只能删除不活动的重做日志文件组或者成员文件

      (2)每个重做日志文件组中至少需要一个成员文件,即VALID文件。

      (3)如果数据库处于归档模式,在删除重做日志文件之前要确定已经归档。

删除的步骤

      (1)查看要删除重做日志文件的状态

      (2)查看要删除的重做日志文件所属的重做日志文件组的状态

      (3)如果数据库处于归档模式,在删除重做日志文件之前要确定已经归档。

      (4)执行drop语句

      (5)验证日志文件的删除情况

      (6)在操作系统中删除相应的重做日志文件

2.删除重做日志文件组

      需要注意的事项

     (1)无论重做日志文件组有多个成员文件,一个数据库实例至少需要两个重做日志文件组

     (2)只能删除不活动的重做日志组

     (3)如果数据库处于归档模式,在删除重做日志文件之前要确定已经归档。

步骤

     (1)查看数据库中重做日志文件组的数量以及要删除的重做日志文件组的状态

     (2)如果数据库处于归档模式,在删除重做日志文件之前要确定已经归档。

     (3)执行drop语句

     (4)验证结果

     (5)在操作系统中删除该重做日志文件组的所有成员文件

 

重做日志文件切换与检查点

     1.重做日志文件切换

       通常发生切换只有当一个日志文件写满的时候,但是可以通过设置初始化参数ARCHIVE_LAG_TARGET是日志切换按照一定时间间隔进行。在必要时也可以执行alter system switch logfile命令手动强制进行日志切换。

     2.检查点:在数据库发生重做日志切换的同时,还要产生检查点事件,启动CKPT进程,更新控制文件与数据文件,将数据库进行一次同步操作。可以通过设置初始化参数FAST_START_MTTR_TARGET来设置,按特定事件周期性地产生检查点事件,

                    还有就是使用alter system checkpoint 命令强制产生检查点事件。

 

清除重做日志文件组

     在数据库运行过程中,联机重做日志文件可能会因为某些原因损坏,导致数据库最终由于无法将损坏的重做日志文件归档而停止。如果发生这种情况,可以在不关闭数据库的情况下,手动清除损坏的重做日志文件,来避免数据停止

    在两种情况下,清除重做日志文家族的操作无法进行:

    (1)数据库只有两个重做日志文件组

    (2)需要清除的重做日志文件组就是当前的重做日志文件组

 

查看重做日志文件信息

     与重做日志相关的动态性能视图有

   v$log控制文件中获取的所有重做日志文件的基本信息

   v$logfile

   v$log_history重做日志文件相关的历史信息

5 重做日志文件