zoukankan      html  css  js  c++  java
  • 【Oracle】redo与undo

    一 、redo(重做信息)

    是Oracle在线(或归档)重做日志文件中记录的信息,万一出现失败时可以利用这些数据来“重放”(或重做)事务。Oracle中记录这些信息的文件叫做redo log file(重做日志文件)。

    redo log file分online和archived两类,它们都用于恢复。

    当实例失败时,Oracle会使用在线重做日志将系统恰好恢复到故障前的提交点;如果磁盘等介质失败时,Oracle会使用归档重做日志以及在线重做日志将该磁盘上的数据备份恢复到适当的时间点。当一张表被truncate或者表中的数据被误删除时,如果我们已经提交,此时可以利用在线和归档重做日志文件把它恢复到这个“意外”发生前的时间点。

    每个Oracle数据库都至少有两个在线重做日志,每个组中至少有一个成员,这些在线重做日志组以循环方式使用,当满足如下任一条件时,数据会被LGWR进程写入到redo log file中:1. redo log buffer 满1/3;2.每3s;3.redo log buffer满1M;4.commit。

    二 、undo(撤销信息)

    是Oracle在undo段中记录的信息,用于取消或回滚事务。

    从概念上讲,undo正好与redo相反。当我们对数据执行修改时,数据库会生成undo信息,以便回到更改前的状态。Oracle也是通过这一特性实现对版本已经读一致性。当我们执行的事务或语句由于某种原因失败了,或者如果你用一条rollback语句请求回滚,此时Oracle就会运用undo信息将数据放回到修改前的样子。redo用于在失败时重放事务(即恢复事务),undo则用于取消一条或一组语句。与redo不同,undo在数据库内部存储在一组特殊的段中,这个段叫做undo段(undo segment)。

    rollback segment和undo segment一般认为是同义词。

    值得注意的是:当运用undo信息执行恢复时并不是将数据库物理的恢复到执行语句或者事务之前的样子,而是逻辑的恢复到原来的样子,所有的修改都会被逻辑的取消。当Oracle在做回滚的时候会做与之前操作相反的操作,如执行insert,那么数据库在恢复时会相应的执行delete;当执行delete,那么数据库在恢复时会执行insert;对于每个update操作,数据库会执行一个相反的update以完成回滚。

    三 、redo和undo的协作

    对undo的修改也会产生redo。在Oracle中遵循“日志先行”的原则,即当被修改的数据库刷出到磁盘之前,DBWR进程会要求LGWR进程将redo信息刷新输出。我们在执行系统恢复时,redo信息会先将数据库“前滚”到故障时间点,然后再利用“前滚”产生的undo,“回滚”掉没有提交的信息。

    四 、redo log file 管理

    1. 增加日志组

    SQL> alter database add logfile group 4 ('/u01/app/oracle/oradata/drz/redo04a.log','/u01/app/oracle/oradata/drz/redo04b.log') size 50 M;

    Database altered.

    2. 增加日志组成员

    SQL> alter database add logfile member '/u01/app/oracle/oradata/drz/redo04c.log' to group 4;

    Database altered.

    3. 删除日志组成员

    SQL> alter database drop logfile member '/u01/app/oracle/oradata/drz/redo04c.log';

    Database altered.

    SQL> !rm -rf /u01/app/oracle/oradata/drz/redo04b.log

    4.重命名日志文件

    重命名之前必须确保操作系统中已经存在文件。

    ①关闭数据库

    SQL> shutdown immediate
    Database closed.
    Database dismounted.
    ORACLE instance shut down.

    ②操作系统上重命名文件

    [oracle@lgr ~]$ mv /u01/app/oracle/oradata/drz/redo04b.log /u01/app/oracle/oradata/drz/redo04d.log

    ③启动数据库到mount状态,重命名控制文件中的日志组成员

    SQL> startup mount;
    ORACLE instance started.

    Total System Global Area  830930944 bytes
    Fixed Size                  2257800 bytes
    Variable Size             536874104 bytes
    Database Buffers          285212672 bytes
    Redo Buffers                6586368 bytes
    Database mounted.

    SQL> alter database rename file '/u01/app/oracle/oradata/drz/redo04b.log' to '/u01/app/oracle/oradata/drz/redo04d.log';  

    Database altered.

    ④重启数据库

    SQL> alter database open;

    Database altered.

    SQL> select group#,member from v$logfile order by 1;

        GROUP# MEMBER
    ---------- --------------------------------------------------
             1 /u01/app/oracle/oradata/drz/redo01.log
             2 /u01/app/oracle/oradata/drz/redo02.log
             3 /u01/app/oracle/oradata/drz/redo03.log
             4 /u01/app/oracle/oradata/drz/redo04d.log
             4 /u01/app/oracle/oradata/drz/redo04a.log

    ⑤.最后,不要忘记备份控制文件

    SQL> alter database backup controlfile to trace;

    Database altered.

  • 相关阅读:
    Jeecg代码搬砖圣地第五篇(页面布局)
    Jeecg代码搬砖圣地第四篇(页面标签规则)
    Jeecg代码搬砖圣地第三篇(Excel导入导出)
    小程序前端
    javascript 新版本的语法(ECS6)
    nginx下用getallheaders
    wampser 配置debug需要的参数
    Suhosin(php的保护工具)
    php中empty使用的情况
    写出健壮的代码
  • 原文地址:https://www.cnblogs.com/NextAction/p/7366648.html
Copyright © 2011-2022 走看看