在实际项目运维中,遇到服务器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;
恢复完成,登录数据库进行测试。