分类: Oracle
2014-11-26 09:17:20
1:首先如果控制文件未损坏或者部分损坏,又没有DMP文件,只有data文件,则可以参照如下方案
1.1:将原来的date文件夹备份出来
1.2:完全卸载删除原来的oracle,新安装一个oracle,新安装的oracle路径,实例名最好都和原来的一样,安装成功后停止服务,然后把新oracle的date文件夹拷贝出来,将备份的数据文件拷贝进去,直接启动oracle服务,如果运气好,数据文件控制文件都没损坏,则oracle恢复成功,直接可以使用
1.3:如果以上步骤失败,则可进行如下操作,一般都是控制文件损坏,但是oracle有3个数据控制文件,一般不会都损坏,先把3个数据文件都备份下,然后把control02数据文件拷贝3个,分别命名为01,02,03,然后,再次启动oracle服务,如果02控制文件没有损坏,则oracle可以正常使用,如果替换为02后还不能用,可以试试都换成03,如果全部换过来一遍还不能用则进入第二大步操作比较麻烦了
2:如果方案一不能解决你的问题,则需要参照如下步骤进行操作了
2.1:同上边1.2的操作,新安装一个oracle,并且路径以及实例名都和原来的保持一致,安装成功后启动服务
2.2:在命令行进行如下操作:sqlplus /nolog conn sys/sys as sysdba;
2.3:执行如下命令alter database backup controlfile to trace; 备份当前数据库控制文件,控制文件一般备份到D:/oracle/product/10.2.0/admin/bstest/udump下,请注意最新一个就是了(这个是系统自动备份的,路径不用管,oracle回自动给你存下来,ps:这一步一定要执行,我们第一次就是忘记执行这个了,导致后来往下执行的反工操作,不要以为这个没用,恢复时候要用现在备份的这个)
2.4:停止oracle服务,删除刚刚安装过的date文件夹下的所有文件
2.5:拷贝原来备份的date文件夹下的数据文件,日志文件(日志文件也需要,不然后边会执行不过去)
2.6:删除原控制文件,重新创建一个控制文件,命令行执行
sqlplus /nolog ;conn sys/sys as sysdba;
hutdown immediate;
startup nomount;启动到nomount状态
请注意修改各个路径的位置
然后执行以上控制文件重建语句
CREATE CONTROLFILE SET DATABASE "hr" RESETLOGS NOARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 'D:/ORACLE/PRODUCT/10.2.0/ORADATA/BSTEST/REDO01.LOG' SIZE 50M,
GROUP 2 'D:/ORACLE/PRODUCT/10.2.0/ORADATA/BSTEST/REDO02.LOG' SIZE 50M,
GROUP 3 'D:/ORACLE/PRODUCT/10.2.0/ORADATA/BSTEST/REDO03.LOG' SIZE 50M
-- STANDBY LOGFILE
DATAFILE
'D:/ORACLE/PRODUCT/10.2.0/ORADATA/BSTEST/SYSTEM01.DBF',
'D:/ORACLE/PRODUCT/10.2.0/ORADATA/BSTEST/UNDOTBS01.DBF',
'D:/ORACLE/PRODUCT/10.2.0/ORADATA/BSTEST/SYSAUX01.DBF',
'D:/ORACLE/PRODUCT/10.2.0/ORADATA/BSTEST/USERS01.DBF',
'D:/ORACLE/PRODUCT/10.2.0/ORADATA/BSTEST/TEST.DAT'
CHARACTER SET ZHS16GBK;
注意修改数据文件的路径,如果是原数据文件,加上你原来所有的数据文件路径,如绿色则是我原来的数据文件(特别是最后一个一定要加,因为可能大家主要用的就是这个数据文件,有的可能有多个)
2.7:执行控制文件恢复(这时候就用到了第三步的备份了)
recover database using backup controlfile until cancel;
输入cancel回车
这个时候系统会报错,不用理会
2.8 继续恢复重做日志文件:
alter database open resetlogs;
执行后出现以下错误。
ORA-01194:文件1需要更多的恢复来保持一致性
ORA-01110: 数据文件 1: 'D:/ORACLE/ORADATA/ZQKH/SYSTEM01.DBF'
(出现这个错误淡定,不要紧)
2.9、#系统文件出错,看到“一致性”自然想到 _allow_resetlogs_corruption的隐含命令
执行这个命令:alter system set "_allow_resetlogs_corruption"=true scope=spfile;
2.10:再次恢复重做日志文件:
执行如下命令: alter database open RESETLOGS;(这个指令执行过程会比较漫长,大家可以多等会,没问题),漫长等待后,系统会自动断开
ORA-01092: ORACLE 例程终止。强行断开连接
2.11 再次连接修改undo 日志为手动模式:
执行如下命令: alter system set undo_management='manual' scope=spfile;
2.12: 重启oracle服务,再次登录 执行如下命令:
startup mount;(启动到monunt状态)
recover database;(恢复数据库),成功后执行如下
alter database open;,到这为止,oracle控制文件以及重做日志文件已经成功恢复,用qlsql可以正常登录了
2.13:登录后,oracle基本上能用了,安全起见建议执行数据库备份操作,当用户执行备份时候可能会遇到如下错误,用plsql工具导出表,可以正常导出,建议大家用工具导出,手动写命令导出可能会遇到如下问题:
Oracle错误:提示临时表空间为空。
用select name from v$tempfile;查看,确实为空,则:
如temp01.dbf已存在,则如下:
alter tablespace temp add tempfile 'D:/oracle/product/10.2.0/oradata/bstest/temp01.dbf'
否则:
alter tablespace temp add tempfile 'D:/oracle/product/10.2.0/oradata/bstest/temp01.dbf' size 10M;(这个我没有测试,但是应该这样处理)
2.14:经过以上处理后,可以正常导出库了,导出后,建议把原来oracle干掉,然后重新装一下,把刚刚导出的库再倒入进去,至此问题得到完美解决
以上步骤操作过程中如果遇到失败,或者和上边不一样的情况,建议反复操作,可以解决oracle控制文件损坏的情况(保证数据文件和日志文件未损坏)