• 如果数据文件顺序被打乱,你有办法找回正确的文件把数据库打开吗?


    一种非常应用非常广泛的架构:HACMP+RAC+RAW。这样的架构採用裸设备作为数据文件。

    今天演示一种恢复场景:数据库异常宕机,数据文件顺序错乱。数据库无法启动。

    以下通过实验逐步演示,假设把数据文件的正确顺序找出来:

    SQL> select * from v$version;
    
    BANNER
    --------------------------------------------------------------------------------
    Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
    PL/SQL Release 11.2.0.4.0 - Production
    CORE	11.2.0.4.0	Production
    TNS for Linux: Version 11.2.0.4.0 - Production
    NLSRTL Version 11.2.0.4.0 - Production

     

    展示表空间、数据文件的简要情况

    SQL> select ts#,name from v$tablespace;

           TS# NAME
    ---------- --------------------
     0 SYSTEM
     1 SYSAUX

     2 UNDOTBS1
     3 TEMP
     4 USERS

    SQL> select file#,name from v$datafile;

         FILE# NAME
    ---------- ---------------------------------------------------------------------
    1 /u01/app/oracle/oradata/primary/system01.dbf
    2 /u01/app/oracle/oradata/primary/sysaux01.dbf

    3 /u01/app/oracle/oradata/primary/undotbs01.dbf
    4 /u01/app/oracle/oradata/primary/users01.dbf

    “断电”式高速强制停库

    SQL> shutdown abort;                              
    ORACLE instance shut down.
    SQL> startup mount;
    ORACLE instance started.

    Total System Global Area  784998400 bytes
    Fixed Size    2257352 bytes
    Variable Size  700452408 bytes
    Database Buffers   79691776 bytes
    Redo Buffers    2596864 bytes
    Database mounted.


     

    搞破坏。将system01.dbf和sysaux01.dbf两个数据文件相互替换名字

    mv /u01/app/oracle/oradata/primary/system01.dbf /u01/app/oracle/oradata/primary/a

    mv /u01/app/oracle/oradata/primary/sysaux01.dbf /u01/app/oracle/oradata/primary/system01.dbf

    mv /u01/app/oracle/oradata/primary/a /u01/app/oracle/oradata/primary/sysaux01.dbf

    尝试启库。但会报错

    SQL> alter database open;
    alter database open
    *
    ERROR at line 1:
    ORA-01122: database file 1 failed verification check
    ORA-01110: data file 1: '/u01/app/oracle/oradata/primary/system01.dbf'
    ORA-01210: data file header is media corrupt

    细心的朋友可能会顺便查询一下视图v$datafile_header


    v$datafile是从控制文件中读取信息,而v$datafile_header是从数据文件头部读取信息。

    事实上到这里。已经能从FILE#,ERROR,RFILE#的值就能够看出,system01.dbf与sysaux01.dbf到换了,能够改名直接将数据库打开。我们最好还是通过其它方法去修复破坏

    下面已经提示system01.dbf数据文件头部损坏,我们dump部分数据文件瞧瞧:

     

    DUMP数据文件头部

    SQL> alter system dump datafile '/u01/app/oracle/oradata/primary/system01.dbf' block 2;

    System altered.

    SQL> alter system dump datafile '/u01/app/oracle/oradata/primary/sysaux01.dbf' block 2;

    System altered.


    以上能够看出,system01.dbf的头部记录着自身事实上是2号数据文件


    从以上能够看出,sysaux01.dbf头部记录着自身事实上是1号数据文件


    至此,能够推断。system01.dbf事实上是SYSAUX表空间的数据文件。sysaux01.dbf事实上是SYSTEM的数据文件,对比v$datafile视图的输出将数据文件重命名:

    重命名数据文件,修复破坏

    mv /u01/app/oracle/oradata/primary/system01.dbf /u01/app/oracle/oradata/primary/b
    mv /u01/app/oracle/oradata/primary/sysaux01.dbf /u01/app/oracle/oradata/primary/system01.dbf
    mv /u01/app/oracle/oradata/primary/b /u01/app/oracle/oradata/primary/sysaux01.dbf

    再次尝试打开数据库:

    SQL> alter database open;

    Database altered.

    SQL> select * from dual;

    DUM
    ---
    X

    经过以上实验的演示将数据文件又一次相应,终于得以顺利打开数据库。

    启发:

    数据文件头部记录都记录着DBID,DB_NAME,File Number,Blsize等信息,同一时候数据块也通过rdba标识着该数据块的物理位置(数据文件+数据块),因此能够通过这些信息与控制文件的信息做对比。


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

    本文来自于我的技术博客 http://blog.csdn.net/robo23

    转载请标注源文链接,否则追究法律责任!

  • 相关阅读:
    delphi消息发送字符串
    Delphi2007 在Win10 下运行报错 Assertion failure
    python 定时器
    python 直接赋值 深浅拷贝
    python 闭包
    python 对象
    c++ sizeof和strlen
    c++入门笔记(一)
    python实现四种排序逻辑与代码
    webrtc autotest
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5175768.html
Copyright © 2020-2023  润新知