ORACLE 使用"_ALLOW_RESETLOGS_CORRUPTION"进行崩溃恢复

Posted chendian0

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ORACLE 使用"_ALLOW_RESETLOGS_CORRUPTION"进行崩溃恢复相关的知识,希望对你有一定的参考价值。

什么情况可能使用该参数 
   有些时侯可能你的库处于非归档的模式下,而你的联机重做日志又currupted,你的数据文件不能完成完全的恢复。而这时当你试图打开数据库时,oracle提示你用resetlogs选项,当你使用该选项时oracle又不允许你使用该选项,总之你想打开数据库,可就是打不开。 
  
  1、最好做一个物理的库的全备 
  
  2、使用sqlplus 启动库至mount 
   sqlplus /nolog 
   sql>connect internal 
   sql>startup mount 
  3、确保所有的数据文件都处于"END BACKUP"状态 
   sql>set pages 0 feedback off lines 132 
   sql>spool alter_df.sql 
   sql>SELECT ‘alter database datafile ‘||file_name||‘ END BACKUP;‘ from v$datafile; 
   sql>spool off 
   sql>@alter_df.sql 
  4、试着打开数据库 
   sql>alter database open; 
   如数据库成功打开,余下的都不需要做了,到此为止 
  5、如果你在打开时被要求进行恢复,使用"UNTIL CANCEL"这种进行恢复,然后再发出ALTER DATABASE OPEN RESETLOGS这个命令 
   sql>recover database until cancel; 
   sql>alter database open resetlogs; 
  6、如果数据库仍不能打开,把库down掉 
   sql>shutdown immediate 
  7、在init.ora中加入如下参数 
   _allow_resetlogs_corruption=TRUE 
  8、执行如下语句 
   sql>connect internal 
   sql>startup mount 
   sql>@alter_df.sql 
   sql>alter database open 
  9、如在alter database open时仍旧报错,使用until cancel恢复 
   sql>recover database until cancel; 
   sql>alter database open resetlogs; 
  10、经过"9",数据库一定被打开了,数据库被打开后,马上执行一个full export 
  11、down掉库,去掉_all_resetlogs_corrupt参数 
  12、重建库 
  13、import并完成恢复 
  14、建议执行一下ANALYZE TABLE ...VALIDATE STRUCTURE CASCADE; 


---------------------
作者:茄肥猫
来源:CSDN
原文:https://blog.csdn.net/lively1982/article/details/18267241
版权声明:本文为博主原创文章,转载请附上博文链接!

 

=======================================================================================

使用_allow_resetlogs_corruption 打开无归档日志 rman 备份库,运维DBA反映服务器宕机后,开启数据库报错ORA-01194 ORA-01110,

分析原因为Oracle SCN不一致导致数据库无法启动,使用 _allow_resetlogs_corruption 打开数据库

1.rman还原恢复操作

--还原数据库
RMAN> restore database;
--恢复数据库
RMAN> recover database;

Starting recover at 2012-03-08 21:20:45
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=65 device type=DISK

starting media recovery

RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of recover command at 03/08/2012 21:20:47
RMAN-06053: unable to perform media recovery because of missing log
RMAN-06025: no backup of archived log for thread 1 with sequence 2936 and starting SCN of 25991695 found to restore
RMAN-06025: no backup of archived log for thread 1 with sequence 2935 and starting SCN of 25991652 found to restore
RMAN-06025: no backup of archived log for thread 1 with sequence 2934 and starting SCN of 25991649 found to restore
……………………
RMAN-06025: no backup of archived log for thread 1 with sequence 2902 and starting SCN of 25991156 found to restore
这里报日志缺少,实际上是备份的数据库文件后,没有备份归档日志,归档日志全部丢失

进行不完全恢复

SQL> recover database until cancel;
ORA-00279: change 25991194 generated at 03/08/2012 20:33:58 needed for thread 1
ORA-00289: suggestion : /opt/oracle/oradata/archivelog/chf/1_2902_752334071.dbf
ORA-00280: change 25991194 for thread 1 is in sequence #2902


Specify log: {=suggested | filename | AUTO | CANCEL}
cancel
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: ‘/opt/oracle/oradata/chf/system01.dbf‘


ORA-01112: media recovery not started


SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR at line 1:
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: ‘/opt/oracle/oradata/chf/system01.dbf‘

2.查看相关SCN

SQL> select file#,to_char(checkpoint_change#,‘999999999999‘) from v$datafile;

     FILE# TO_CHAR(CHECK
---------- -------------
         1      25992214
         2      25992214
         3      25992214
         4      25992214
         5      25992214
         6      25992214
         7      25992214
         8      25992214
         9      25992214
        10      25992214
        11      25992214

     FILE# TO_CHAR(CHECK
---------- -------------
        13      25992214
        14      25992214

13 rows selected.

SQL> select file#,online_status,to_char(change#,‘999999999999‘) from v$recover_file;

     FILE# ONLINE_ TO_CHAR(CHANG
---------- ------- -------------
         1 ONLINE       25991194
         2 ONLINE       25991194
         3 ONLINE       25991194
         4 ONLINE       25991194
         5 ONLINE       25991194
         6 ONLINE       25991194
         7 ONLINE       25991194
         8 ONLINE       25991194
         9 ONLINE       25991194
        10 ONLINE       25991194
        11 ONLINE       25991194

     FILE# ONLINE_ TO_CHAR(CHANG
---------- ------- -------------
        13 ONLINE       25991194
        14 ONLINE       25991194

13 rows selected.

SQL> select file#,to_char(checkpoint_change#,‘999999999999‘) from v$datafile_header;

     FILE# TO_CHAR(CHECK
---------- -------------
         1      25991194
         2      25991194
         3      25991194
         4      25991194
         5      25991194
         6      25991194
         7      25991194
         8      25991194
         9      25991194
        10      25991194
        11      25991194

     FILE# TO_CHAR(CHECK
---------- -------------
        13      25991194
        14      25991194

13 rows selected.

--发现数据文件scn和控制文件不一致,重建控制文件,然后查询相关scn
SQL> select file#,to_char(checkpoint_change#,‘999999999999‘) from v$datafile;

     FILE# TO_CHAR(CHECK
---------- -------------
         1      25991194
         2      25991194
         3      25991194
         4      25991194
         5      25991194
         6      25991194
         7      25991194
         8      25991194
         9      25991194
        10      25991194
        11      25991194

     FILE# TO_CHAR(CHECK
---------- -------------
        13      25991194
        14      25991194

13 rows selected.

SQL> select file#,online_status,to_char(change#,‘999999999999‘) from v$recover_file;

     FILE# ONLINE_ TO_CHAR(CHANG
---------- ------- -------------
         1 ONLINE       25991194
         2 ONLINE       25991194
         3 ONLINE       25991194
         4 ONLINE       25991194
         5 ONLINE       25991194
         6 ONLINE       25991194
         7 ONLINE       25991194
         8 ONLINE       25991194
         9 ONLINE       25991194
        10 ONLINE       25991194
        11 ONLINE       25991194

     FILE# ONLINE_ TO_CHAR(CHANG
---------- ------- -------------
        13 ONLINE       25991194
        14 ONLINE       25991194

13 rows selected.

SQL> select file#,to_char(checkpoint_change#,‘999999999999‘) from v$datafile_header;

     FILE# TO_CHAR(CHECK
---------- -------------
         1      25991194
         2      25991194
         3      25991194
         4      25991194
         5      25991194
         6      25991194
         7      25991194
         8      25991194
         9      25991194
        10      25991194
        11      25991194

     FILE# TO_CHAR(CHECK
---------- -------------
        13      25991194
        14      25991194

13 rows selected.
--此时所有scn均一致

3.尝试打开数据库

SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR at line 1:
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: ‘/opt/oracle/oradata/chf/system01.dbf‘


SQL> recover database using backup controlfile until cancel;
ORA-00279: change 25991194 generated at 03/08/2012 20:33:58 needed for thread 1
ORA-00289: suggestion : /opt/oracle/oradata/archivelog/chf/1_2902_752334071.dbf
ORA-00280: change 25991194 for thread 1 is in sequence #2902


Specify log: {=suggested | filename | AUTO | CANCEL}
cancel
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: ‘/opt/oracle/oradata/chf/system01.dbf‘


ORA-01112: media recovery not started

SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR at line 1:
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: ‘/opt/oracle/oradata/chf/system01.dbf‘

5.使用隐含参数打开数据库

SQL> create pfile=‘/tmp/pfile‘ from spfile;

File created.

-------/tmp/pfile中加上----------
_allow_resetlogs_corruption= TRUE
---------------------------------

SQL> startup mount pfile=‘/tmp/pfile‘ force
ORACLE instance started.

Total System Global Area  622149632 bytes
Fixed Size                  2230912 bytes
Variable Size             419431808 bytes
Database Buffers          192937984 bytes
Redo Buffers                7548928 bytes
Database mounted.
SQL> alter database open resetlogs;

Database altered.

SQL> select open_mode from v$database;

OPEN_MODE
--------------------
READ WRITE

总结
这次的试验没有多少实际意义,但是可以说明几个问题:
1.所有的数据文件的scn都一致,甚至和控制文件的也一致,数据库不一定可以open成功
(怀疑是数据文件中的scn大于data header scn)
2.对于这样的问题,如果使用bbed修改所有数据文件header的scn不知道是否可以解决
3.如果rman只备份了数据文件而没有任何一个归档日志,数据库通过隐含参数还是可以open,抢救数据
















































以上是关于ORACLE 使用"_ALLOW_RESETLOGS_CORRUPTION"进行崩溃恢复的主要内容,如果未能解决你的问题,请参考以下文章

小弟使用OTL函数,动态拼凑SQL查询oracle数据库数据问题

在Oracle中,通过一个INSERT ALL语句批量插入数据

ORACLE10G expdp 导出数据报错,大神看下

Elasticsearch 查询怎么返回指定的字段值

VS2008连接oracle"oracle ora-12504:tns 监听程序在connect_data中未获得service _name"

Centos-6.7下_Oracle 11gR2"静默"详细安装过程及排错