Oracle数据库恢复--通过数据文件进行恢复

在实际项目运维中,遇到服务器oracle数据库存储硬盘坏了,只留下了数据文件,其控制文件和参数文件都丢失了,如何进行数据库恢复呢。

1、安装一个与要恢复的数据库相同实例,其db_name,sid,字符集都一样,因为在创建控制文件时,会判断dbf文件头信息中的数据库名是否与所在实例名是否一样。

我要恢复的数据库db_name和sid都是orcl,字符集UTF8。
我使用的是dbca静默建库,命令如下:

dbca -silent -createDatabase -templateName $ORACLE_HOME/assistants/dbca/templates/General_Purpose.dbc -gdbName orcl -sid orcl   -sysPassword huangbaokang -systemPassword huangbaokang -datafileDestination /u01/app/oraData -characterSet UTF8 -automaticMemoryManagement true

以上命令执行后,会在/u01/app/oraData(事先先建立好oraData目录,用户权限组oracle:oinstall)生成orcl的数据文件,一系列的dbf文件。
如果实验失败,可以重头来,需要先删除该示例,命令如下(失败的时候才需要运行如下命令,防止出现重复创建的问题):

dbca -silent -deleteDatabase -sourcedb orcl

2、以sysdba身份进行备份控件文件,备份目录自定义

[oracle@ibopo-center-db ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on Mon Nov 12 13:03:16 2018

Copyright (c) 1982, 2009, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> alter database backup controlfile to trace as '/u01/apps/oracle/admin/orcl/hbk.trc'

Database altered.

3、停止数据库实例

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

4、删除第一步生成的一系列dbf文件(不放心可以先备份,再删除,不过没备份也不要紧,毕竟也可以从头来,利用dbca建库嘛),记得一定要把所有该目录下(oraData)的dbf全部删除,不能只把要恢复的dbf替换原来的orcl,否则创建控制文件会报如下错误,亲测。然后把需恢复的数据文件全部拷贝到oraData目录下。

SQL> CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS  ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 '/u01/hbk/oraData/orcl/redo01.log'  SIZE 50M BLOCKSIZE 512,
  GROUP 2 '/u01/hbk/oraData/orcl/redo02.log'  SIZE 50M BLOCKSIZE 512,
  GROUP 3 '/u01/hbk/oraData/orcl/redo03.log'  SIZE 50M BLOCKSIZE 512
DATAFILE
  '/u01/hbk/oraData/orcl/system01.dbf',
  '/u01/hbk/oraData/orcl/sysaux01.dbf',
  '/u01/hbk/oraData/orcl/undotbs01.dbf',  
  '/u01/hbk/oraData/orcl/users01.dbf',
  '/u01/hbk/oraData/orcl/zgq_wlwz_data.dbf'
CHARACTER SET UTF8
; 
CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS  ARCHIVELOG
*
ERROR at line 1:
ORA-01503: CREATE CONTROLFILE failed
ORA-01159: file is not from same database as previous files - wrong database id
ORA-01110: data file 7: '/u01/hbk/oraData/orcl/zgq_wlwz_data.dbf'

5、已sysdba进行,执行到nomount阶段。

SQL> startup nomount
ORACLE instance started.

Total System Global Area 2.6991E+10 bytes
Fixed Size		    2213976 bytes
Variable Size		 1.3690E+10 bytes
Database Buffers	 1.3153E+10 bytes
Redo Buffers		  145174528 bytes

6、从第二步生成的trace文件/u01/apps/oracle/admin/orcl/hbk.trc,修改部分,如下

CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS  ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 '/u01/hbk/oraData/orcl/redo01.log'  SIZE 50M BLOCKSIZE 512,
  GROUP 2 '/u01/hbk/oraData/orcl/redo02.log'  SIZE 50M BLOCKSIZE 512,
  GROUP 3 '/u01/hbk/oraData/orcl/redo03.log'  SIZE 50M BLOCKSIZE 512
DATAFILE
  '/u01/hbk/oraData/orcl/system01.dbf',
  '/u01/hbk/oraData/orcl/sysaux01.dbf',
  '/u01/hbk/oraData/orcl/undotbs01.dbf',
  '/u01/hbk/oraData/orcl/users01.dbf',
  '/u01/hbk/oraData/orcl/zgq_wlwz_data.dbf'
CHARACTER SET UTF8
;

修改的地方:把NOARCHIVELOG改成ARCHIVELOG,并增加自己的DATAFILE配置,只增加数据文件(_DATA.DBF),临时表空间不要加(_TEMP.DBF)往后面增加即可,注意最后一个不要留逗号(曾经自己被坑过)。

7、执行数据库恢复命令

SQL>recover database;

8、打开数据库

SQL>alter database open;

并补充临时表空间,根据具体路径进行修改

ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/hbk/oraData/orcl/temp01.dbf'
     SIZE 30408704  REUSE AUTOEXTEND ON NEXT 655360  MAXSIZE 32767M;

ALTER TABLESPACE CMS6_ZGQ_TEMP ADD TEMPFILE '/u01/hbk/oraData/orcl/cms6_zgq_temp.dbf'
     SIZE 30408704  REUSE AUTOEXTEND ON NEXT 655360  MAXSIZE 32767M;

恢复完成,登录数据库进行测试。

你可能感兴趣的:(oracle)