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

一种非常应用非常广泛的架构: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

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

posted @ 2016-02-01 17:01  zfyouxi  阅读(505)  评论(0编辑  收藏  举报