冷备份恢复
转载请注明出处:http://write.blog.csdn.net/postedit/41889405
现象:
利用数据文件异机数据重建;
只有数据文件的本机数据恢复。
实践环境:
Win server2003/xp+oracle11g32位;
小弟今日新装了v8软件,装完后,数据库突然不能使用,报ora-03113/ora-24324/ora-01041错误,由于原因太多、时间仓促,无法解决,就直接利用数据文件恢复了。
恢复原理:
由于数据文件在,所以只要重建spfile和control file即可。
恢复步骤:(这里为本机数据恢复步骤)
1. 打开oracle目录里面自带的工具创建新的实例;
打开后直接利用图文界面创建数据,下一步下一步完成就好;
2.备份新实例spfile和controlfile
在新数据库备份控制文件(这里操作时候没有截图):
Conn hgq as sysdba;
Alter database backup controlfile to trace;
(这里第一备份控制文件,第二等下可以通过altert文件查看创建控制文件代码,稍后创建时候会用到);
备份pfile,createpfile from spfile;(这个先保存起来备份);
3.一定要关闭数据库后,删除新实例HGQ目录下的文件,及oradata下所有文件,然后复制PLMDEOMO实例oradata目录下所有数据文件(除控制文件外,要不然稍后创建控制文件会失败);
4.修改新实例hgq下面pfile,然后创建控制文件;
因为稍后要重建控制文件,所以,这里面要在pfile用#屏蔽掉原来的控制文件信息,同时原来的控制文件要删除掉。
然后nomount下创建控制文件;
Sqlplus/nolog;
Conn hgq as sysdba;
Startup nomount;
CREATE CONTROLFILE REUSE set DATABASE"HGQ" RESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 454
DATAFILE
'E:\oracle\oradata\HGQ\SYSTEM01.DBF',
'E:\oracle\oradata\HGQ\UNDOTBS01.DBF',
'E:\oracle\oradata\HGQ\SYSAUX01.DBF',
'E:\oracle\oradata\HGQ\USERS01.DBF',
'E:\oracle\oradata\HGQ\TEST01.DBF',
'E:\oracle\oradata\HGQ\EXAMPLE01.DBF',
'E:\oracle\oradata\HGQ\FJBB01.DBF',
'E:\oracle\oradata\HGQ\HGQ.DBF',
'E:\oracle\oradata\HGQ\HWFX1.DBF',
'E:\oracle\oradata\HGQ\KFYY01.DBF'
LOGFILE
GROUP 1 ('E:\oracle\oradata\HGQ\REDO01.LOG') SIZE 10M,
GROUP 2 ('E:\oracle\oradata\HGQ\REDO02.LOG') SIZE 10M,
GROUP 3 ('E:\oracle\oradata\HGQ\REDO03.LOG') SIZE 10M
CHARACTER SET ZHS16GBK;
因为版本问题,这个代码可能会报错,这时候就可以查看alert文件中刚才备份的trace文件的位置,然后查看trace文件内容格式进行修改。
查看trace文件中代码格式:
5.控制文件已创建完毕,这时候需要修改pfile,然后启动数据库进行恢复;
修改pfile中刚才加#号的部分,去掉#号即可。
然后通过pfile启动数据库:
这时候会提示错误:ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项
然后执行alter database open resetlogs;
但是这时候有可能会报错,系统文件出错:system表空间出错,
系统文件出错,看到“一致性”自然想到 _allow_resetlogs_corruption的隐含命令
alter system set"_allow_resetlogs_corruption"=true scope=spfile;
执行上面的语句,然后再次执行语句alter database open resetlogs;
接着
SQL> create spfile from pfile;
文件已创建。
SQL> select count(*) from dba_users;
COUNT(*)
----------
37
SQL> select count(*) from dba_userswhere username='HWFX';
COUNT(*)
至此数据库恢复完成,打开数据库一看,数据都在。