第七章 管理重做日志
7.1 什么是重做日志
恢复操作的最关键的部分就是重做日志,包括了两个或者更多的预先分配的文件来存储数据库中发生的所有的改变。每一个数据库的进程都与重做日志联系在一起,防止实例失败。
7.1.1 重做线程
每个数据进程都有自己的重做日志组。这些重做日志组,多路复用或者个一的文件我们称为重做线程。在一个典型的配置中,在一个 oracle 数据库中,只有一个数据库进程被使用,在一个真正的集群环境中,两个或者多个实例同时访问一个数据库,每个实例都有自己的重做线程。
7.1.2 重做日志的内容
重做日志文件中充满了重做记录。重做记录也成为重做条目,在数据库中描述改变的单独的块。
通过重做记录你可以修复数据库中的所有的改变,包括撤销段。因此联机重做日志可以保护回滚的段。当你使用重做日志恢复数据库时,数据库读取重做记录中改变的值和改变的相关的块。
7.1.3 数据库怎么写入重做日志文件
重做日志文件包含两个或者多个重做日志文件。数据库必须最少包含两个重做日志文件,一个用于写,而另一个用于归档 ( 如果数据库是出于归档模式时 )
LGWR 是循环写的,当当前的数据文件满了, LGWR将会写下一组重做日志文件。当最后一组文件写满时,数据库就会重新写第一组重做日志文件。
LGWR 是否可以重新写已经满的日志文件,主要决定是归档文件是否被启用
   如果数据处于 非归档模式( NOARCHIVELOG 则该重做日志文件中所有重做记录必须全部被写入到数据文件当中
   如果数据库处于 归档模式( ARCHIVELOG 则该重做日志文件中所有重做记录的所对应的修改结果已经写入数据文件   当中 , 并且归档进程已经将该重做日志文件进行了归档。
7.1.4 活动的(当前)和非活动的重做日志文件
数据库在同一时间只使用一个重做日志文件来存储重做日志缓冲区中的内容。
如果启用了归档,在 ARCn 没有归档之前数据库不能重用或者覆盖一个活跃的重做日志文件。如果在非归档模式下,当最后一个重做日志已经满时,      LGWR将会覆盖地一个可用的重做日志文件。
7.1.5 日志切换和日志序列号
日志切换时指数据库停止写当前的日志文件,从而开始写下一个重做日志文件。通常情况下是在当前重做日志文件写完,并且开始写下一个重做日志文件。你可以设置重做日志固定的时间间隔。你也可以手动强制切换重做日志文件。
每次日志切换 lgwr 开始写数据之前,数据库分配给重做日志文件一个新的日志序列号。当数据库归档联机重做日志文件时,归档日志保留他的日志序列号。
每个联机或者归档重做日志的序列号都是唯一的,当实例失败,或者介质恢复时,数据库采用必要的归档和重做日志文件升序排列重做日志文件。
7.2 重做日志规划
  7.2.1 重做日志的多路复用
       Oracle让你多配置几个重做日志文件,防止任何单个文件损坏。当数据文件多路复用之后,LGWR将同时写入到多个重做日志文件中相同的信息,从而消除重做日志的单点故障。
       多路复用的日志被称为组( group ),组中的每一个日志文件被称为成员( member ),在上图中 A_log1 B_log1 都是组 1 中成员, A_log2 B_log2 都是组 2 的成员。在同一组中的成员都有相同的值。
       同一组中的成员是同时处于活动状态,也就是说同时被  LGWR 写信息。他们都具有相同的日志序列号。从来都不会同时写不同的日志组中的成员。
     重做日志文件失败的响应
      LGWR 不能写入给组中的成员时,数据库标记这个成员失效并且给 LGWR trace 文件一个错误消息,同时在数据库的警告文件中表明不可访问的文件。

状态
LGWR 的行为
LWGR 能成功的在组中至少一个成员中写入
正常写入, LGWR 写入能访问的重做日志文件,并且忽略不能访问的成员
LGWR 不能切换到下一个组中,原因是这个组在等待归档
暂时关闭数据库,知道下一个日志文件组可以访问,或者执行日志归档
因为介质的损坏,下一组中的成员都不能访问
Oracle 将会返回一个错误,数据库实例关闭,在这种情况下,你可能要执行数据库日志文件丢失的恢复。
如果数据库的检查点已经超越了丢失的日志文件,没有必要恢复介质,因为数据已经从重组日志文件中保存到日志文件里。你可以丢弃不可以访问的联机重做日志文件。如果日志文件没有被归档,在日志被丢弃之前使用 alter database clear unarchived log.
 
 
     合法的和非法的配置
      在大多数情况下,日志组中的成员都是对称的,所有的日志文件都应该有相同的成员,但不是必须的。 Oracle 数据库中的唯一要求就是数据库 要至少有两个组。
   7.2.2 重做日志文件放置在不同的磁盘上
        当设置一个复用的日志文件,必须放在不同的物理磁盘上。如果单个磁盘发生故障,那么只会影响到组中的某一个成员。实例可以继续发挥作用。
   7.2.3 设置重做日志文件的大小
     
在同一组中的成员必须具有相同的大小,不同组中的成员可以有不同的大小。然而在不同组中尺寸不一致时没有什么好处。如果没有设置日志切换的检查点,使得每个组保证检查点具有相同的时间间隔。
   7.2.4选择重做日志文件的数量
       最好的方式是一个数据库实例去测试不同的配置用来确定重做日志的数量。最佳的方式是在用最少的可能组而且还不影响 LGWR 写重做日志信息。
       在某些情况下,一个数据库需要两组不同的重做日志文件。其他情况下,一个数据库实例需要增加更多的组来保证  LGWR 的数据写入。在测试过程中,测试重做日志组是否够用的最简单的方法就是检查 LGWR trace 文件和 oracle 的警告文件。如果消息表明一个 LGWR 不得不因为检查点没有完成或者组没有被归档而等待,则需要增加组。
       在创建和修改重做日志实例之前,参数文件会限制重做日志的数量。下面的参数文件会限制限制重做日志文件的数量,你可以在数据库中修改它们。
1.  Maxlogfiles 初始化参数是在创建数据库时决定每个数据库重做日志组的最大数。组的数量的取值范围是 1-maxlogfiles 。修改这个值的唯一方法就是重新建数据库或者修改控制文件。因此,在创建数据库之前考虑这个限制是非常重要的。如果 maxlogfiles 在创建数据库时没有指定,则采用 oracle 默认的值。
2.  Maxlogmembers 初始化参数是在创建数据库时决定每个重做日志组中最大的成员数。同 maxlogfiles 修改这个值的唯一方法就是重新建数据库或者修改控制文件。如果 maxlogmombers 在创建数据库时没有指定,则采用 oracle 默认的值。
 
   7.2.5 控制归档延迟
       你可以强迫所有的重做日志线程在一定的时间间隔切换当前的日志文件。在主被服务器配置中,在主服务器上修改了归档日志,然后再把这些数据传送到备用服务器上。备用服务器上的变化可以落后于主服务器的变化,因为备用服务器的变化必须等待主服务器上的变化完之后然后在传送到备用服务器上。为了限制这种滞后,你可以通过修改 ARCHIVE_LAG_TARGET 初始化参数来修改。这个参数可以让你决定将要限制多少秒来归档。
       设置 ARCHIVE_LAG_TARGET 初始化参数
          当你设置这个参数时,你必须定期实例检查当前的重做日志文件。如果遇到了下面的情况,实例将会切换日志:
          1.当前的日志在n秒之前创建的,并且估计在m秒的时候要进行归档,当n+m的值超过了archive_lag_target的值时。
        2.当前的日志包含重做记录时。
 
7.3 创建重做日志组和成员
   创建组
   你必须具有修改数据库的权限才能增加日志组和成员。而且要确定 maxlogfiles 组的值。
    添加 group 4
alter database add logfile('/u01/app/oracle/oradata/orcl/redo04.log')size 8192k;
添加 group 5
alter database add logfile group 5 '/u01/app/oracle/oradata/orcl/redo05.log' size 8192k;
组数必须是在 1 maxlogfiles 之间,不能跳跃重做日志数。
创建成员
在组 2 中添加一个新的成员 redo02a.log
alter database add logfile member '/u01/app/oracle/oradata/orcl/redo02a.log' to group 2;
注意:必须指定文件名,但是没有必要制定大小,因为在每个组中成员的尺寸是一致的。
或者使用
在组 2 中添加一个新的成员 redo02b.log
alter database add logfile member '/u01/app/oracle/oradata/orcl/redo02b.log' to ('/u01/app/oracle/oradata/orcl/redo02.log','/u01/app/oracle/oradata/orcl/redo02a.log');
7.4 迁移和重命名重做日志组成员
   1.关闭数据库
     Shutdown immediate
   2.拷贝重做日志文件到新的位置

 

 
  
mv /u01/app/oracle/oradata/orcl/redo02.rdo /u01/app/oracle/oradata/orcl/redo02c.rdo
 
   3.启动数据库到mount状态
Connect / as sysdba
Startup mount
   4.重命名重做日志成员

 

 
  

 

 
  

 

 
  
   5.打开数据库
     Alter database open;
7.5 删除重做日志组和成员
   删除数据组和成员必须具有 alter database 权限,还必须考虑一下的注意事项
1.       一个数据库必须具有至少两个重做日志组,一个组中包含一个或着两个成员。
2.       当重做日志组不活跃时你可以删除它,如果你想删除一个当前的日志组,则需要强制切换重做日志文件。
3.       在删除重做日志之前你必须保证数据是被归档了。
  删除组 4
 alter database drop logfile group 4;
  当你在数据库中删除了重做日志而没有使用oracle-managed 文件特性时,而重做日志文件还保留在系统上,他只是更改了数据库中的控制文件,你可以使用重做系统命令删除重做日志文件。
   如果你使用了 oracle-manager 文件时,删除磁盘上的文件是自动完成的。
  删除成员
1.       必须保证每个组中包含两个成员,防止单点故障。
2.       实例中通常包含最少两个重做日志组,不管每个组中有多少个成员。如果组中只有一个可以访问的成员时,你不能删除它。
3.       你能删除不是当前或者活跃组中的成员,如果删除活跃组中的成员时,必须强制切换重做日志组。
4.       删除成员之前必须要把重做日志组归档。
删除组 2 中的 redo02c.log
alter database drop logfile member '/u01/app/oracle/oradata/orcl/redo02c.log';
当你在数据库中删除了重做日志而没有使用 oracle-managed 文件特性时,而重做日志文件还保留在系统上,他只是更改了数据库中的控制文件,你可以使用重做系统命令删除重做日志文件。
7.6 强制日志切换
   强制日志切换。
   Alter system switch logfile;
7.7 验证重做日志块
  
7.8 清除重做日志文件
当数据库在启动过程中,重做日志可能会损坏,因为数据库因为在不能归档的情况下而造成数据库停止活动,在这种情况下你可以在不关闭数据库使用 alter database clear logfile 来初始化文件。
清除组 3 中的日志文件数据:
alter database clear logfile group 3;
如果数据 3 在使用中想继续删除则使用
Alter database clear unarchived logfile group 3;
这样设置则重做日志文件中的数据没有被归档。
有两种可能不能清除日志组中的数据
1.       只有两组日志文件。
2.       要清除的是当前的日志组。
7.9 查看重做日志信息
   V$log;
   V$logfile;
   V$log_history