redo日志文件丢失分情况恢复

redo日志文件丢失恢复

Redo日志文件分为在线Redo日志文件和归档Redo日志文件。rman只会备份归档Redo日志文件,不会备份在线Redo日志文件。
如果在线Redo日志损坏,那么需要分情况进行恢复:

第一种 :inactive redo异常ORA-00316 ORA-00327 ,执行命令重建
ALTER DATABASE CLEAR LOGFILE GROUP 1;

操作步骤如下:
1、查看redo日志文件前状态:

SQL> select * from v$log;
    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE	  MEMBERS ARC STATUS	       FIRST_CHANGE# FIRST_TIM CON_ID

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

 1	    1	       1  209715200	   512		1 YES INACTIVE		     5238153 15-MAR-22      0
 2	    1	       2  209715200	   512		1 NO  CURRENT		     5348030 17-MAR-22      0
 3	    1	       0  209715200	   512		1 YES UNUSED			   0		      0

2、删除redo日志文件组1(模拟丢失):

rm -f /u01/app/oracle/oradata/CDB1/redo01.log

3、用CLEAR命令重建该日志文件(mount状态下执行)

SQL>alter database clear logfile group 1; 

如果是该日志组还没有归档,则需要用

SQL>alter database clear unarchived logfile group 1; 

4、打开数据库,重新备份数据库

SQL>alter database open; 
第二种:正常关闭数据库ACTIVE、current redo异常ORA-00316 ORA-01623

I redo日志ACTIVE状态,构造数据,切换日志:

SQL> create table test01 as select * from dba_tables;

SQL> insert into test01 value select * from dba_tables;
2180 rows created.

SQL> insert into test01 value select * from test01;
8719 rows created.

SQL> alter system switch logfile;

模拟文件丢失:删除日志组1的文件

rm -f  /u01/app/oracle/oradata/CDB1/redo01.log

查看日志文件状态为ARC,表示已归档,尝试用

SQL>alter database clear logfile group 1; 

SQL>alter database open;

*语句使用说明:
如果损坏的重做日志文件尚未归档,请在语句中使用 UNARCHIVED 关键字。

ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP 3;

此语句清除损坏的重做日志并避免归档它们。清除的重做日志即使没有存档也可以使用
如果清除备份恢复所需的日志文件,则无法再从该备份恢复。数据库在警报日志中写入一条消息,描述您无法从中恢复的备份

II redo日志CURRENT状态,删除current redo日志文件(构造文件丢失):

SQL> ! rm -f  /u01/app/oracle/oradata/CDB1/redo02.log

startup打开数据库日志报错:

ORA-00313: open failed for members of log group 2 of thread 1
ORA-00312: online log 2 thread 1: '/u01/app/oracle/oradata/CDB1/redo02.log'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory

查看日志状态:

SQL> select * from v$log;
    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE	  MEMBERS ARC STATUS	      

---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- --
 1	    1	      23  209715200	   512		1 YES INACTIVE		
 3	    1	      24  209715200	   512		1 YES INACTIVE		
 2	    1	      25  209715200	   512		1 NO  CURRENT	

清除重建日志文件(提示需要归档):

SQL> alter database clear logfile group 2;
alter database clear logfile group 2
*
ERROR at line 1:
ORA-00350: log 2 of instance cdb1 (thread 1) needs to be archived
ORA-00312: online log 2 thread 1: '/u01/app/oracle/oradata/CDB1/redo02.log'

清除未归档重建日志文件

SQL> alter database clear unarchived logfile group 2;
Database altered.

SQL> alter database open;
Database altered.
第三种:数据库异常关闭current/active redo异常ORA-00316 ORA-01624 ORA-01194

I 模拟active redo丢失异常关闭

删除active redo日志文件(构造文件丢失)

SQL>  ! rm -f  /u01/app/oracle/oradata/CDB1/redo02.log
SQL> select group#,members,sequence#,archived,status from v$log;
GROUP#    MEMBERS  SEQUENCE# ARC STATUS
 1	    1	      26 YES ACTIVE
 2	    1	      27 YES ACTIVE
 3	    1	      28 NO  CURRENT

强制关闭数据库

SQL> shutdown abort
ORACLE instance shut down.

打开数据库到mount状态,重建恢复第二组redo日志失效

SQL> startup mount;

SQL> alter database clear logfile group 2;
alter database clear logfile group 2
*
ERROR at line 1:
ORA-01624: log 2 needed for crash recovery of instance cdb1 (thread 1)
ORA-00312: online log 2 thread 1: '/u01/app/oracle/oradata/CDB1/redo02.log'

SQL> alter database clear unarchived logfile group 2;
alter database clear unarchived logfile group 2
*
ERROR at line 1:
ORA-01624: log 2 needed for crash recovery of instance cdb1 (thread 1)
ORA-00312: online log 2 thread 1: '/u01/app/oracle/oradata/CDB1/redo02.log'

尝试不完全恢复,输入sequence #28对应日志位置

SQL> recover database until cancel
ORA-00279: change 5471839 generated at 03/22/2022 17:23:49 needed for thread 1
ORA-00289: suggestion : /u02/oradata/CDB1/archivelog/2022_03_22/o1_mf_1_28_%u_.arc
ORA-00280: change 5471839 for thread 1 is in sequence #28

--sequence #28对应日志组3

GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE	  MEMBERS ARC STATUS	       

 1	    1	      26  209715200	   512		1 YES ACTIVE		
 3	    1	      28  209715200	   512		1 NO  CURRENT		
 2	    1	      27  209715200	   512		1 YES ACTIVE		

Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
/u01/app/oracle/oradata/CDB1/redo03.log      ---输入日志组3位置
Log applied.
Media recovery complete.

打开数据库,resetlogs重置日志

SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open


SQL> alter database open resetlogs;
Database altered.

II 模拟current redo丢失异常关闭

慎用,不到万不得已不要开这个参数allow_resetlogs_corruption,尝试不一致情况下开启数据库

alter system set "_allow_resetlogs_corruption"=true scope=spfile;
recover database until cancel;                 --此步骤输入cancel
alter database open resetlogs;
startup force mount
alter database open resetlogs;
alter system set "_allow_resetlogs_corruption"=false scope=spfile;
alter system reset "_allow_resetlogs_corruption" scope=spfile sid='*';
shutdown immediate
startup

开启后,最好通过expdp进行逻辑的导出再导入

当然,rman备份也是不可少的

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值