집 >데이터 베이스 >MySQL 튜토리얼 >假设数据文件顺序被打乱,你有办法找回正确的文件把数据库打开吗
一种非常应用很广泛的架构: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
转载请标注源文链接,否则追究法律责任!