|
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初始化参数 当你设置这个参数时,你必须定期实例检查当前的重做日志文件。如果遇到了下面的情况,实例将会切换日志: |