Oracle Database Administrator's Guide 11g---10.Managing the Redo Log

   1.What Is the Redo Log?

     重做日志是保存数据库所有的改动的文件。重做日志是由一个个重做记录组成,也称为重做条目(Redo Entry),而每一个条目是由一组的改变向量组成的。改变向量指向的是数据库中某一个块数据的变动。重做条目在没写入日志前是存储在SGA中的重做缓存中,每当事务提交时,LGWR(数据库后台写入进程)就把重做条目写入到重做日志中,而且为这个条目分配一个系统变动编号(SCN, System Change Number)。但是当重做缓存满了的时候,尽管事务没有被提交,重做条目也会被写到日志里,如有必要可能会被撤消。

 

     1.1 Oracle 数据库是如何写入重做日志的

         LGWR是用一个循环的方式写入重做日志的,当当前的重做日志写满时,LGWR就会转向下一个可用的重做日志写入,当最后一个可用日志写满时,又会返回写入第一个。如果没有设定存档,那么一个写满的重做日志是可用的当它的内容已经被写入DataFiles里。如果设定了存档(Archived),那么还要等这个重做日志存档并写入DataFiles里才算可用。

 

         当LGWR从一个重做日志转到写入另一个重做日志的时候,称为Log Switch。一般当当前的重做日志满了的时候,就会产生Log Switch, 但是也可人为强制每隔一段时间进行Log Switch。而且每当Log Switch发生,Oracle 数据库都会为下一个重做日志分配一个日志序列码(LSN, Log Sequence Number)然后才开始写。

 

   2.Planning the Redo Log

      如何设定Redo Log应该针对不同情况而定,一般为了防止硬盘损坏,采用多路重做日志,即采用两个或多个相同的重做日志分别放在不同的磁盘。多路日志采用的方式是建立日志组,每个日志组中的成员都是相同的重做日志,LGWR写入重做日志的时候对这个组内所有的日志并行写入。一般情况下,每个日志组都应该对称的,即每个组都有相同个数的成员。但是在某些时候也允许某些组只有一个成员,但是这样做会降低安全性。而去Oracle数据库要求每个instance至少要有两组的重做日志。

 

      在CREATE DATABASE 语句中:

      MAXLOGFILES:是设定整个数据库中有多少个重做日志组数目。

      MAXLOGMEMBERS: 是设定每个日志组有多少个日志成员。

 

 

   3.Controlling Archive Lag

      有时为了减少数据的损失,我们需要强制进行日志切换(Log Switch)。主要是通过设定 ARCHIVE_LAG_TARGET参数 ,这个参数的初始值为零,表示不做强制切换,合理值在60~7200之间,单位为秒。如果当前log是在n秒前被激活的(原文是created),而且其估计归档时间为m秒(这个值应该与当前日志中重做块成正比),当n+m大于 ARCHIVE_LAG_TARGET时且当前重做日志含有重做条目,那么就进行日志切换。

 

     4.Creating Redo Log Groups and Members

         创建的日志组是使用Alert Database语句,例如要建立一个新的重做日志组,可以使用下面的语句:

       ALTER DATABASE
           ADD LOGFILE ('/oracle/dbs/log1c.rdo', '/oracle/dbs/log2c.rdo') SIZE 4M;

       你也可以为新组设定组编号,例如:

       ALTER DATABASE
           ADD LOGFILE GROUP 10 ('/oracle/dbs/log1c.rdo', '/oracle/dbs/log2c.rdo') SIZE 4M;

       而为一个已经存在的日志组添加成员,可以使用:

       ALTER DATABASE ADD LOGFILE MEMBER '/oracle/dbs/log2b.rdo' TO GROUP 2;

       当然你也可以不用写出组编号,直接写整个组的成员来定位这个组:

       ALTER DATABASE ADD LOGFILE MEMBER '/oracle/dbs/log2c.rdo'
           TO ('/oracle/dbs/log2a.rdo', '/oracle/dbs/log2b.rdo');

 

    如果要重新命名一个日志组的成员,则需要使用ALTER DATABASE RENAME FILE语句。但是在这之前要先用Startup mount语句启动并挂载但不用打开数据库,之后再重新打开数据库。

    如果要删除某个日志组,则使用ALTER DATABASE DROP LOGFILE GROUP 3;  #(group number)。 

    删除某个组成员:

    ALTER DATABASE DROP LOGFILE MEMBER '/oracle/dbs/log3c.rdo';

 

    还有其他一些对日志组或成员的操作,例如清空日志文件,强制立刻进行日志切换等,这里就不在记述。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值