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目录。

  • 相关阅读:
    eclipse如何与git 配合工作。
    git托管代码(二)
    PPC2003 安装 CFNET 3.5成功
    我的Window Mobile WCF 項目 第三篇 WM窗体设计
    我的Window Mobile WCF 項目 第一篇Mobile开发和WinForm开发的区别
    我的Window Mobile WCF 項目 第七天
    我的Window Mobile WCF 項目 第二篇 WindowsMobile访问WCF
    WCF 用vs2010 和 vs2008的简单对比测试
    vs2010beta1 和 搜狗输入法 冲突,按下 Ctrl 键就报错,重装搜狗解决
    我的Window Mobile WCF 項目 第六天 (二)
  • 原文地址:https://www.cnblogs.com/jinxf/p/9166733.html
Copyright © 2011-2022 走看看