在某种情况下,数据库system表空间可能有多个数据文件,而意外的丢失了其中某个(不能为第一个),然后通过bbed来模拟一个数据文件来open库system增加数据文件

SQL>           alter          tablespace system           add          datafile           '/u01/oracle/oradata/ora11g/system02.dbf'          size          10m;         
                    
          Tablespace altered.         
                    
          --创建表,为了使得数据库发生类此生产环境的部分操作,使得system表空间可能发生改变         
          SQL>           create          table          t_xifenfei tablespace system          
                    2            as         
                    3            select          *           from          dba_tables;         
                    
          Table          created.

删除system中某个文件(system02.dbf)

[oracle@xifenfei ora11g]$ mv system02.dbf system02.dbf_bak

尝试启动数据库

SQL> shutdown abort           
          ORACLE instance shut down.         
          SQL> startup          
          ORACLE instance started.         
                    
          Total System           Global          Area  313860096 bytes         
          Fixed           Size                           1344652 bytes         
          Variable           Size                      251661172 bytes         
          Database          Buffers           54525952 bytes         
          Redo Buffers                6328320 bytes         
          Database          mounted.         
          ORA-01157: cannot identify/lock data file 8 - see DBWR trace file         
          ORA-01110: data file 8:           '/u01/oracle/oradata/ora11g/system02.dbf'

错误思路offline system数据文件

SQL>           alter          database          datafile 8 offline;         
                    
          Database          altered.         
                    
          SQL>           alter          database          open          ;         
          alter          database          open         
          *         
          ERROR           at          line 1:         
          ORA-01147: SYSTEM tablespace file 8           is          offline         
          ORA-01110: data file 8:           '/u01/oracle/oradata/ora11g/system02.dbf'         
                    
          SQL>           alter          database          datafile 8 online;         
          alter          database          datafile 8 online         
          *         
          ERROR           at          line 1:         
          ORA-01157: cannot identify/lock data file 8 - see DBWR trace file         
          ORA-01110: data file 8:           '/u01/oracle/oradata/ora11g/system02.dbf'

使用system表空间其他数据文件来模拟丢失数据文件

[oracle@xifenfei ora11g]$           cp          system01.dbf system02.dbf

通过dul获取file$相关信息

FILE          #         
          RELFILE          #         
          CRSCNWRP         
          CRSCNBAS

bbed修改下面参数值

--rdba         
                    ub4 rdba_kcbh                         @4        0x02000001         
          --绝对文件号         
                    ub2 kccfhfno                          @52       0x0008         
          --scn         
                    ub4 kscnbas                           @100      0xc01a3581         
                    ub2 kscnwrp                           @104      0x0b2c         
          --相对文件号         
                    ub4 kcvfhrfn                             @368      0x00000008         
          --文件大小(不修改,为了重建欺骗数据库重建控制文件)         
          kccfhfsz         
          --文件创建时间(重建控制文件来实现控制文件和数据文件头一致)         
          kcvfhcrt

重建控制文件 1.因为复制来自同一个表空间下面的数据文件,数据文件大小和原数据文件一样, 所以不要修改kccfhfsz大小,不然会出现

CREATE          CONTROLFILE REUSE           DATABASE          "ORA11G"          NORESETLOGS       ARCHIVELOG         
          *         
          ERROR           at          line 1:         
          ORA-01503:           CREATE          CONTROLFILE failed         
          ORA-01200: actual file           size          of          90880           is          smaller than correct           size          of          10485760 blocks         
          ORA-01110: data file 8:           '/u01/oracle/oradata/ora11g/system02.dbf'

2. 数据文件创建时间是通过kcvfhcrt参数值来控制的,而这个值是通过1988年01月01日00时00分00秒开始计时,按照每月31天计算的累计值,按照这个规则可以推断出来kcvfhcrt.因为数据库在启动的时候会验证控制文件中这个值和数据文件头的该值是否一致,所以如果你不修改kcvfhcrt,可以选择重建控制文件来完成.再次open数据库

SQL>           alter          database          open          ;         
          alter          database          open         
          *         
          ERROR           at          line 1:         
          ORA-01113: file 1 needs media recovery         
          ORA-01110: data file 1:           '/u01/oracle/oradata/ora11g/system01.dbf'         
                    
                    
          SQL> recover           database          ;         
          Media recovery complete.         
          SQL>           alter          database          open          ;         
                    
          Database          altered.

操作到这里,库已经可以正常的被open,如果通过这种方面屏蔽掉的异常的system数据文件中数据字典的部分表信息时,可能数据库依然不能被正常逻辑导出(例如dba_segments,dba_extents的基表等),需要进一步特殊处理