暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

redo日志文件损坏恢复

Gladlyknow 2019-11-26
1134

        此次实验环境是分别在10g跟11g的环境模拟redo跟undo文件损坏处理方案。

        

  • 10g环境

oracle版本:10.2.0.1.0

操作系统:window

归档模式: 非归档

前期准备:检查所有文件路径位置(redo,datafile,controlfile),复制一份,做个简单的冷备以防万一


  1. 查看redo日志状态.准备将active状态文件破坏.


  1. 手工将redo文件破坏.将redo文件部分内容删除模仿文件损坏.启动库的时候看到报错,此时active状态的redo日志文件已不能被数据库使用。




  2. 生成pfile文件.并将隐含参数注入.准备强制启库.

      _allow_resetlogs_corruption


只需三步启动数据库。


  1. 数据库pfile启动,将_allow_resetlogs_corruption参数加入。----如不加隐含参数,open resetlogs 会提示文件1 需要更多的恢复来保持一致性。

  2. 使用数据库中的命令推进scan号。保持控制文件中的scn号码跟日志文件中的一致。

  3. 使用不一致性开库。跳过数据文件头部scan号码的检测。


  • 步骤一:

sql> create pfile='E:/oracle/pfile.ora' from spfile;

SQL> startup pfile='E:/oracle/pfile.ora';

ORACLE 例程已经启动。


Total System Global Area  293601280 bytes

Fixed Size                  1248600 bytes

Variable Size              75498152 bytes

Database Buffers          209715200 bytes

Redo Buffers                7139328 bytes

数据库装载完毕。

ORA-00313: 无法打开日志组 3 (用于线程 1) 的成员

ORA-00312: 联机日志 3 线程 1:

'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO03.LOG'

ORA-27046: 文件大小不是逻辑块大小的倍数

OSD-04012: 文件大小不匹配 (OS 52428267)


  • 步骤二:

SQL> recover database until cancel;

ORA-00279: 更改 25900159 (在 11/26/2019 12:32:54 生成) 对于线程 1 是必需的

ORA-00289: 建议:

E:\ORACLE\PRODUCT\10.2.0\DB_1\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2019_11_26\O1_

MF_1_6_%U_.ARC

ORA-00280: 更改 25900159 (用于线程 1) 在序列 #6 中

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

auto

ORA-00308: 无法打开归档日志

'E:\ORACLE\PRODUCT\10.2.0\DB_1\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2019_11_26\O1

_MF_1_6_%U_.ARC'

ORA-27041: 无法打开文件

OSD-04002: 无法打开文件

O/S-Error: (OS 2) 系统找不到指定的文件。

ORA-00308: 无法打开归档日志

'E:\ORACLE\PRODUCT\10.2.0\DB_1\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2019_11_26\O1

_MF_1_6_%U_.ARC'

ORA-27041: 无法打开文件

OSD-04002: 无法打开文件

O/S-Error: (OS 2) 系统找不到指定的文件。

ORA-01547: 警告: RECOVER 成功但 OPEN RESETLOGS 将出现如下错误

ORA-01194: 文件 1 需要更多的恢复来保持一致性

ORA-01110:数据文件 1: 

'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF'



  • 步骤三:

SQL> alter database open resetlogs;

数据库已更改。

SQL> select status from v$instance;

STATUS

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

OPEN

SQL>

SQL> alter system switch logfile;

系统已更改。

SQL>

系统已更改。

SQL>

系统已更改。

SQL>

系统已更改。

SQL> select group#,sequence#,archived,status from v$log;

    GROUP#  SEQUENCE# ARC STATUS

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

         1          5 NO  CURRENT

         2          4 NO  INACTIVE

         3          3 NO  INACTIVE

SQL>


  • 11g环境

oracle版本:11.2.0.4

操作系统:linux

归档模式: 非归档

前期准备:检查所有文件路径位置(redo,datafile,controlfile),复制一份,做个简单的冷备以防万一。


  1. 将active状态redo日志使用vim修改保存。然后强制关闭数据库。

  2. 使用隐含参数准备强制开启数据库。

  3. 使用recover database 将控制文件与日志文件scan一致。

  4. 启动数据库。alter database open resetlogs;


查看相关文件位置。

  [oracle@test2 ~]$ sqlplus as sysdba

SQL*Plus: Release 11.2.0.4.0 Production on Tue Nov 26 13:03:54 2019

Copyright (c) 1982, 2013, Oracle.  All rights reserved.


Connected to:

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

With the Partitioning, Real Application Clusters, OLAP, Data Mining

and Real Application Testing options


SQL> archive log list;

Database log mode              No Archive Mode

Automatic archival             Disabled

Archive destination            USE_DB_RECOVERY_FILE_DEST

Oldest online log sequence     5

Current log sequence           7

SQL> select name from v$datafile;


NAME

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

/oracle/app/oracle/oradata/wbb/system01.dbf

/oracle/app/oracle/oradata/wbb/sysaux01.dbf

/oracle/app/oracle/oradata/wbb/undotbs01.dbf

/oracle/app/oracle/oradata/wbb/users01.dbf


SQL> select name from v$controlfile;


NAME

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

/oracle/app/oracle/oradata/wbb/control01.ctl

/oracle/app/oracle/fast_recovery_area/wbb/control02.ctl


SQL> select members,status,group# from v$log;


   MEMBERS STATUS               GROUP#

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

         1 ACTIVE                    1

         1 CURRENT                   2

         1 INACTIVE                  3

  • 步骤一:

模拟redo文件损坏。使用vim编辑redo01文件---此时redo01文件为active状态。

然后启动强制关闭数据库,并启动。能看到oracle数据库启动报错:



SQL> shu abort;

ORACLE instance shut down.

SQL> startup

ORACLE instance started.


Total System Global Area 2505338880 bytes

Fixed Size                  2255832 bytes

Variable Size             704644136 bytes

Database Buffers         1778384896 bytes

Redo Buffers               20054016 bytes

Database mounted.

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

ORA-00312: online log 1 thread 1: '/oracle/app/oracle/oradata/wbb/redo01.log'

ORA-27048: skgfifi: file header information is invalid

Additional information: 24


  • 步骤二:

此时可以使用oracle数据库隐含参数。目的是为了open resetlogs 时能正常拉起数据库。

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


System altered.


SQL> shu abort;

ORACLE instance shut down.

SQL> startup

ORACLE instance started.


Total System Global Area 2505338880 bytes

Fixed Size                  2255832 bytes

Variable Size             704644136 bytes

Database Buffers         1778384896 bytes

Redo Buffers               20054016 bytes

Database mounted.

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

ORA-00312: online log 1 thread 1: '/oracle/app/oracle/oradata/wbb/redo01.log'

ORA-27048: skgfifi: file header information is invalid

Additional information: 24

  • 步骤三:

恢复数据库。---此操作是将控制文件中scn号码与redo日志文件保持一致。


SQL> recover database until cancel;

ORA-00279: change 968308 generated at 11/26/2019 10:39:26 needed for thread 1

ORA-00289: suggestion :

/oracle/app/oracle/fast_recovery_area/WBB/archivelog/2019_11_26/o1_mf_1_7_%u_.ar

c

ORA-00280: change 968308 for thread 1 is in sequence #7


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

auto

ORA-00308: cannot open archived log

'/oracle/app/oracle/fast_recovery_area/WBB/archivelog/2019_11_26/o1_mf_1_7_%u_.a

rc'

ORA-27037: unable to obtain file status

Linux-x86_64 Error: 2: No such file or directory

Additional information: 3


ORA-00308: cannot open archived log

'/oracle/app/oracle/fast_recovery_area/WBB/archivelog/2019_11_26/o1_mf_1_7_%u_.a

rc'

ORA-27037: unable to obtain file status

Linux-x86_64 Error: 2: No such file or directory

Additional information: 3


ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below

ORA-01194: file 1 needs more recovery to be consistent

ORA-01110: data file 1: '/oracle/app/oracle/oradata/wbb/system01.dbf'


SQL> alter database open;

alter database open

*

ERROR at line 1:

ORA-01589: must use RESETLOGS or NORESETLOGS option for database open


此次操作发现oracle数据库启动时报启动错误。检查alter日志与trc日志,并无其他较为严重错误,应该还是scan问题。


SQL> alter database open resetlogs;

alter database open resetlogs

*

ERROR at line 1:

ORA-01092: ORACLE instance terminated. Disconnection forced

ORA-00704: bootstrap process failure

ORA-00600: internal error code, arguments: [kclchkblk_4], [0], [968730], [0],

[968314], [], [], [], [], [], [], []

Process ID: 5412

Session ID: 156 Serial number: 5



SQL> shu abort;     

ORA-24324: service handle not initialized

ORA-01041: internal error. hostdef extension doesn't exist

SQL> shu abort;

ORA-24324: service handle not initialized

ORA-01041: internal error. hostdef extension doesn't exist

SQL> conn / as sysdba

Connected to an idle instance.

SQL> shu abort;

ORACLE instance shut down.

SQL> startup nomount;

ORACLE instance started.


Total System Global Area 2505338880 bytes

Fixed Size                  2255832 bytes

Variable Size             704644136 bytes

Database Buffers         1778384896 bytes

Redo Buffers               20054016 bytes

SQL> alter database mount;

Database altered.

SQL> alter database open;

Database altered.

SQL> select status from v$database;

select status from v$database

       *

ERROR at line 1:

ORA-00904: "STATUS": invalid identifier

SQL> select status from v$Instance;

STATUS

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

OPEN

SQL> alter system switch logfile;

System altered.

SQL> /

SQL> select members,status,group# from v$log;


   MEMBERS STATUS               GROUP#

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

         1 CURRENT                   1

         1 INACTIVE                  2

         1 INACTIVE                  3

SQL> alter system switch logfile;

System altered.

SQL> 

SQL>  select members,status,group# from v$log;

   MEMBERS STATUS               GROUP#

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

         1 ACTIVE                    1

         1 CURRENT                   2

         1 INACTIVE                  3


备注:

   

后期尝试推进scn方法:

推进SCN

select file#,checkpoint_change# from v$datafile_header;

15151992053971

调整scn

15151999053971

##################

oradebug dumpvar sga kcsgscn_kcslf

kcsgscn_kcslf 0x060012658

select to_char(15151999053971,'xxxxxxxxxxxxxxx') from dual;

dc7d9857093

oradebug poke 0x060012658 8 0xdc7d9857093

打开数据库


文章转载自Gladlyknow,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论