1、重做日志文件,主讲:李伟 QQ:7274561,引入重做日志文件的目的,一旦数据库崩溃,Oracle服务器就使用重做日志文件中的记录来进行数据库的恢复工作。可以说引入重做日志文件的目的就是数据库的恢复。为此Oracle引入了如下的重做日志结构。 为什么引入这么复杂的重做日志结构呢?为了确保系统的效率,应该尽可能的小。但是这也带来一个问题,就是小文件很可能就被写满。为了解决这一“世纪难题”,Oracle使用了多组(group)重做日志。,重做日志组,要保证Oracle数据库正常工作,至少需要两个重做日志组。 重做日志写进程(LGWR)在任意时刻只能写一组重做日志组,LGWR后台进程正在写的重做日
2、志组称作当前(current)重做日志组。LGWR把完全相同的信息从重做日志缓冲区(redo log buffer)中复制到该组的每个重做日志文件中。它是以循环的方式写重做日志组的。当LGWR写满了一组重做日志时,它就开始写下一组重做日志。这称为日志切换。当写满了最后一组时,LGWR开始写第一组重做日志。,重做日志组,Oracle用以上这种循环的操作方式的确解决了为了提高数据库系统的效率而产生日志文件不够大的难题。但这种循环操作的方式本身又带来了另一个严重的问题。那就是当LGWR循环写了一圈之后再写重做日志文件组中的文件时,这些重做日志中的信息就要被覆盖掉,从这时起Oracle数据库就无法保证
3、数据库崩溃后能恢复全部提交的数据。为了解决这一问题,Oracle引入了归档(archive)日志的结构。,重做日志组,归档后的重做日志称为归档日志文件。与重做日志文件不同,重做日志文件称为联机日志文件,即Oracle服务器运行时需要管理它们。而归档日志文件是脱机日志文件,即除了在归档写进程进行复制的那一瞬间,Oracle服务器在运行时是不需要管理他们的。,重做日志成员(文件),在每个重做日志组中的每个数据文件就称为成员。 从理论上讲,如果重做日志文件不会损坏,每个重做日志组中只要有一个成员就够了。但是大家都知道,作为一个磁盘文件没有人敢担保他们永远不出问题。一旦某个重做日志成员损坏了,该成员中
4、所记录的恢复所要用的信息也不见了,也就是说此时的数据库无法进行全恢复。这种情况对于银行和电信之类的系统是完全不能接受的。,日志切换和检查点,联机重做日志文件是以一种循环的方式来使用的,当一组联机重做日志文件被写满时,LGWR将开始下一组日志文件。这被称为日志切换。此时还要产生检查(校验)点操作,还有一些信息将被写到控制文件中。除了上面说的重做日志的自动切换和自动产生的检查点之外,Oracle数据库管理员可以根据管理和维护的需要,在任何时候强制性的进行重做日志切换,也可以强制性的产生检查点。,日志切换和检查点,强制产生重做日志切换的命令为 ALTER SYSTEM SWITCH LOGFILE
5、强制产生检查点的命令为 ALTER SYSTEM CHECKPOINT 也可以通过设置FAST_START_MTTR_TARGET参数来强制产生检查点,其参数设置如下 FAST_START_MTTR_TARGET=900 实例恢复的时间不会超过900秒,获取重做日志的信息,Oracle提供了两个可获得重做日志文件的数据字典,他们是v$log和v$logfile。 select group#,sequence#,members,bytes,status,archived from v$log SEQUENCE#的值说明从创建数据库以来总共发生过多少次日志切换。 (Oracle数据库所产生的每个重
6、做日志都有唯一的序列号以供将来进行数据恢复时使用),获取重做日志的信息,status的含义 inactive:表示实例恢复已不再需要这组联机重做日志组了。 active:这意味着如果此时出现实例失败,SMON进程仍然需要使用它来进行实例恢复。 current:表示这组联机重做日志组是当前组,并也隐含该联机重做日志组是活动的。 unused:表示Oracle服务器从来没写过该组联机重做日志组,这是重做日志刚被添加到数据库中的状态。,获取重做日志的信息,select * from v$logfile status:”空白”表示该文件正在使用 stale:表示该文件中的内容是不完整的 invalid
7、:表示该文件不可以被访问,说明存在问题 deleted:表示该文件已经不再有用了,添加和删除联机重做日志文件组,ALTER DATABASE ADD LOGFILE GROUP 5 (C:REDO05.LOG,C:REDO06.LOG) SIZE 15M; ALTER DATABASE ADD LOGFILE GROUP 4 C:REDO04.LOG SIZE 15M; ALTER DATABASE DROP LOGFILE GROUP 4,添加和删除联机重做日志文件,ALTER DATABASE ADD LOGFILE MEMBER C:REDO04.LOG TO GROUP 1, C:RE
8、DO05.LOG TO GROUP 2; ALTER DATABASE DROP LOGFILE MEMBER C:REDO04.LOG;,清除联机重做日志文件,处于INACTIVE状态的日志组 如果数据库中有两个重做日志组,或崩溃的重做日志文件属于当前的重做日志组。在这种情况下,如果数据库是开启的话,由于一个联机重做日志文件崩溃使得归档活动不能进行,最终导致数据库的挂起。此时可以使用如下命令重新初始化联机重做日志: ALTER DATABASE CLEAR LOGFILE GROUP 组号,清除联机重做日志文件,如果崩溃的重做日志文件已经不能归档,可以在以上的命令中使用UNARCHIVED关
9、键字来清除已崩溃的重做日志文件,从而避免对它们进行归档,命令如下: ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP 组号 ALTER DATABASE CLEAR LOGFILE GROUP 1 观察SEQUENCE#,清除联机重做日志文件,SEQUENCE#已经变为0,这也是为什么清除一个重做日志后需要做数据库全备份的原因。因为Oracle在进行数据库恢复时,要求重做日志的序列号必须是连续的。,利用OMF来管理联机重做日志文件,利用Oracle管理文件(Oracle Managed Files)来自动管理和维护重做日志文件是9i开始引入的。该方法简
10、化了重做日志的管理和维护。 下面的案例演示如果利用OMF来自动管理和维护重做日志文件。,利用OMF来管理联机重做日志文件,首先应以sys或system登录 然后输入如下三个命令设定每个重做日志成员存放的目录 ALTER SYSTEM SET DB_CREATE_ONLINE_LOG_DEST_1=C:DISK1; ALTER SYSTEM SET DB_CREATE_ONLINE_LOG_DEST_2=C:DISK2; ALTER SYSTEM SET DB_CREATE_ONLINE_LOG_DEST_3=C:DISK3; 然后用下面的命令以OMF方式在所运行的数据库中假如一组新的重做日志,
11、在该重做日志中有3个成员,分别放在上面命令所定义的目录下。文件名是Oracle服务器自动生成的,其大小都是100MB。,利用OMF来管理联机重做日志文件,下面案例演示了如何在数据库中删除一组以OMF方式创建的重做日志组,首先应以system或sys用户登录 然后输入下面的SQL命令删除数据库中的一组重做日志组 ALTER DATABASE DROP LOGFILE GROUP 4 这时候通过 select * from v$log查询,然后去相应的路径下去查看。,联机重做日志文件的配置,准确的决定在实际的商业数据库中联机重做日志组的个数以及成员的大小并非易事儿,一般这是一个逐步调整的过程。一般
12、报警文件或者LGWR的追踪文件是数据库管理员获取这方面信息的重要来源。如果这些文件中的信息表明:联机重做日志文件组的切换过于频繁(如一两分钟切换一次),可能应该增加每个联机重做日志文件的大小。如果这些文件中的信息表明:因为检查点不能及时完成或某个联机重做日志组不能被及时归档而使LGWR频繁等待,可能应该增加联机重做日志组的个数。,重做日志配置的应用实例,通常情况下为了安全,应该将每个重做日志组的成员(文件)都增加到3个。 但是我们为了使数据库的重做日志的维护变得容易,应该将重做日志组增加到5个。为了提高数据库运行的效率,每个重做日志成员(文件)的大小都设置为15MB。 ALTER DATABA
13、SE ADD LOGFILE (C:REDO04.LOG,C:REDO05.LOG,C:REDO06.LOG) SIZE 15M;,重做日志配置的应用实例,ALTER DATABASE ADD LOGFILE (C:REDO07.LOG,C:REDO08.LOG,C:REDO09.LOG) SIZE 15M; ALTER DATABASE DROP LOGFILE GROUP 1; ALTER DATABASE ADD LOGFILE GROUP 1(C:REDO01A.LOG,C:REDO01B.LOG,C:REDO01C.LOG) SIZE 15M;,重做日志配置的应用实例,ALTER D
14、ATABASE DROP LOGFILE GROUP 3; ALTER DATABASE ADD LOGFILE GROUP 3(C:REDO03A.LOG,C:REDO03B.LOG,C:REDO03C.LOG) SIZE 15M; ALTER SYSTEM SWITCH LOGFILE; ALTER DATABASE DROP LOGFILE GROUP 2; 这是会提示:ORA-01624: 日志 2 是紧急恢复实例 orcl (线程 1) 所必需的 因为当前组是ACTIVE状态。 为了能够DROP成功,我们需要再次切换日志。当状态变为INACTIVE时就可以删除了。,重做日志配置的应用实例,ALTER DATABASE ADD LOGFILE GROUP 2(C:REDO02A.LOG,C:REDO02B.LOG,C:REDO02C.LOG) SIZE 15M;,