zoukankan      html  css  js  c++  java
  • oracle之二redo日志

    redo 日志

    4.1 redo (重做) log 的功能:数据recovery
    4.2 redo log 特征:
         1)记录数据库的变化(DML、DDL)
         2)用于数据块的recover  [SMON]
         3)以组的方式管理redo file ,最少两组redo ,循环使用
         4)和数据文件存放到不同的磁盘上,需读写速度快的磁盘(比如采用RAID10)
         5)日志的block和数据文件的block不是一回事

    SQL> select max(lebsz) from x$kccle;     //查看日志文件的块大小。

    MAX(LEBSZ)
    ----------
           512
         
    日志切换:
         1)归档模式:将历史日志连续的进行保存。
         2)非归档: 历史日志被覆盖
         3)并产生checkpoint,通知redo log 所对应的 dirty block 从data buffer刷新到datafile,并且更新控制文件
            
    4.3 redo 日志组
         1)最少两组(考点),最好每组有两个成员(考点),并存放到不同的磁盘上,大小形同,互相镜像
         2)日志在组写满时发生切换,或手工切换: alter system switch logfile ;
         3)在归档模式,日志进行归档,并把相关的信息写入controlfile

    4.4 如何添加日志组

    15:49:43 SQL> select * from v$log;

        GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS     ARC     STATUS           FIRST_CHANGE#     FIRST_TIME
    ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------------------------------------------
             1              1        143       52428800          1         YES     INACTIVE               2144594         17-7月 -12
             2              1        144       52428800          1         NO      CURRENT               2145200         17-7月 -12
             3              1        142       52428800          1         YES     INACTIVE               2113981         17-7月 -12

    alter system flush buffer_cache;后incative变为active

    15:50:31 SQL> col member for a50;
    15:50:47 SQL> select group#, member from v$logfile;

        GROUP# MEMBER
    ---------- --------------------------------------------------
             1 /u01/oradata/timran11g/redo01.log
             3 /u01/oradata/timran11g/redo03.log
             2 /u01/oradata/timran11g/redo02.log

    增加一个组group4,

    15:53:53 SQL> alter database add logfile '/u01/data/orcl/redo04.log' size 50m;
    在ASM上添加日志组:alter database add logfile '+DATAVG/yjdb/onlinelog/group1-redo01.log' size 512m;

    15:53:56 SQL> select group#, member from v$logfile order by group#;

        GROUP# MEMBER
    ---------- --------------------------------------------------
             1 /u01/oradata/timran11g/redo01.log
             2 /u01/oradata/timran11g/redo02.log
             3 /u01/oradata/timran11g/redo03.log
             4 /u01/oradata/timran11g/redo04.log

    4.5 如何添加日志组的成员

    加member为每个组(一共是4个组)
    先建好目录,准备放在/u01/disk2/timran/下
    [oracle@timran timran]$ mkdir -p /u01/disk2/timran
    [oracle@timran timran]$

    16:00:39 SQL> alter database add logfile member
    '/u01/disk2/timran/redo01b.log' to group 1,
    '/u01/disk2/timran/redo02b.log' to group 2,
    '/u01/disk2/timran/redo03b.log' to group 3,
    '/u01/disk2/timran/redo04b.log' to group 4;


    SQL> select group#,member,status from v$logfile;
     
        GROUP# MEMBER                                                                           STATUS
    ---------- -------------------------------------------------------------------------------- -------
             3 /u01/oradata/timran11g/redo03.log                                                
             2 /u01/oradata/timran11g/redo02.log                                                
             1 /u01/oradata/timran11g/redo01.log                                                
             4 /u01/oradata/timran11g/redo04.log                                                
             1 /u01/disk2/timran/redo01b.log                                                    INVALID
             2 /u01/disk2/timran/redo02b.log                                                    INVALID
             3 /u01/disk2/timran/redo03b.log                                                    INVALID
             4 /u01/disk2/timran/redo04b.log                                                    INVALID

    16:01:54 SQL> select * from v$log;        //看到MEMBERS列已经是2了

        GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS     ARC STATUS           FIRST_CHANGE#         FIRST_TIME
    ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------------
             1              1        143       52428800          2        YES INACTIVE               2144594         17-7月 -12
             2              1        144       52428800          2         NO  CURRENT              2145200         17-7月 -12
             3              1        142       52428800          2         YES INACTIVE               2113981         17-7月 -12
             4              1          0       52428800         2         YES UNUSED                       0

    16:03:06 SQL> alter system switch logfile;    //多做几次切换,消除invalid  //同步组里的member,这步很重要。

    4.6 如何查看日志信息

    说明一下v$log这个重要的视图

     status有四种状态:
     unused:     新添加的日志组,还没有使用
     inactive:     日志组对应的脏块已经从data buffer写入到data file ,可以覆盖
     active:     日志组对应的脏块还没有从data buffer写入到data file,含有实例恢复需要的信息,不能被覆盖,归档已完成
     current:     当前日志组,日志组对应的脏块还没有从data buffer写入到data file,含有实例恢复需要的信息,不能被覆盖
     
     thread:     线程(通过后台进程lgwr 启动),在单实例的环境下,thread# 永远是1
     sequence:     日志序列号。在日志切换时会递增。
     FIRST_CHANGE#: 在当前日志中记录的首个数据块的scn。(当事务完成的时候会在数据块上写入一个scn,代表数据块的变化)。

    4.7、日志恢复(PPT-II-146-148)

    例1 inactive日志组丢失

    SQL> select * from v$log;
     
        GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS     ARCHIVED STATUS           FIRST_CHANGE#     FIRST_TIME
    ---------- ---------- ---------- ---------- ---------- -------- ---------------- ------------- -----------
             1              1         59       52428800          2         NO           CURRENT               7108854         2013-3-25 1
             2              1         56       52428800          2         YES          INACTIVE               7087087         2013-3-25 1
             3              1         58       52428800          2         YES         INACTIVE              7108852         2013-3-25 1
             4             1         57       52428800          2         YES          INACTIVE               7108300         2013-3-25 1
     
    注意:本例日志组4是INACTIVE状态的。

    [oracle@timran timran]$ rm /u01/oradata/timran11g/redo04.log
    [oracle@timran timran]$ rm /u01/disk2/timran/redo04b.log

    SQL> alter database clear logfile group 3;        //注意:这一步使刚才在os里删掉的那两个group4的文件又建立上了。

    例2 active日志组丢失(脏块未回写完成,但是归档已完成)

    注:本例日志组3状态是ACTIVE状态的。

    [oracle@timran timran]$ rm /u01/oradata/timran11g/redo03.log
    [oracle@timran timran]$ rm /u01/disk2/timran/redo03b.log

    SQL> alter database clear logfile group 3;
    alter database clear logfile group 3
    *
    第 1 行出现错误:
    ORA-01624: 日志 3 是紧急恢复实例 timran11g (线程 1) 所必需的
    ORA-00312: 联机日志 3 线程 1: '/u01/oradata/timran11g/redo03.log'
    ORA-00312: 联机日志 3 线程 1: '/u01/disk2/timran/redo03b.log'

    SQL> alter system checkpoint;      //把cache buffer中的脏块全部写入datafile

    SQL> alter database clear logfile group 1;

    例3 current日志组丢失。

    注:本例日志组1状态是CURRENT状态的

    [oracle@timran timran]$ rm /u01/oradata/timran11g/redo01.log
    [oracle@timran timran]$ rm /u01/disk2/timran/redo01b.log
    [oracle@timran timran]$

    01:10:11 SQL> alter system switch logfile;    切换几次,触动它一下。

    告警日志会记录有关信息(ADR)

    暂时好像没有什么问题发生,继续切换,当current 又转会到group1时,死机!

    当前日志损坏的问题比较复杂,可以分以下几种情况讨论(PPT-II-147)

    1)如果数据库没有崩溃(open)

    第一步,可以做一个完全检查点,将db buffer中的所有dirty buffer全部刷新到磁盘上。

    SQL> alter system checkpoint;

    第二步,尝试数据库在打开状态下进行不做归档的强制清除。

    SQL> alter system switch logfile;
    SQL> alter database clear unarchived logfile group 2;

    数据库此时为打开状态,这步若能成功,一定要做一个新的数据库全备(考点)。为何?因为当前日志没有归档,归档日志sequence已无法保持连续性。

    2)如果数据库已经崩溃,准备做传统的基于日志的不完全恢复或使用闪回数据库
       在open过程中需要实例恢复要用到REDO LOG,所以database无法open

    SQL> recover database until cancel;
    SQL> alter database open resetlogs;

    3)如果严重到以上方法都不能resetlogs打开数据库,可以试试下面的最后一招:

    修改pfile文件,第一行添加_allow_resetlogs_corruption=TRUE   600
    该参数的含义是:允许在破坏一致性的情况下强制重置日志,打开数据库。_allow_resetlogs_corruption将使用所有数据文件最旧的SCN打开数据库,所以通常来讲需要保证SYSTEM表空间拥有最旧的SCN。在强制打开数据库之后,可能因为各种原因会有ora-600错误。

    [oracle@work dbs]$ vi inittest11g.ora

    _allow_resetlogs_corruption=TRUE
    *.audit_file_dest='/u01/admin/timran11g/adump'
    *.audit_trail='db'
    *.compatible='11.1.0.0.0'
    ...
    ...

    //再以pfile 启动instance 到mount状态,然后 alter database open resetlogs
    //这是在不一致状态下强行打开了数据库,建议做一个逻辑全备。
    exp/expdp



    4.8 使日志恢复到原来的配置

    尝试使用EM方式恢复原状。删除增加的member和group4,注意当前日志组要切换后才能删除,最后,验证无误后删掉/u01/disk2目录。

  • 相关阅读:
    ES6 Set.Map.Symbol数据结构
    ES6 class类 静态方法及类的继承
    ES6 浅谈Reflect
    ES6 proxy代理详解及用法
    Vue之生命周期函数
    Vue之自定义键盘修饰符、自定义指令
    v-show和v-if区别
    迭代器iterator
    es6之Proxy代理
    es6之symbol数据类型
  • 原文地址:https://www.cnblogs.com/jinxf/p/9166733.html
Copyright © 2011-2022 走看看