欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

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

程序员文章站 2023-12-28 19:58:22
...

一种非常应用很广泛的架构:HACMP+RAC+RAW。这种架构采用裸设备作为数据文件。今天演示一种恢复场景:数据库异常宕机,数据文件顺序错乱,数据库无法启动。 下面通过实验逐步演示,如果把数据文件的正确顺序找出来: SQL select * from v$version;BANNER----

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

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

上一篇:

下一篇: