Oracle 联机重做日志文件(ONLINE LOG FILE)

系统 1563 0

--=========================================

-- Oracle 联机重做日志文件 (ONLINE LOG FILE)

--=========================================

 

一、 Oracle 中的几类日志文件

    Redo log files       --> 联机重做日志

    Archive log files    --> 归档日志

    Alert log files      --> 告警日志

    Trace files          --> 跟踪日志

        user_dump_dest           --> 用户跟踪日志

        backupground_dump_dest   --> 进程跟踪日志

   

    -- 查看后台进程相关目录

        SQL > show parameter dump

 

        NAME                                  TYPE         VALUE

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

        background_core_dump                  string       partial

        background_dump_dest                  string       / u01 / app / oracle / admin / orcl / bdump

        core_dump_dest                        string       / u01 / app / oracle / admin / orcl / cdump

        max_dump_file_size                     string       UNLIMITED

        shadow_core_dump                      string       partial

        user_dump_dest                        string       / u01 / app / oracle / admin / orcl / udump   

       

    关于 Oracle 常用目录及路径请参考: Oracle 常用目录结构(10g)

    关于 Oracle 体系结构请参考: Oracle 实例和Oracle 数据库(Oracle 体系结构)

 

二、联机重做日志的规划管理

    1. 联机重做日志      

        记录了数据的所有变化 ( DML , DDL 或管理员对数据所作的结构性更改等 )

        提供恢复机制 ( 对于意外删除或宕机利用日志文件实现数据恢复 )

        可以被分组管理

       

    2. 联机重做日志组

        由一个或多个相同的联机日志文件组成一个联机重做日志组

        至少两个日志组,每组一个成员 ( 建议每组两个成员,分散放开到不同的磁盘 )

        LGWR 后台进程同时将日志内容写入到一个组的所有成员

            LGWR 的触发条件

                在事务提交的时候 ( COMMIT )

                Redo Log Buffer 三分之一满

                Redo Log Buffer 多于一兆的变化记录

                DBWn 写入数据文件之前

           

    3. 联机重做日志成员

        重做日志组内的每一个联机日志文件称为一个成员

        一个组内的每一个成员具有相同的日志序列号 ( log sequence number ), 且成员的大小相同

        每次日志切换时, Oracle 服务器分配一个新的 LSN 号给即将写入日志的日志文件组

        LSN 号用于唯一区分每一个联机日志组和归档日志

        处于归档模式的联机日志, LSN 号在归档时也被写入到归档日志之中

       

    4. 日志文件的工作方式

        日志文件采用按顺序循环写的方式

        当一组联机日志组写满, LGWR 则将日志写入到下一组,当最后一组写满则从第一组开始写入

        写入下一组的过程称为日志切换

        切换时发生检查点过程

        检查点的信息同时写入到控制文件

   

    5. 联机日志文件的规划

        总原则

            分散放开,多路复用

            日志所在的磁盘应当具有较高的 I / O

            一般日志组大小应满足自动切换间隔至少 15 - 20 分钟左右业务需求

            建议使用 rdo 结尾的日志文件名,避免误删日志文件。如 redo1 . rdo , redo2 . rdo

        规划样例

            Redo Log Group1      Redo Log Group2      Redo Log Group3

           

            Member1              Member1               Member1             -->Physical Disk 1

           

            Member2              Member2               Member2             -->Physical Disk 2

           

            Member3              Member3               Member3             -->Physical Disk 3

           

    6. 日志切换和检查点切换

        ALTER SYSTEM SWITCH LOGFILE ;    -- 强制手动切换

       

        ALTER SYSTEM CHECKPOINT ;

       

        强制设置检查点间隔

        ALTER SYSTEM SET FAST_START_MTTR_TARGET = n

       

    7. 添加日志文件组

        ALTER DATABASE ADD LOGFILE [ GROUP n]

            ( '$ORACLE_BASE/oradata/u01/logn1.rdo' ,

              '$ORACLE_BASE/oradata/u01/logn2.rdo' )

            SIZE mM ;

           

    8. 添加日志成员

        ALTER DATABASE ADD LOGFILE MEMBER

        '$ORACLE_BASE/oradata/u01/logn1.rdo' TO GROUP 1 ,

        '$ORACLE_BASE/oradata/u01/logn2.rdo' TO GROUP 2 ;

       

    9. 删除日志成员

        不能删除组内的唯一一个成员

        不能删除处于 active current 状态组内的成员

        删除处于 active current 状态组内的成员,应使用日志切换使其处于 INACTIVE 状态后再删除

        对于组内如果一个成员为 NULL 值,一个为 INVALID ,且组处入 INACTIVE ,仅能删除 INVALID 状态成员

        删除日志成员,物理文件并没有真正删除,需要手动删除

        删除日志文件后,控制文件被更新

        对于处于归档模式下的数据库,删除成员时确保日志已被归档,查看 v$log 视图获得归档信息

        ALTER DATABASE DROP LOGFILE MEMBER '$ORACLE_BASE/oradata/u01/logn1.rdo'

       

    10. 删除日志组

        一个实例至少需要两个联机日志文件组

        活动或当前的日志组不能被删除

        组内成员状态有 NULL 值或 INVALID 状态并存,组不可删除

        日志组被删除后,物理文件需要手动删除 ( 对于非 OMF )

        ALTER DATABASE DROP LOGFILE GROUP n

       

    11. 日志的重定位及重命名

        所需权限

            ALTER DATABASE 系统权限

            复制文件到目的位置操作系统权限 ( 写权限 )

        CURRENT 状态组内的成员不能被重命名

        建议该行为之前备份数据库

        重命名或重定位之后建议立即备份控制文件

        重定位及重命名的两种方法

            添加一个新成员到日志组,然后删除一个旧的成员

            使用 ALTER DATABASE RENAME FILE 命令 ( 不区分归档与非归档模式 )

                复制联机日志文件到新路径 :ho cp <oldfile> <newfile>

                执行 ALTER DATABASE RENAME FILE '<oldfile>' TO '<newfile>'

            对于处于 CURRENT 状态的需要改名且不切换的情况下

                办法是切换到 MOUNT 状态下再执行上述操作

                               

    12. 清空日志文件组

        ALTER DATABASE CLEAR LOGIFLE GROUP n

        ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP n -- 使用 unarchived 避免归档

   

    13. 日志周期循环及切换分析

       

        Group 1       Group 2       Group 3

       

        Current       Inactive      Inactive

        ---------- Log Switch -------------

        Active        Current       Inactive

        ---------- Log Switch -------------

        Active        Active        Current

        ---------- Log Switch -------------

        Current       Inactive      Inactive

       

        --Active Current 称之为在一个循环周期之内 ( 按顺序写日志 )

        --Inactive 称为一个周期之外 ( 一个新的循环 )

        -- 新一轮循环开始如在归档状态则先归档再清空,否则直接清空日志

        -- 数据库启动时 Active Current 状态的日志不能丢失,否则出错

       

    14. 日志的监视

        查看日志视图中的物理日志文件是否存在、位置、大小等

            SELECT 'ho cp ' || member FROM v$logfile ;

        查看日志文件所处的磁盘空间是否足够

            SQL > ho df - h

        查看组内是否存在多个成员,如为单一成员应考虑增加日志成员

        日志切换的间隔时间,应满足 15 - 20 分钟业务需求,如果切换间隔很短,应当增加日志文件的大小

            增加方法,先删除日志组,再重建该组 ( 对于 current active 的需要切换再做处理 )

 

        -- 查看切换时间间隔 ( 下面的示例中为手工切换的时间,不作考虑 )

        SQL > SELECT TO_CHAR ( first_time , 'yyyy-mm-dd hh24:mi:ss' ), group# FROM v$log ;

   

        TO_CHAR ( FIRST_TIME ,      GROUP#

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

        2010 - 07 - 20 09 : 43 : 18           1

        2010 - 07 - 19 22 : 44 : 30           2

        2010 - 07 - 19 22 : 44 : 32           3          

       

    15. 日志的异常处理 ( 参照演示中 9 小节 )

        不一致的情况 ( 启动时 )

            ALTER DATABASE CLEAR LOGFILE GROUP n

            ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP n

           

三、与日志有关的动态性能视图

        V$LOG

        V$LOGFILE

       

        V$LOG STATUS 的状态值

            UNUSED : 从未对该联机日志写入任何内容,一般为新增加联机日志文件或是使用 resetlog 后的状态

            CURRENT :当前重做日志文件,表示该重做日志文件为活动状态,能够被打开和关闭

            ACTIVE :处于活动状态,不属于当前日志,崩溃恢复需要该状态,可用于块恢复,可能归档,也可能未归档

            CLEARING :表示在执行 alter database clear logfile 命令后正将该日志重建为一个空日志,重建后状态变为 unused

            CLEARING_CURRENT : 当前日志处于关闭线程的清除状态。如日志某些故障或写入新日志标头时发生 I / O 错误

            INACTIVE : 实例恢复不在需要联机重做文件日志组,可能归档也可能未归档

           

        V$LOGFILE STATUS 的状态值

            INVALID : 表明该文件不可访问

            STALE : 表明文件内容不完全

            DELETED : 表明该文件不再使用

            NULL :表明文件正在使用

 

四、演示

    --1. 查看当前数据库的日志

        SQL > SELECT * FROM v$log ;

 

            GROUP#     THREAD#   SEQUENCE#       BYTES     MEMBERS ARC STATUS            FIRST_CHANGE# FIRST_TIM

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

                  1           1           5    52428800           1 NO   CURRENT                 2758062 19 - JUL - 10

                  2           1           3    52428800           2 YES INACTIVE                2695010 16 - JUL - 10

                  3           1           4   104857600           2 YES INACTIVE                2716552 18 - JUL - 10

                 

 

        SQL > SELECT * FROM v$logfile ORDER BY group# ;   

 

            GROUP# STATUS   TYPE     MEMBER                                                   IS_

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

                  1          ONLINE   / u01 / app / oracle / oradata / orcl / redo01 . log                  NO

                  2 STALE    ONLINE   / u01 / app / oracle / oradata / orcl / redo02 . log                  NO

                  2 STALE    ONLINE   / u01 / app / oracle / oradata / orcl / redo2 . log                   NO

                  3 STALE    ONLINE   / u01 / app / oracle / oradata / orcl / redo03 . log                  NO

                  3 STALE    ONLINE   / u01 / app / oracle / oradata / orcl / redo3 . log                   NO   

                 

    --2. 添加日志组

        SQL > SELECT * FROM v$logfile ;

 

            GROUP# STATUS   TYPE     MEMBER                                                   IS_

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

                  2 STALE    ONLINE   / u01 / app / oracle / oradata / orcl / redo2 . log                   NO

                  2 STALE    ONLINE   / u01 / app / oracle / oradata / orcl / redo02 . log                  NO

                  1          ONLINE   / u01 / app / oracle / oradata / orcl / redo01 . log                  NO

                  3 STALE    ONLINE   / u01 / app / oracle / oradata / orcl / redo3 . log                   NO

                  3 STALE    ONLINE   / u01 / app / oracle / oradata / orcl / redo03 . log                  NO

                  4          ONLINE   / u01 / app / oracle / oradata / orcl / redo4 . log                   NO

                  4          ONLINE   / u01 / app / oracle / oradata / orcl / redo04 . log                  NO

                 

    --3. 添加日志成员

        SQL > ALTER DATABASE ADD LOGFILE MEMBER '/u01/app/oracle/oradata/orcl/redo1.log' TO GROUP 1 ;

 

        Database altered .

 

        SQL > SELECT * FROM v$logfile WHERE group# = 1 ;

 

            GROUP# STATUS   TYPE     MEMBER                                                    IS_

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

                  1          ONLINE   / u01 / app / oracle / oradata / orcl / redo01 . log                  NO

                  1 INVALID ONLINE   / u01 / app / oracle / oradata / orcl / redo1 . log                   NO

                 

    --4. 删除日志成员

        SQL > ALTER DATABASE DROP LOGFILE MEMBER '/u01/app/oracle/oradata/orcl/redo01.log' ;

        ALTER DATABASE DROP LOGFILE MEMBER '/u01/app/oracle/oradata/orcl/redo01.log'

        *

        ERROR at line 1 :   --redo01.log 处于 NULL 状态且该日志组为 current 状态不能删除

        ORA - 00362 : member is required to form a valid logfile in group 1

        ORA - 01517 : log member : '/u01/app/oracle/oradata/orcl/redo01.log'

 

 

        SQL > ALTER DATABASE DROP LOGFILE MEMBER '/u01/app/oracle/oradata/orcl/redo04.log' ;

 

        Database altered .

 

        SQL >   ALTER DATABASE DROP LOGFILE MEMBER '/u01/app/oracle/oradata/orcl/redo4.log' ;

          ALTER DATABASE DROP LOGFILE MEMBER '/u01/app/oracle/oradata/orcl/redo4.log'

        *

        ERROR at line 1 :    -- 最后一个日志成员不能被删除

        ORA - 00361 : cannot remove last log member / u01 / app / oracle / oradata / orcl / redo4 . log for group 4

 

    --5. 日志切换

        SQL > SELECT * FROM v$log ;   -- 当前的日志组处于 CURRENT 状态

 

            GROUP#     THREAD#   SEQUENCE#       BYTES     MEMBERS ARC STATUS            FIRST_CHANGE# FIRST_TIM

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

                  1           1           5    52428800           2 NO   CURRENT                 2758062 19 - JUL - 10

                  2           1           3    52428800            2 YES INACTIVE                2695010 16 - JUL - 10

                  3           1           4   104857600           2 YES INACTIVE                2716552 18 - JUL - 10

                  4           1           0    31457280           1 YES UNUSED                        0

 

        SQL > ALTER SYSTEM SWITCH LOGFILE ;   -- 进行日志切换

 

        System altered .

 

        SQL > SELECT * FROM v$log ;     -- 原来的日志组 4 unused 状态变为 current 状态

 

            GROUP#     THREAD#   SEQUENCE#       BYTES     MEMBERS ARC STATUS            FIRST_CHANGE# FIRST_TIM

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

                  1           1           5    52428800           2 YES ACTIVE                  2758062 19 - JUL - 10

                  2           1           3    52428800           2 YES INACTIVE                2695010 16 - JUL - 10

                  3            1           4   104857600           2 YES INACTIVE                2716552 18 - JUL - 10

                  4           1           6    31457280           1 NO   CURRENT                 2759277 19 - JUL - 10

 

        SQL > ALTER SYSTEM SWITCH LOGFILE ;    -- 再次进行日志切换

 

        System altered .

 

        SQL > SELECT * FROM v$log ;           -- 日志组 1 变为 current 且组 4 变为 active 状态

 

            GROUP#     THREAD#   SEQUENCE#       BYTES     MEMBERS ARC STATUS            FIRST_CHANGE# FIRST_TIM

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

                  1           1           5    52428800           2 YES ACTIVE                  2758062 19 - JUL - 10

                  2           1           7    52428800           2 NO   CURRENT                 2759293 19 - JUL - 10

                  3           1            4   104857600           2 YES INACTIVE                2716552 18 - JUL - 10

                  4           1           6    31457280           1 YES ACTIVE                  2759277 19 - JUL - 10        

 

    由上可得知,在日志切换时对于 unused 组将优先作为下一组切换对象

        -- 再次删除 redo01.log 还是收到错误提示

        SQL > ALTER DATABASE DROP LOGFILE MEMBER '/u01/app/oracle/oradata/orcl/redo01.log' ;

        ALTER DATABASE DROP LOGFILE MEMBER '/u01/app/oracle/oradata/orcl/redo01.log'

        *

        ERROR at line 1 :

        ORA - 00362 : member is required to form a valid logfile in group 1

        ORA - 01517 : log member : '/u01/app/oracle/oradata/orcl/redo01.log'

 

        SQL > ALTER SYSTEM SWITCH LOGFILE ;   -- 再次进行日志切换

 

        System altered .

 

        SQL > SELECT * FROM v$log ;           --group1 变为 inactive

 

            GROUP#     THREAD#   SEQUENCE#       BYTES     MEMBERS ARC STATUS            FIRST_CHANGE# FIRST_TIM

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

                  1           1           5    52428800           2 YES INACTIVE                2758062 19 - JUL - 10

                  2           1           7    52428800           2 YES ACTIVE                  2759293 19 - JUL - 10

                  3           1           8   104857600           2 NO   CURRENT                 2759420 19 - JUL - 10

                  4           1           6    31457280           1 YES INACTIVE                2759277 19 - JUL - 10

 

        -- 反复多切几次日志之后 redo01.log 被成功删除      

        SQL >   ALTER DATABASE DROP LOGFILE MEMBER '/u01/app/oracle/oradata/orcl/redo01.log' ;

 

    Database altered .

         

    --6. 删除日志组 (CURRENT ACTIVE 状态的不能被删除 )

        SQL > SELECT * FROM v$log ;

 

            GROUP#     THREAD#   SEQUENCE#       BYTES     MEMBERS ARC STATUS            FIRST_CHANGE# FIRST_TIM

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

                  1           1           9    52428800           1 YES ACTIVE                  2759487 19 - JUL - 10

                  2           1          11    52428800           2 NO   CURRENT                 2759502 19 - JUL - 10

                  3           1           8   104857600           2 YES ACTIVE                  2759420 19 - JUL - 10

                  4           1          10    31457280           1 YES ACTIVE                  2759499 19 - JUL - 10

                 

        SQL > ALTER DATABASE DROP LOGFILE GROUP 4 ;

        ALTER DATABASE DROP LOGFILE GROUP 4

        *

        ERROR at line 1 :    -- 处于活动状态的 group4 用于灾难恢复,不能被删除

        ORA - 01624 : log 4 needed for crash recovery of instance orcl ( thread 1 )

        ORA - 00312 : online log 4 thread 1 : '/u01/app/oracle/oradata/orcl/redo4.log'

 

        SQL > ALTER SYSTEM SWITCH LOGFILE ;    -- 进行日志切换

 

        System altered .

 

        SQL > /

 

        System altered .

 

        SQL > SELECT * FROM v$log ;      --group 4 的状态变为 inactvie

 

            GROUP#     THREAD#   SEQUENCE#       BYTES     MEMBERS ARC STATUS            FIRST_CHANGE# FIRST_TIM

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

                  1           1          13    52428800           1 NO   CURRENT                 2759720 19 - JUL - 10

                  2           1          11    52428800           2 YES ACTIVE                  2759502 19 - JUL - 10

                  3           1          12   104857600           2 YES ACTIVE                  2759718 19 - JUL - 10

                  4           1          10    31457280           1 YES INACTIVE                2759499 19 - JUL - 10

 

        SQL > ALTER DATABASE DROP LOGFILE GROUP 4 ;    -- 成功删除 group 4

 

        Database altered .

 

        SQL > ho ls / u01 / app / oracle / oradata / orcl / redo *

        / u01 / app / oracle / oradata / orcl / redo01 . log   / u01 / app / oracle / oradata / orcl / redo1 . log

        / u01 / app / oracle / oradata / orcl / redo02 . log   / u01 / app / oracle / oradata / orcl / redo2 . log

        / u01 / app / oracle / oradata / orcl / redo03 . log   / u01 / app / oracle / oradata / orcl / redo3 . log

        / u01 / app / oracle / oradata / orcl / redo04 . log   / u01 / app / oracle / oradata / orcl / redo4 . log

 

        SQL > ho rm / u01 / app / oracle / oradata / orcl / redo04 . log    -- 删除物理文件

 

        SQL > ho rm / u01 / app / oracle / oradata / orcl / redo4 . log     -- 删除物理文件

 

    --7. 日志的重定位及重命名 ( 仅演示 ALTER DATABASE RENAME FILE 命令 )

        SQL > SELECT name , log_mode FROM v$database ;

 

        NAME       LOG_MODE

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

        ORCL       ARCHIVELOG

 

        SQL > SELECT * FROM v$logfile ORDER BY group# ;

 

            GROUP# STATUS   TYPE     MEMBER                                                   IS_

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

                  1          ONLINE   / u01 / app / oracle / oradata / orcl / redo01 . log                  NO

                  2           ONLINE   / u01 / app / oracle / oradata / orcl / redo02 . log                  NO

                  2          ONLINE   / u01 / app / oracle / oradata / orcl / redo2 . log                   NO

                  3 STALE    ONLINE   / u01 / app / oracle / oradata / orcl / redo03 . log                  NO

                  3 STALE    ONLINE   / u01 / app / oracle / oradata / orcl / redo3 . log                   NO

 

        SQL > ho cp / u01 / app / oracle / oradata / orcl / redo01 . log / u01 / app / oracle / oradata / redo01 . rdo       

 

        SQL > ALTER DATABASE RENAME FILE '/u01/app/oracle/oradata/orcl/redo01.log'

          2     TO '/u01/app/oracle/oradata/redo01.rdo' ;

 

        Database altered .

 

        SQL > SELECT * FROM v$logfile WHERE group# = 1 ;

 

            GROUP# STATUS   TYPE     MEMBER                                                   IS_

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

                  1          ONLINE   / u01 / app / oracle / oradata / redo01 . rdo                       NO

       

 

    --8. 清空日志文件组 ( 只有非 active 和非 current 状态的组才能被清空 )

        SQL > SELECT * FROM v$log ;

 

            GROUP#     THREAD#   SEQUENCE#       BYTES     MEMBERS ARC STATUS            FIRST_CHANGE# FIRST_TIM

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

                  1           1          13    52428800           1 YES ACTIVE                   2759720 19 - JUL - 10

                  2           1          14    52428800           2 NO   CURRENT                 2761383 19 - JUL - 10

                  3           1          12   104857600           2 YES INACTIVE                2759718 19 - JUL - 10

                 

        SQL > ALTER DATABASE CLEAR LOGFILE GROUP 1 ;

        ALTER DATABASE CLEAR LOGFILE GROUP 1

        *

        ERROR at line 1 :      --active 状态不能被清空

        ORA - 01624 : log 1 needed for crash recovery of instance orcl ( thread 1 )

        ORA - 00312 : online log 1 thread 1 : '/u01/app/oracle/oradata/redo1.rdo'

 

        SQL >   ALTER DATABASE CLEAR LOGFILE GROUP 2 ;

          ALTER DATABASE CLEAR LOGFILE GROUP 2

        *

        ERROR at line 1 :     --current 状态不能被清空

        ORA - 01624 : log 2 needed for crash recovery of instance orcl ( thread 1 )

        ORA - 00312 : online log 2 thread 1 : '/u01/app/oracle/oradata/orcl/redo2.log'

        ORA - 00312 : online log 2 thread 1 : '/u01/app/oracle/oradata/orcl/redo02.log'

 

 

        SQL >   ALTER DATABASE CLEAR LOGFILE GROUP 3 ;

 

        Database altered .

 

 

        SQL > SELECT * FROM v$log ;    --group 3 被清空后状态变为 unused

 

            GROUP#     THREAD#   SEQUENCE#        BYTES     MEMBERS ARC STATUS            FIRST_CHANGE# FIRST_TIM

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

                  1           1          13    52428800           1 YES INACTIVE                2759720 19 - JUL - 10

                  2           1          14    52428800           2 NO   CURRENT                 2761383 19 - JUL - 10

                  3           1           0   104857600           2 YES UNUSED                  2759718 19 - JUL - 10

             

    --9. 日志异常处理

        -- 启动时提示日志不一致

        SQL > startup

        ORACLE instance started .

 

        Total System Global Area   251658240 bytes

        Fixed Size                   1218796 bytes

        Variable Size               83887892 bytes

        Database Buffers           163577856 bytes

        Redo Buffers                 2973696 bytes

        Database mounted .

        ORA - 00341 : log 1 of thread 1 , wrong log # in header

        ORA - 00312:online log 1 thread 1 : '/u01/app/oracle/oradata/orcl/redo1a.rdo'   

        ORA - 00312:online log 1 thread 1 : '/u01/app/oracle/oradata/orcl/redo1b.rdo'

 

        SQL > ALTER DATABASE CLEAR LOGFILE GROUP 1 ;

 

        Database altered .

 

        SQL > ALTER DATABASE OPEN ;

 

        Database opened .

 

        -- 日志文件丢失 ( current 状态日志组 )

        SQL > startup

        ORACLE instance started .

 

        Total System Global Area   251658240 bytes

        Fixed Size                   1218796 bytes

        Variable Size               88082196 bytes

        Database Buffers           159383552 bytes

        Redo Buffers                 2973696 bytes

        Database mounted .

        ORA - 00313 : open failed for members of log group 1 of thread 1

        ORA - 00312 : online log 1 thread 1 : '/u01/app/oracle/oradata/orcl/redo1a.rdo'

        ORA - 00312 : online log 1 thread 1 : '/u01/app/oracle/oradata/orcl/redo1b.rdo'

 

        SQL > ALTER DATABASE CLEAR LOGFILE GROUP 1 ;

 

        Database altered .

 

        SQL > ALTER DATABASE OPEN ;

 

        Database altered .

 

        -- 日志文件丢失 (current 状态日志组 )

        SQL > startup

        ORACLE instance started .

 

        Total System Global Area   251658240 bytes

        Fixed Size                   1218796 bytes

        Variable Size               83887892 bytes

        Database Buffers           163577856 bytes

        Redo Buffers                 2973696 bytes

        Database mounted .

        ORA - 00313 : open failed for members of log group 3 of thread 1

        ORA - 00312 : online log 3 thread 1 : '/u01/app/oracle/oradata/orcl/redo3a.rdo'

        ORA - 00312 : online log 3 thread 1 : '/u01/app/oracle/oradata/orcl/redo3b.rdo'

 

        -- 查看告警日志

        SQL > ho tail - n 30 / u01 / app / oracle / admin / orcl / bdump / alert_orcl . log

        ORA - 27037 : unable to obtain file status

        Linux Error : 2 : No such file or directory

        Additional information : 3

        ORA - 00312 : online log 3 thread 1 : '/u01/app/oracle/oradata/orcl/redo3a.rdo'

        ORA - 27037 : unable to obtain file status

        Linux Error : 2 : No such file or directory

        Additional information : 3

        Tue Jul 20 10 : 45 : 58 2010

        Errors in file / u01 / app / oracle / admin / orcl / bdump / orcl_lgwr_4112 . trc :

        ORA - 00313 : open failed for members of log group 3 of thread 1

        ORA - 00312 : online log 3 thread 1 : '/u01/app/oracle/oradata/orcl/redo3b.rdo'

        ORA - 27037 : unable to obtain file status

        Linux Error : 2 : No such file or directory

        Additional information : 3

        ORA - 00312 : online log 3 thread 1 : '/u01/app/oracle/oradata/orcl/redo3a.rdo'

        ORA - 27037 : unable to obtain file status

        Linux Error : 2 : No such file or directory

        Additional information : 3

        Tue Jul 20 10 : 45 : 58 2010

        ARC0 : STARTING ARCH PROCESSES

        Tue Jul 20 10 : 45 : 58 2010

        ARC1 : Becoming the 'no FAL' ARCH

        ARC1 : Becoming the 'no SRL' ARCH

        Tue Jul 20 10 : 45 : 58 2010

        ARC2 : Archival started

        ARC0 : STARTING ARCH PROCESSES COMPLETE

        ARC0 : Becoming the heartbeat ARCH

        ARC2 started with pid = 18 , OS id = 4137

        Tue Jul 20 10 : 45 : 58 2010

        ORA - 313 signalled during : ALTER DATABASE OPEN ...

       

        -- 查看物理日志文件是否存在

        SQL > ho ls / u01 / app / oracle / oradata / orcl / redo3a . rdo

        ls : / u01 / app / oracle / oradata / orcl / redo3a . rdo : No such file or directory

 

        SQL > ho ls / u01 / app / oracle / oradata / orcl / redo3b . rdo

        ls : / u01 / app / oracle / oradata / orcl / redo3b . rdo : No such file or directory

       

-- 尝试使用清空日志组命令

        SQL > ALTER DATABASE CLEAR LOGFILE GROUP 3 ;

        ALTER DATABASE CLEAR LOGFILE GROUP 3

        *

        ERROR at line 1 :    -- 系统处于非归档模式,且 group 3 状态为 CURRENT

        ORA - 00350 : log 3 of instance orcl ( thread 1 ) needs to be archived

        ORA - 00312 : online log 3 thread 1 : '/u01/app/oracle/oradata/orcl/redo3a.rdo'

        ORA - 00312 : online log 3 thread 1 : '/u01/app/oracle/oradata/orcl/redo3b.rdo'

 

        -- 尝试使用不归档清空日志

        SQL > ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP 3 ;

        ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP 3

        *

        ERROR at line 1 :   

        ORA - 00313 : open failed for members of log group 3 of thread 1

        ORA - 00312 : online log 3 thread 1 : '/u01/app/oracle/oradata/orcl/redo3b.rdo'

        ORA - 27037 : unable to obtain file status

        Linux Error : 2 : No such file or directory

        Additional information : 3

        ORA - 00312 : online log 3 thread 1 : '/u01/app/oracle/oradata/orcl/redo3a.rdo'

        ORA - 27037 : unable to obtain file status

        Linux Error : 2 : No such file or directory

        Additional information : 3

 

        -- 使用带控制文件的介质恢复

        SQL > RECOVER DATABASE USING BACKUP CONTROLFILE ;

        ORA - 00279 : change 2835232 generated at 07 / 20 / 2010 10 : 40 : 23 needed for thread 1

        ORA - 00289 : suggestion : / u01 / app / oracle / flash_recovery_area / ORCL / archivelog / 2010_07_20 / o1_mf_1_39_ % u_ . arc

        ORA - 00280 : change 2835232 for thread 1 is in sequence #39

 

 

        Specify log : {< RET >= suggested | filename | AUTO | CANCEL}

 

        ORA - 00308 : cannot open archived log '/u01/app/oracle/flash_recovery_area/ORCL/archivelog/2010_07_20/o1_mf_1_39_%u_.arc'

        ORA - 27037 : unable to obtain file status

        Linux Error : 2 : No such file or directory

        Additional information : 3

 

        -- 使用 resetlogs 选项打开数据库

        SQL > ALTER DATABASE OPEN RESETLOGS ;

 

        Database altered .       

 

        SQL > SELECT * FROM v$log ;    -- 系统重建 group 3

 

            GROUP#     THREAD#   SEQUENCE#       BYTES     MEMBERS ARC STATUS            FIRST_CHANGE# FIRST_TIM

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

                  1           1           2    31457280           2 NO   CURRENT                 2835234 20 - JUL - 10

                  2           1           1    31457280           2 YES INACTIVE                2835233 20 - JUL - 10

                  3           1           0    31457280           2 YES UNUSED                        0           

                 

        SQL > SELECT * FROM v$logfile ;    -- group 3 增加了两个成员 redo3a.rdo redo3b.rdo   

 

            GROUP# STATUS   TYPE     MEMBER                                                    IS_

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

                  2          ONLINE   / u01 / app / oracle / oradata / orcl / redo2a . rdo                  NO

                  2          ONLINE   / u01 / app / oracle / oradata / orcl / redo2b . rdo                  NO

                  1          ONLINE   / u01 / app / oracle / oradata / orcl / redo1a . rdo                  NO

                  3          ONLINE   / u01 / app / oracle / oradata / orcl / redo3a . rdo                  NO

                  3          ONLINE   / u01 / app / oracle / oradata / orcl / redo3b . rdo                  NO

                  1          ONLINE   / u01 / app / oracle / oradata / orcl / redo1b . rdo                  NO       

 

        对于 CURRENT 组的也可以使用隐藏参数来解决

        步骤:

            alter system set "_allow_resetlogs_corruption" = true scope = spfile ;

           

            recover database using bakcup controlfile ;

           

            alter database open resetlogs ;

           

            shutdown immediate ;

           

            startup mount ;

           

            alter database open resetlogs ;

           

            alter system reset "_allow_resetlogs_corruption" scope = spfile sid = '*'

   

        对于归档模式下的日志文件丢失,同样可以按上述步骤处理

       

五、更多

 

Oracle 参数文件

 

SQL 基础--> 层次化查询(START BY ... CONNECT BY PRIOR)

 

Oracle 用户、对象权限、系统权限

 

Oracle 角色、配置文件

 

SQL 基础--> 集合运算(UNION 与UNION ALL)

Oracle 联机重做日志文件(ONLINE LOG FILE)


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论