Oracle物理结构——Redo log

本文详细介绍了Oracle数据库的Redo log,包括其在恢复操作中的重要性、触发机制、LGWR进程的工作原理以及日志文件的状态管理。在归档模式与非归档模式下,日志文件的处理方式有所不同。文章还探讨了Redo log的规划策略,如何避免I/O错误和文件损坏,并提供了错误处理及日志文件管理的操作建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.带着问题,跟我来

   Questions:         redo log 是什么?

                         redo log 的操作时怎么样进行的,由什么进程触发

                         redo log 会产生瓶颈吗

                          redo log 应该如何规划才能避免出现问题

                         redo log 有哪些状态,哪些状态下的redolog 是可以删除的


2.Redo log概述

        Redo log 是recovery (恢复)操作的重要组成部分,它记录了数据库所有change记录。此外,值得一提有,redo thread 和 redo log contents

其中,对于redo threads,每个实例都有自己的redo log threads,单实例下,threads为1,而多实例,譬如RAC环境下,redo log thread为2,redo threads的出现是为了避免并发时多个实例争用redo log,避免出现redo log争用瓶颈。(后面具体讲解:如何有效的避免redo log争用

         对于redo log content,它存储了redo records,每一个redo records就是一个redo entry,redo entries记录也包括了undo segments,因此redo log也能保护rollback数据。



3.Redo log触发

         LGWR进程【LGWR是一个日志写进程,他讲日志数据从log buffer cache中取出,并以circual fashion的形式写入redo file中,当一个日志文件被写满以后,oracle触发一个switch动作,使得oracle对另一个redo log file 做写操作,如此循环】的触发,使得redo log buffer中的数据被写到redo log file中,oracle必须保证至少有两个redo log file,且保证一个是可用的,使得另一个可以归档(在归档模式下)


3.1浅谈noarchivelog  与 archivelog 区别


        noarchivelog模式下:一个写满的日志文件在将里面的数据change records写到数据文件中后,他就可用了。(联系archivelog模式,有助于理解

        archivelog模式:一个写满的日志文件在将里面的数据change records写到数据文件中后,他同时将这个文件归档(相当于此文件有一副本),且他同时可用。


4.redo log 状态


   redo log 有三种状态——current,active,inactive,他们的意义分别是:

   current redo log file:代表LGWR正在向redo log中写数据

   active redo log file:实例恢复时需要用到此文件

   inactive redo log file:实例恢复不需要用到此文件


SQL> select group#,thread#,archived,status from v$log;
    GROUP#    THREAD# ARC STATUS
---------- ---------- --- ----------------
         1          1 NO  INACTIVE
         2          1 NO  INACTIVE
         3          1 NO  CURRENT

  此结果表明:次数据库处于非归档状态下,且目前只有一个thread,总共三个日志组,且每组只有一个redo log file。




5.redo log 规划


两组日志组(至少),且每组两个文件(至少),这两组日志文件的特点是:

      同组日志文件大小必须相同,不同组日志文件大小可以不同。

这个规划有利于I/O errors 和 file corruption等好处:当数据库LGWR进程无法写入某个日志文件时,故障发生,这时数据库将这个日志文件标记为invalid,并且将这个错误信息写入LGWR trace文件以及数据库的alter日志中。


     那么生产中,redolog 组 和 组大小 分别 设置成多少 比较合理呢?


  这个问题,不好说,但是其实也很好说,那就是通过测试,为了确定合理的redolog file数量以及大小,可以通过做一些测试,具体


通过设置不同的日志组数和大小,然后通过查看trace 文件和数据库 alter 日志文件,如果有信息显示LGWR频繁的等待日志组,那么说明日志组归档时间不够,需要增加日志组


6.LGWR 错误产生以及解决办法





7. 其他 操作(重  要)


7.1 删除一个日志组必须注意以下几点:

  a. 一个实例需要至少两组日志文件
  b.只有状态为inac的日志文件才可以被删除
  c.确保日志已经归档(通过v$log来判断)


SELECT GROUP#,ARCHIVED, STATUS FROM V$LOG;

GROUP# ARC STATUS

--------- -------------------

1 YES ACTIVE

2 NO CURRENT

3 YES INACTIVE

4 YES INACTIVE

 

ALTER DATABASE DROPLOGFILE GROUP 3; 删除日志组3

但是这样并没有删除物理文件,当用OMF时,物理文件就被自动删除。同时,这个删除动作会体现在control file中删除redo logmembers需要注意以下几点:

1、当删除了一个组里面的一个组成员文件后,要立即将其他组里面的日志个数也要调整,不然这个组就失效。

2、当一个组是current 或者valid组是,用alter system switch logfile;(强制归档)



7.2 验证redo log file的块大小

Checksum是oracle来验证redo log files中块大小的依据。

用DB_BLOCK_CHECKSUM=true来开启。

当数据库BLOCK写入到磁盘上面时,oracle计算每个块的checksum

Alter system setdb_BLOCK_CHECKSUM=true;


7.3 redo log 相关视图信息

   v$log  :从控制文件中显示redo log file信息

   v$logfile : 指定redo log 组 和 组状态

  v$log_history : 包含log 历史信息



7.4 清除redo log 文件

  

ALTER DATABASE CLEARLOGFILE GROUP 3;

在不restartdatabase的情况下重新初始化这个日志文件

ALTER DATABASE CLEARUNARCHIVED LOGFILE GROUP 3;

直接删除,不用归档


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值