此次实验环境是分别在10g跟11g的环境模拟redo跟undo文件损坏处理方案。
10g环境
oracle版本:10.2.0.1.0
操作系统:window
归档模式: 非归档
前期准备:检查所有文件路径位置(redo,datafile,controlfile),复制一份,做个简单的冷备以防万一

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

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

生成pfile文件.并将隐含参数注入.准备强制启库.
_allow_resetlogs_corruption
只需三步启动数据库。
数据库pfile启动,将_allow_resetlogs_corruption参数加入。----如不加隐含参数,open resetlogs 会提示文件1 需要更多的恢复来保持一致性。
使用数据库中的命令推进scan号。保持控制文件中的scn号码跟日志文件中的一致。
使用不一致性开库。跳过数据文件头部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),复制一份,做个简单的冷备以防万一。
将active状态redo日志使用vim修改保存。然后强制关闭数据库。
使用隐含参数准备强制开启数据库。
使用recover database 将控制文件与日志文件scan一致。
启动数据库。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
打开数据库




