ORA-01190或1189的处理过程

 
SQL> startup
ORACLE 例程已经启动。
Total System Global Area  838860800 bytes
Fixed Size                  1293336 bytes
Variable Size             427820008 bytes
Database Buffers          402653184 bytes
Redo Buffers                7094272 bytes
数据库装载完毕。
数据库已经打开。
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。
Total System Global Area  838860800 bytes
Fixed Size                  1293336 bytes
Variable Size             432014312 bytes
Database Buffers          398458880 bytes
Redo Buffers                7094272 bytes
数据库装载完毕。
ORA-01113: 文件 2 需要介质恢复
ORA-01110: 数据文件 2: 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\UNDOTBS01.DBF'

SQL> recover datafile 2;
完成介质恢复。
SQL> alter database open;
数据库已更改。
SQL> select file#,name from v$datafile;
     FILE#
----------
NAME
--------------------------------------------------------------------------------
         1
E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\SYSTEM01.DBF
         2
E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\UNDOTBS01.DBF
         3
E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\SYSAUX01.DBF

     FILE#
----------
NAME
--------------------------------------------------------------------------------
         4
E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\USERS01.DBF

SQL> alter database datafile 4 offline drop;
数据库已更改。
SQL>
SQL>
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL>
SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area  838860800 bytes
Fixed Size                  1293336 bytes
Variable Size             436208616 bytes
Database Buffers          394264576 bytes
Redo Buffers                7094272 bytes
数据库装载完毕。
SQL> recover until cancel;
完成介质恢复。
SQL> alter database open resetlogs;
数据库已更改。
SQL> alter database datafile 4 online;
alter database datafile 4 online
*
第 1 行出现错误:
ORA-01190: 控制文件或数据文件 4 来自最后一个 RESETLOGS 之前
ORA-01110: 数据文件 4: 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\USERS01.DBF'

SQL>
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup nomount pfile=E:\oracle\product\10.2.0\db_1\database\inittest.ora
ORACLE 例程已经启动。
Total System Global Area  838860800 bytes
Fixed Size                  1293336 bytes
Variable Size             281019368 bytes
Database Buffers          549453824 bytes
Redo Buffers                7094272 bytes
SQL> CREATE CONTROLFILE REUSE DATABASE "TEST" RESETLOGS  NOARCHIVELOG
  2      MAXLOGFILES 16
  3      MAXLOGMEMBERS 3
  4      MAXDATAFILES 100
  5      MAXINSTANCES 8
  6      MAXLOGHISTORY 292
  7  LOGFILE
  8    GROUP 1 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\REDO01.LOG'  SIZE 50M,
  9    GROUP 2 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\REDO02.LOG'  SIZE 50M,
 10    GROUP 3 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\REDO03.LOG'  SIZE 50M
 11  -- STANDBY LOGFILE
 12  DATAFILE
 13    'E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\SYSTEM01.DBF',
 14    'E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\UNDOTBS01.DBF',
 15    'E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\SYSAUX01.DBF',
 16    --'E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\USERS01.DBF'
 17  CHARACTER SET ZHS16GBK
 18  ;
CREATE CONTROLFILE REUSE DATABASE "TEST" RESETLOGS  NOARCHIVELOG
*
第 1 行出现错误:
ORA-01503: CREATE CONTROLFILE ??
ORA-01163: SIZE ???? 12800 (?), ????? 32000 ??
ORA-01110: ???? 3: 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\SYSAUX01.DBF'

SQL> RECOVER DATABASE USING BACKUP CONTROLFILE;
ORA-01507: ??????

SQL> CREATE CONTROLFILE REUSE DATABASE "TEST" RESETLOGS  NOARCHIVELOG
  2      MAXLOGFILES 16
  3      MAXLOGMEMBERS 3
  4      MAXDATAFILES 100
  5      MAXINSTANCES 8
  6      MAXLOGHISTORY 292
  7  LOGFILE
  8    GROUP 1 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\REDO01.LOG'  SIZE 50M,
  9    GROUP 2 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\REDO02.LOG'  SIZE 50M,
 10    GROUP 3 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\REDO03.LOG'  SIZE 50M
 11  -- STANDBY LOGFILE
 12  DATAFILE
 13    'E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\SYSTEM01.DBF',
 14    'E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\UNDOTBS01.DBF',
 15    'E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\SYSAUX01.DBF'
 16    --'E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\USERS01.DBF'
 17  CHARACTER SET ZHS16GBK
 18  ;
控制文件已创建。
SQL> RECOVER DATABASE USING BACKUP CONTROLFILE;
ORA-00279: ?? 566765 (? 05/07/2010 11:22:53 ??) ???? 1 ????
ORA-00289: ??:
E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\TEST\ARCHIVELOG\2010_05_07\O1_MF_1_
1_%U_.ARC
ORA-00280: ?? 566765 (???? 1) ??? #1 ?

指定日志: {=suggested | filename | AUTO | CANCEL}
cancel
介质恢复已取消。
SQL> ALTER DATABASE OPEN RESETLOGS;
数据库已更改。
SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\SYSTEM01.DBF
E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\UNDOTBS01.DBF
E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\SYSAUX01.DBF
E:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\MISSING00004
SQL> alter database rename file 'E:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\MISSING0
0004' to 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\USERS01.dbf';
数据库已更改。
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup nomount pfile=E:\oracle\product\10.2.0\db_1\database\inittest.ora
ORACLE 例程已经启动。
Total System Global Area  838860800 bytes
Fixed Size                  1293336 bytes
Variable Size             281019368 bytes
Database Buffers          549453824 bytes
Redo Buffers                7094272 bytes
SQL> alter database mount;
数据库已更改。
SQL> recover until cancel;
完成介质恢复。
SQL> alter database datafile 4 online;
数据库已更改。
SQL> alter database open resetlogs;
数据库已更改。
SQL> select status from v$datafile;
STATUS
-------
SYSTEM
ONLINE
ONLINE
ONLINE
SQL>
总结:1190或1189错误的主要原因是数据文件头的CHECKPOINT_CHANGE#恢复到控制文件中记录的CHECKPOINT_CHANGE#跨越了两个incardination,为了解决这个问题,重建控制文件使得控制文件中对这个文件记录的CHECKPOINT_CHANGE#恢复到0,这样只需要恢复到数据文件头记录的那个scn就可以了,在allow corruption的条件下,open resetlog的时候会将scn恢复到最新的db CHECKPOINT_CHANGE#
 
不仅是1190 1189,如果单个文件没法恢复到最新,也同样可以采取这样的操作来完成。
请使用浏览器的分享功能分享到微信等