Oracle redo log 删除后处理方法

本文介绍了在Oracle数据库中redo log意外删除后的处理方法,包括shutdown immediate时的数据安全性和数据库open时的不同处理方案,如非当前日志和当前日志被删除的应对策略,以及实例可用时的数据导出解决方案。


在生产中,难免碰到各种场景。下面记录一下redo log被删除掉的处理方法。

数据库版本:

SQL> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
PL/SQL Release 11.2.0.3.0 - Production
CORE    11.2.0.3.0      Production
TNS for Linux: Version 11.2.0.3.0 - Production
NLSRTL Version 11.2.0.3.0 - Production

一、shutdow immediate情况下被删除redo

这种情况下最容易处理,数据完全不会丢失。

SQL> startup mount;
ORACLE instance started.

Total System Global Area 1887350784 bytes
Fixed Size                  2229464 bytes
Variable Size            1207962408 bytes
Database Buffers          671088640 bytes
Redo Buffers                6070272 bytes
Database mounted.

SQL> recover database until cancel;
Media recovery complete.
SQL> alter database open resetlogs;

Database altered.
open的时候需要resetlogs,open之后,立刻做一次全库备份。

二、数据库open的情况下被删除redo

打开情况下分两种情况,即当前日志被删除和非当前日志被删除。

1、非当前日志被删除

SQL>  select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME      NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------------- ------------ ---------------
         1          1          1   52428800        512          1 YES INACTIVE              10452067 21-MAR-13           10454522 21-MAR-13
         2          1          2   52428800        512          1 YES INACTIVE              10454522 21-MAR-13           10455156 21-MAR-13
         3          1          3   52428800        512          1 NO  CURRENT               10455156 21-MAR-13         2.8147E+14

SQL> alter database clear logfile group 2;

Database altered.

SQL> shutdown immediate

SQL> startup
ORACLE instance started.

Total System Global Area 1887350784 bytes
Fixed Size                  2229464 bytes
Variable Size             452987688 bytes
Database Buffers         1426063360 bytes
Redo Buffers                6070272 bytes
Database mounted.
Database opened.
上例中删除掉的redo是group2,是已经归档了,并且status为INACTIVE,才能clear成功。

如果是还没有归档,语句则不一样:

SQL> alter database clear unarchived logfile group 2;
记得打开数据库后,马上做一次全库备份。

2、当前日志被删除

分实例可用和实例不可用两种情况

①数据库实例可用,直接用expdp导出数据

SQL> conn liujie/oracle
Connected.

SQL>  insert into t6 select * from t6;

1209264 rows created.

SQL> select count(*) from t6;

  COUNT(*)
----------
   2418528
SQL> commit;

Commit complete.

打开另一个终端,
SQL> conn / as sysdba;
Connected.

SQL> select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME      NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------------- ------------ ---------------
         1          1          7   52428800        512          1 NO  CURRENT               10513263 22-MAR-13         2.8147E+14
         2          1          5   52428800        512          1 YES INACTIVE              10510895 22-MAR-13           10511610 22-MAR-13
         3          1          6   52428800        512          1 YES INACTIVE              10511610 22-MAR-13           10513263 22-MAR-13

SQL> select * from v$logfile;

    GROUP# STATUS  TYPE    MEMBER                                   IS_
---------- ------- ------- ---------------------------------------- ---
         3         ONLINE  /data/oracle/oradata/uldw/redo03.log     NO
         2         ONLINE  /data/oracle/oradata/uldw/redo02.log     NO
         1         ONLINE  /data/oracle/oradata/uldw/redo01.log     NO

删除掉所有日志

oracle@wls113:~>rm /data/oracle/oradata/uldw/redo01.log
oracle@wls113:~>rm /data/oracle/oradata/uldw/redo02.log
oracle@wls113:~>rm /data/oracle/oradata/uldw/redo03.log

此时在数据库里再次插入数据

SQL> insert into t4 select * from t4;

75579 rows created.

SQL> commit;

Commit complete.

SQL> select count(*) from t4;

  COUNT(*)
----------
    151158

此时如果实例可用,千万不要shutdown数据库,而是直接用expdp导出数据

oracle@wls113:/data/oracle/dump> expdp system directory=dump_dir dumpfile=liujie02.dmp schemas=liujie;

Export: Release 11.2.0.3.0 - Production on Fri Mar 22 09:57:07 2013

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.
Password: 

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
FLASHBACK automatically enabled to preserve database integrity.
Starting "SYSTEM"."SYS_EXPORT_SCHEMA_01":  system/******** directory=dump_dir dumpfile=liujie02.dmp schemas=liujie 
Estimate in progress using BLOCKS method...
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
Total estimation using BLOCKS method: 676.9 MB
Processing object type SCHEMA_EXPORT/USER
Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
Processing object type SCHEMA_EXPORT/ROLE_GRANT
Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/COMMENT
Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type SCHEMA_EXPORT/MATERIALIZED_VIEW
. . exported "LIUJIE"."T7"                               317.8 MB 3378528 rows
. . exported "LIUJIE"."T6"                               233.9 MB 2418528 rows
. . exported "LIUJIE"."T4"                               14.62 MB  151158 rows
. . exported "LIUJIE"."T1"                               7.315 MB   75579 rows
. . exported "LIUJIE"."T5"                               7.315 MB   75579 rows
. . exported "LIUJIE"."T3"                               99.04 KB    1000 rows
. . exported "LIUJIE"."MV1"                              6.445 KB       7 rows
. . exported "LIUJIE"."TEST1"                            5.062 KB       3 rows
. . exported "LIUJIE"."T2"                                   0 KB       0 rows
Master table "SYSTEM"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded
******************************************************************************
Dump file set for SYSTEM.SYS_EXPORT_SCHEMA_01 is:
  /data/oracle/dump/liujie02.dmp
Job "SYSTEM"."SYS_EXPORT_SCHEMA_01" successfully completed at 09:57:56
此时只要是commit的数据,在实例可用的情况下,都可以用expdp导出来。

这个时候数据库已经损坏掉,需要关闭数据库,然后重建数据库,把dump文件导入即可恢复数据。


②数据库实例不可用

SQL> conn liujie/oracle
Connected.
SQL> insert into t6 select * from t6;

604632 rows created.

SQL> select count(*) from t6;

  COUNT(*)
----------
   1209264
//未提交

打开另一个终端,
SQL> conn / as sysdba;
Connected.

SQL> select * from v$logfile;

    GROUP# STATUS  TYPE    MEMBER                                             IS_
---------- ------- ------- -------------------------------------------------- ---
         3         ONLINE  /data/oracle/oradata/uldw/redo03.log               NO
         2         ONLINE  /data/oracle/oradata/uldw/redo02.log               NO
         1         ONLINE  /data/oracle/oradata/uldw/redo01.log               NO


SQL> select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME      NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------------- ------------ ---------------
         1          1         23   52428800        512          1 YES ACTIVE                10499875 21-MAR-13           10500288 21-MAR-13
         2          1         22   52428800        512          1 YES ACTIVE                10497966 21-MAR-13           10499875 21-MAR-13
         3          1         24   52428800        512          1 NO  CURRENT               10500288 21-MAR-13         2.8147E+14
然后删除掉当前日志
oracle@wls113:~>rm /data/oracle/oradata/uldw/redo03.log
然后关闭数据库,open的时候出错

SQL> startup
ORACLE instance started.

Total System Global Area 1887350784 bytes
Fixed Size                  2229464 bytes
Variable Size             452987688 bytes
Database Buffers         1426063360 bytes
Redo Buffers                6070272 bytes
Database mounted.
ORA-03113: end-of-file on communication channel
Process ID: 32625
Session ID: 853 Serial number: 5

此时可以用数据库之前的备份来做不完全恢复,但是当前日志的数据会丢失掉。

RMAN> startup mount;
RMAN> restore database;
RMAN> recover database until sequence 24;
因为是不完全恢复,open的时候,需要加上resetlogs

SQL> alter database open resetlogs;

Database altered.

SQL> conn liujie 
Enter password: 
Connected.
SQL> select count(*) from t6;

  COUNT(*)
----------
    604632
//最后一个日志的内容丢失,造成数据丢失。



<think>好的,用户想了解如何设置Oracle Redo Log的过期时间。首先,我需要回忆一下OracleRedo Log的管理机制。Redo Log是用于恢复的重要文件,分为在线日志和归档日志。归档日志通常在启用归档模式后生成,而在线日志则是在事务处理中被循环使用。 用户提到的“过期时间”可能指的是归档日志在磁盘上的保留时间。Oracle通过RMAN(恢复管理器)来管理备份和归档日志的保留策略。常见的设置是使用CONFIGURE命令来定义保留策略,比如保留多少天或保留多少份备份。例如,使用`CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;`可以设置保留7天的归档日志,超过这个时间的会被标记为过期,并在RMAN维护时删除。 另外,用户可能混淆了在线Redo Log和归档Redo Log。在线日志不会被设置过期时间,它们由LGWR进程循环写入,当切换日志时,如果之前的日志已经归档(在归档模式下),就会被标记为INACTIVE,否则为ACTIVE或CURRENT状态。而归档日志的过期时间确实是通过保留策略来控制的。 还需要考虑到用户是否启用了归档模式。如果没有启用归档,那么在线日志不会被归档,也就不会产生归档日志,自然也不存在归档日志过期的问题。所以需要确认用户的环境是否在归档模式下运行。 此外,用户可能希望手动删除过期的归档日志,这时候可以使用RMAN命令`DELETE OBSOLETE`来删除过期的备份和归档日志。同时,归档日志的存储位置由参数LOG_ARCHIVE_DEST_n控制,保留策略需要确保这些位置的磁盘空间不被占满,可能需要结合操作系统的定时任务或Oracle的自动管理功能。 还需要注意,如果用户使用的是Oracle 11g,部分隐藏参数可能影响日志管理,但根据参考引用,Oracle11g中没有未归档的隐藏参数,所以主要关注标准配置方法即可。 总结来说,设置归档日志的过期时间主要通过RMAN的保留策略配置,而在线Redo Log的过期时间无法直接设置,它们由日志切换和归档状态决定。需要指导用户正确使用RMAN配置,并确认归档模式是否启用,同时提供相关命令示例和注意事项。</think>在Oracle数据库中,Redo Log的过期时间设置主要与归档日志管理和备份保留策略相关。以下是分步骤说明: ### 1. 设置归档日志保留策略 通过RMAN(Recovery Manager)配置保留策略,控制归档日志在磁盘上的保留时间: ```sql RMAN> CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS; -- 保留7天内恢复所需的日志 ``` 或 ```sql RMAN> CONFIGURE RETENTION POLICY TO REDUNDANCY 3; -- 保留3份备份对应的日志 ``` 此配置会使超过保留窗口的归档日志被标记为"OBSOLETE",可通过`DELETE OBSOLETE`命令清理[^1]。 ### 2. 归档日志自动删除 启用归档日志自动删除策略: ```sql ALTER SYSTEM SET ARCHIVE_LAG_TARGET=1800; -- 设置日志切换时间间隔(单位:秒) ``` 该参数间接影响归档频率,需配合保留策略使用。 ### 3. 手动清理过期日志 通过RMAN命令手动删除过期归档日志: ```sql RMAN> DELETE FORCE NOPROMPT ARCHIVELOG UNTIL TIME 'SYSDATE-7'; -- 删除7天前的归档日志 ``` ### 4. 注意事项 - 必须启用归档模式:`ALTER DATABASE ARCHIVELOG;` - 在线Redo Log没有"过期时间"概念,其状态由日志切换和归档进度决定(`V$LOG.STATUS`) - 归档日志存储位置由参数`LOG_ARCHIVE_DEST_n`控制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值