原文地址:http://blog.csdn.net/ppp_10001/article/details/4688596
重做日志文件(REDO LOGFILE)又被称为事务日志文件(TRANSACTION LOGFILE)。它对ORACLE数据库来说是至关重要的。ORACLE中每执行一条更新
操作时,都会引起数据库的变化,因此都会生成一定数量的重做日志,他们将被记录到重做日志文件中。以便在数据库出现例程失败或介质故
障时,可以利用重做日志文件来恢复数据库。
一、重做日志文件概述
重做日志文件是ORACLE三类文件中最为复杂的一类。在ORACLE 10G安装完毕后,会自动创建3个重做日志文件。重做日志文件主要以重做记录的
形式记录、保存对数据库所作的修改(或事务)。如果在一段时间内只对数据库进行了查询操作,则不产生重做日志记录信息。如果对一个表的
数据进行了修改,并完成了事务的提交,这时数据文件只存储修改后的数据,但重做日志文件中要记录两类数据:一类是修改前的数据;一类是
修改后的数据。所以重做日志文件的管理方式与数据文件的管理方式有所不同。
(一)重做日志文件的作用与目的
重做日志文件在数据库的恢复过程中起着非常重要的作用,可以用来进行例程和介质恢复,以及事务的撤销。
1.数据库运行不正常,如由于断电而出现的例程失败,或者是由于磁盘损坏而出现的介质失败时,都能够实现例程恢复或介质恢复。其中介质
恢复需要借助于归档日志文件;
2.数据库运行正常时,由于不正确的删除或修改了某条记录、某个表,甚至表空间时,能够实现事务的撤销。在撤销时要借助于撤销表空间或
撤销段。
(二)重做记录
重做日志文件是由一条一条重做记录组成的,重做记录(REDO RECORD)是有一个个修改向量(CHANGE VECTOR)组成的。每个修改向量记录了对数
据库中的某个数据块所作的修改。
重做记录记录了可以用来对数据可进行恢复的所有修改的数据,包括回退段。因此,重做日志文件同样也会保护回退数据。当使用重做日志文
件来进行数据库恢复时,ORACLE将读取其中的重做记录(包括其中的修改向量),并且将这些修改用于相关的块中。
在ORACLE中,对数据库所作的修改实际上都是先在内存中进行的。当满足一定条件时先将修改操作产生的在SGA区的重做日志高速缓存中的修改
结果,以重做记录的形式成批的写入重做日志文件中(此时就认为该事务已成功提交,因为此时可以进行事务的回退了,这中机制被称为“快速
提交”),然后才将内存中的在SGA区的数据告诉缓存中的修改结构成批的写入数据文件进行永久保存。因此,只要某项修改操作的重做记录没
有丢失,就可以通过重做记录来恢复该项的修改操作。
在相应的数据提交之前,重做记录也可以被写入到重做日志文件中。如当SGA区的重做日志告诉缓存已经填满,或者提交了另一个事务,那么即
使某些重做记录还没有提交,LGWR也会将重做日志缓存区中的所有重做记录全部写入到某个重做日志文件中,以便获得更多的空闲空间。这样
,如果需要,ORACLE就可以回退这些修改了。
(三)系统更改编号SCN
系统更改编号SCN(SYSTEM CHANGE NUMBER)是由ORACLE自动生成的、随时间不断增大的、永远不会重复的一个整数,并且自动分配给事务和语句
。即,SCN是用于表示数据库变化的唯一表示号。ORACLE使用SCN来确定数据库在某个指定时间点的状态,为事务和语句提供一个读一致性的视
图。SCN被记录在控制文件、数据文件的头部、数据块的头部和重做记录中。
当用户执行一条SELECT语句时,ORACLE为它分配一个SCN。该查询语句在搜索需要的数据的数据块时,只会读取SCN小于或等于该SCN的数据块。
如果所需数据块的SCN大于查询语句的SCN,则该查询语句就会从撤销段中搜索对应的数据块的原始版本(这些原始版本的数据块的SCN同样需要
小于或等于该查询语句的SCN)。通过这样对数据块的SCN进行比较,该查询语句就只会读取在它执行之前已经成功提交的事务的数据块,保证
不会读取未提交事务所修改的脏数据块,也不会读取到该查询语句开始执行之后再提交的数据块,从而保证了读一致性视图。
(四)如何写入重做日志文件
(1)
为保证数据库是可以恢复的,写入重做日志文件时必须遵守如下两个原则:
1.写入的次序要严格按并发事务的执行次序;
2.必须先写入重做日志文件再写入数据文件。
把对数据的修改写入重做日志文件和写入数据文件是两个不同的操作。有可能在这两个操作之间发生故障,即这两个操作只完成了一个。如果
先写入了数据文件,而没有在重做日志文件中记录下这个修改,则以后就无法恢复这个修改了,因为不知道做过什么修改。如果先写入了重做
日志文件,但没有写入数据文件,那么按重做日志文件进行恢复时,只需要多一次撤销操作,而不会影响数据库的正确性。
所以为了安全起见,一定要先写入重做日志文件,即把重做记录写入重做日志文件中,然后在写入数据文件。
(2)循环写入
由于重做日志文件是保存在磁盘上的一个实际的文件,只能具有有限的存储空间,不能无限的记录所有的重做记录。所以,每个ORACLE数据库
都至少要包含两个或两个以上的重做日志文件,LGWR后台进程以循环的方式将重做记录写入其中。
LGWR后台进程在开始写入下一个重做日志文件之前,必须先要确认这个即将被覆盖的重做日志文件已经完成了如下的工作:
1.如果数据库处于NOARCHIVELOG模式,则该重做日志文件中的所有重做记录所对应的修改结构,必须全部被写入数据文件中,称为永久保存在
数据库中的修改结果;
2.如果数据库 处于ARCHIVELOG模式,则该重做日志文件中的所有重做记录多对应的修噶结果,必须全部被写入数据文件中,并且ARCn后台进程
已经将该重做日志文件进行了归档。
(3)日志切换或日志序列号
当LGWR后台进程停止向某个重做日志文件写入而开始向另一个联机重做日志文件写入的那一刻称为日志切换(LOG SWITCH)。通常,日志切换发
生在当前重做日志文件已经完全填满,而且必须填写下一个重做日志文件的时候,然而,可以用基于时间的方式指定日志切换发生的时刻,此
时不用理会当前重做日志文件是否已经完全填满。另外,还可以手动强制执行日志切换。
强制执行日志切换,可以使当前活动的重做日志文件编程非活动的,以便对该日志文件实时维护操作。
要强制实施日志切换,就必须拥有ALTER SYSTEM权限。如果有这种权限,使用带SWITCHE LOGFILE子句的ALTER SYSTEM语句就可以强制实施日志
切换。
ALTER SYSTEM SWITCH LOGFILE;
在每次发生日志切换及LGWR后台进程开始进行填写时,ORACLE都会为该重做日志文件分配下一个新的日志序列号。即,日志序列号是重做日志
文件的使用标识号,其数值是顺序递增的。如果ORACLE归档了重做日志文件,那么归档的日志将保留它的日志序列号。
ORACLE会为循环重用的重做日志文件顺序的分配下一个可用的日志序列号。在每次循环时,同一个重做日志文件的日志序列号是不同的。
每个联机或归档的重做日志文件通过它的日志序列号唯一标识。在例程或介质恢复的过程中,ORACLE可以通过使用所需要的存档和联机重做日
志文件的日志序列号,以升序的方式正确的应用重做日志文件。
当进行日志切换时,重做日志文件所在的组的状态也会随之发生变化。
(4)检查点
检查点(CHECKPOINT)与日志切换密切相关,当发生日志切换时会出发一个检查点。
检查点是一个触发将SGA区的数据高速缓存中已经修改过的数据块写入数据文件,并更新控制文件与数据文件头部的事件。它被用于同步数据库
中的所有数据文件、控制文件和重做日志文件。
当ORACLE发出一个检查点时,CKPT后台进程会促使DBWn后台进程在数据高速缓存中的脏缓存快写入数据文件,而DBWn后台进程又促使LGWR后后
台进程将重做日志高速缓存中的脏缓存快写入重做日志文件。由于发出检查点时,CKPT,DBWn,LGWR几个后台进程同时工作,所以数据文件、控
制文件、重做日志文件中的SCN完全相同,从而使得这三种数据库物理文件完全相同。
当执行COMMIT语句时,只有LGWR后台进程会将重做日志高速缓存中的脏缓存快写入到重做日志文件中,DBWn后台进程只有在检查点时才会将数
据高速缓存中的脏缓存快写入到数据文件。
当出现如下情况时,ORACLE会发出一个检查点,并且由CKPT后台进程来执行:
1.重做日志切换。当某个重做日志写满后,LGWR后台进程会进行重做日志切换,此时会发出一个检查点,并促使DBWn进程将数据高速缓冲区中
所有的脏缓存快写入数据文件中;
2.关闭数据库。使用NORMAL,TRANSACTIONAL,IMMEDIATE选项关闭数据库时,会发出一个检查点;
3.表空间脱机或被设置成BACKUP模式。在将一个表空间设置为脱机状态或被设置成BACKUP模式时,执行一个表空间检查点。此时DBWn进程只会
把数据高速缓存区中的与该表空间相关的脏缓存块写入数据文件;
4.手动检查点。可以使用ALTER SYSTEM CHECKPOINT;语句来手动设置一个检查点;
5.时间检查点。每隔多长时间执行一次检查点。可以通过调整LOG_CHECKPOINT_TOMEOUT和LOG_CHECKPOINT_INTERVAL参数来改变检查点执行的间
隔。在调整检查点执行间隔时要小心,不要让检查点间隔时间太长,也不要添加不必要的检查点。
如果将初始化参数LOG_CHECKPOINT_TO_ALTER设置成TRUE,则关于每隔检查点的信息都将被记录到预警日志文件中。该初始化参数的默认值是
FALSE,表示不记录检查点的信息。如果在预警日志文件中看到关于检查点没有完成的信息,就应该给数据库添加新的重做日志文件,这样会给
检查点的完成提供更多的时间,也保证了家拆按产生的不是很频繁。
(五)重做日志文件的归档
ORACLE利用重做日志文件来记录对数据库的修改操作,但重做日志文件是以循环方式使用的,在重新写入重做日志文件时,其中原来保存的重
做记录将被覆盖。如果能够将所有饿重做记录都保存下来,就可以完整的记录对数据库的全部修改结构了,从而就能够进行更加彻底、完整的
恢复了。这可以通过对重做日志文件进行归档来实现。
归档就是在重做日志文件被覆盖之前,将该重做日志文件通过复制操作系统文件的方式,保存到指定位置。保存下来的重做日志文件的集合被
称为“归档重做日志文件”,复制的过程被称为“归档”。
只有在处于ARCHIVELOG模式的数据库中,才会对重做日志文件进行归档。归档操作可以有ARCn归档进程自动完成,也可以由DBA手工完成。
1.非归档模式。在NOARCHIVELOG模式下,ORACLE将不会对重做日志文件进行归档操作。即,当发生日志切换时,LGWR进程将直接写入下一个重
做日志文件,覆盖其中的重做记录。这样的数据库只能从断电等事件中恢复,适合于对数据库中的数据要求不高的场合。在备份这样的数据库
时,不仅仅要备份数据文件,还要备份重做日志文件。
2.归档模式。在ARCHIVELOG模式下,ORACLE将对重做日志文件进行归档操作。即,当发生日志切换时,LGWR进程要先等待ARCn归档进程将下一
个重做日志文件归档完毕之后,才可以写入该重做日志文件,覆盖其中的重做记录。
这样的数据库可以重所有类型的故障中恢复,是最安全的数据库。如果任何由于硬盘损坏而造成数据损坏都是绝对不能容忍的。那么就应当让
数据库运行在ARCHIVELOG模式下,以便在发生硬盘损坏后,DBA可以使用归档日志、数据库备份来恢复损坏的数据。
二、管理重做日志文件的准则
在创建数据库的同时会创建重做日志文件。在数据库创建之后,如果要改变对重做日志文件的管理策略,DBA可能会需要重新创建重做日志文件
。执行针对重做日志文件的管理工作,需要具有ALTER DATABASE系统权限。
(一)多路复用重做日志文件
如果重做日志文件被损坏了,将会使恢复工作无法展开。对于大型的数据库来说建议使用多路复用重做日志文件,以免重做日志文件的损坏。
多路复用重做日志文件时,LGWR后台进程会将相同的重做记录同时写入相互镜像的多个重做日志文件中,这样,即使其中某个重做日志文件被
损坏了,LGWR后台进程仍然可以继续使用其他的重做日志文件写入重做记录,继续工作(但一个数据项将被写入预警日志文件中)。因此,
ORACLE数据库仍然能够不受影响的继续运行、恢复。
多路复用重做日志文件,是指在多个独立硬盘上多路复用重做日志文件。
1.在多个不同的磁盘上安排多路复用的重做日志文件;
2.LGWR后台进程同时将重做记录写入同一组中的互为镜像的各个成员,日志序号也相同;
3.重做日志文件是循环使用的,日志切换时会产生一个新的日志序号。
相互镜像的重做日志文件被称为一个重做日志文件组(每个组都必须有一个编号),组中的每个重做日志文件被称为该组的一个成员。每个重做
日志文件组中的成员必须具有相同的大小,否则就不能进行同步的日志切换,也无法镜像。组中的每个成员都同时是活动的,或者由LGWR同时
进行写入,好像LGWR分配的同一个日志序号所表示的那样。
为了保证数据库正常安全的运行,必须在数据库中包含至少两个重做日志组。如果某个重做日志组中的所有成员都损坏了,ORACLE就会挂起、
瘫痪或者关闭。此时如果想让ORACLE再运行起来,可能就需要执行实例恢复或介质恢复,而且数据库也可能丢失掉已提交的事务或数据。
(二)合理放置重做日志文件
在建立复用重做日志文件时,应该将同一个重做日志文件组中的每个成员,放置到不同的、独立的硬盘中去。这样,即使其中某个硬盘损坏了
,LGWR后台进程仍然可以继续使用其他成员的重做日志文件写入重做记录,继续工作。因此,ORACLE数据库仍然能够不受影响的继续运行、恢
复。同时,ORACLE会将损坏的重做日志文件的状态标记为INVALID,然后在LGWR后台进程的跟踪文件和数据文件的预警日志文件中记录下它的日
志组编号和成员好,以便DBA确定和排除故障。
最大限度的提高重做日志文件的吞吐量是一个需要优先考虑的问题:
1.如果采用了ARCHIVELOG模式,也应该将重做日志成员放置到不同的硬盘中去,以消除LGWR和ARCn后台进程对重做日志成员的竞争。例如:如
果有两组多路复用重做日志成员,可以将每个成员放置在不同的磁盘上,并将归档重做日志文件防止在另一个磁盘上。这样,LGWR和ARCn就不
会产生竞争成员的现象了;
2.数据文件和重做日志文件也应该放置在不同的磁盘上,以减少DBWn后台竞争向数据文件中写数据块,和LGWR后台进程向重做日志文件写重做
记录之间出现的竞争;
3.不应该将重做日志成员放置在保存SYSTEM,SYSAUX,UNDOTBS或其他非常活跃的数据或索引表空间所在的磁盘上。
(三)合理设置重做日志文件组、文件的数量大小
通过将当前数据库的控制文件备份成文本跟踪文件
ALTER DATABASE BACKUP CONTROLFILE TO TRACE;
就可以获取当前数据库的重做日志文件及其永久参数信息。
(1)重做日志文件组、文件的数量
在某些情况下,数据库例程可能只需要两个组。在另外一些情况下,数据库例程可能还需要附加的组来确保LGWR一直都有可利用的、循环的组
。当数据库的并发事务很多,而重做日志文件组又比较少时,就可能会出现等待写入重做日志文件的情况。
要为数据库例程的重做日志文件组确定合适的数量,最好的方法是测试不同的配置效果。最佳配置是拥有最少的组,而且不妨碍LGWR向重做日
志文件写入信息。
在测试过程中要确定当前的重做日志文件组的配置是否令人满意,最简单的办法就是仔细检查LGWR跟踪文件和数据库预警文件的内容。如果其
中有预警消息“CHECKPOINT NOT COMPLETE”或者“REDO LOG GROUP NOT ARCHIVED”那么LGWR不得不频繁的等待重做日志文件组,此时就需要
通过添加重做日志文件组来解决问题。
在设置或更改例程的重做日志文件组、文件的数量配置时,可以使用永久初始化参数MAXLOGFILES和MAXLOGMEMBERS。
1.MAXLOGFILES参数:在CREATE DATABASE语句中使用的MAXLOGFILES参数,可以为每个数据库指定重做日志文件组的最大数量。组值的范围从1
到MAXLOGFILES。重写这个上限的唯一办法是重新创建数据库或者数据库的控制文件。所以,在创建数据库之前,慎重的考虑这个上限是非常重
要的。如果CREATE DATABASE语句中没有指定MAXLOGFILES,那么MAXLOGFILES将使用默认值。
2.MAXLOGMEMBERS参数。在CREATE DATABASE语句中使用的MAXLOGMEMBERS参数,可以为每个组指定成员的最大数据。和MAXLOGFILES参数一样,
重写这个上限的唯一办法就是重新创建数据库或数据库的控制文件。因此,在创建数据库之前,慎重考虑这个上限是非常重要的。如果CREATE
DATABASE语句中没有指定MAXLOGFILES,那么ORACLE将使用默认值。
在允许的情况下,最好将MAXLOGFILES和MAXLOGMEMBERS设置的大一点。
(2)重做日志文件的大小
在创建重做日志文件时必须指定它的大小。如果重做日志文件设置的太小,就可能导致日志切换过于频繁,间接的增加了检查点的次数,由于
ORACLE在检查点时会进行一系列的同步操作,从而增加了系统的开销,降低了系统的性能。如果设置的太大,当出现例程失败而进行例程恢复
时所花费的时间就很长。建议日志切换的时间应该被控制在20-30分钟之间。可以根据这个来规划重做日志文件的大小。
设置重做日志文件大小时,要考虑将来重做日志文件是否要归档。如果数据库处于ARCHIVELOG模式,就应该规定重做日志文件的大小,以便将
填满的重做日志文件归档到脱机存储介质的某个单元中,而这些介质上还要至少留出一定的未用空间。
采用多路复用的重做日志组时,同一个组的所有成员必须拥有同样的大小。不同组的成员大小可以不同。但是,组之间拥有不同大小的文件尺
寸并不会带来任何好处,如果检查点设置在两个日志切换之间,就需要使所有组具有相同的大小,以便确保检查点发生在正常的时间间隔内。
用ALTER DATABASE DATAFILE语句中用SIZE子句可以指定重做日志文件的大小。
归档日志文件是重做日志文件的备份,他们的大小相同。归档时间与重做日志文件的大小与归档时间是成正比的。即重做日志文件大,归档时
间就长。在允许的情况下,最好将重做日志文件设置的比较大一点,并通过添加重做日志文件组来给归档留出足够的时间。