日期:2014-05-17  浏览次数:21501 次

Oracle 冷备份恢复及ora 1033问题
最近因重新系统(原系统Win2K Adv Srv,Oracle 数据库版本8.1.5),因备份疏忽,遗漏其中一个数据库(XYCJ),但数据库的文件均有备份(Oradata,Ora81,admin文件夹)请问如何将其中的数据库恢复出来;
另,我在别机器安装Oracle(因为找不到原8.1.5版本,安装的是8.1.7版本,直接覆盖Oradata文件夹出现 Ora-01033错误,求教如何解决

本人Oracle新手,虽然计算机小有了解,但Oracle 尚属初学阶段,请高手赐教!重谢!

------解决方案--------------------
用recover database until cancel肯定能够解决问题,如果非正常关闭,你则要牺牲当前日志中的数据,做不完全恢复了!
zflying2000 的方式只试用于非当前日志,所以估计不好使,现在你只能通过修改初始参数,加入_allow_resetlogs_corruption=true,然后重新启动倒mount,最后 alter database open resetlogs即可

------解决方案--------------------
某个数据文件损坏,如何打开数据库——ORA-01033: ORACLE initialization or shutdown in progress错误 

系统环境: 
1、操作系统:Windows 2000 Server,机器内存128M 
2、数据库: Oracle 8i R2 (8.1.6) for NT 企业版 
3、安装路径:C:\ORACLE 

错误现象: 
因误操作,数据库中某一数据文件被误删,控制面板的Oracle相关服务显示已启动,但用SQL*Plus无法连接,显示以下错误: 
ORA-01033: ORACLE initialization or shutdown in progress 

模拟现象: 
create tablespace test datafile 
'c:\test.ora' size 5M 
AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED 
default storage (initial 128K next 1M pctincrease 0) 
/ 
关闭所有服务stop.bat 
net stop "OracleWebAssistant0" 
net stop "OracleOraHome81TNSListener" 
net stop "OracleServiceORADB" 
shutdown 
在操作系统中删除test.ora文件 
重新启动服务start.bat 
net start "OracleWebAssistant0" 
net start "OracleOraHome81TNSListener" 
net start "OracleServiceORADB" 
服务里OracleServiceORADB显示已启动,但用SQL*Plus无法连接, 
显示ORA-01033: ORACLE initialization or shutdown in progress 
解决方法: 
先让该数据文件脱机,就可以打开数据库 
C:\>svrmgrl 
svrmgrl>connect internal 
svrmgrl>shutdown 
svrmgrl>startup mount 
--ARCHIVELOG模式命令,文件名要大写 
svrmgrl>alter database datafile 'C:\TEST.ORA' offline; 
--NOARCHIVELOG模式命令 
svrmgrl>alter database datafile 'C:\TEST.ORA' offline drop; 
svrmgrl>alter database open; 
--查询数据文件联、脱机状态 
SQL> select file#,name,status from v$datafile; 
SQL> drop tablespace test; 
表空间已丢弃。 
丢失联机日志文件 
分两种情况处理 
1、丢失的是非活动的日志文件; 
2、丢失的是当前激活的日志文件。 
如果是第一种情况,而发生故障的日志文件组又具有多个成员,可以先将数据库shutdown,然后用操作系统命令将损坏日志文件组中好的日志成员文件把损坏的成员文件覆盖(在同一个日志成员组中的所有日志文件的各为镜象的),如果其物理位置不可用可将其拷贝到新的驱动器上,使用alter database rename file ‘xxxx’ to ‘xxxx’改变文件位置,之后启动数据库,如果正常马上进行一个冷备份。如果损坏的日志组中只有一个日志成员,先mount上数据库,将其转换为noarchivelog模式,执行alter database add logfile member ‘xxx’ to group ‘x’给相关组增加一个成员,再执行alter database drop logfile member ‘bad_file’将损坏的日志文件删除,由于数据库的结构发生变动需要备份控制文件,之后将数据库改回archivelog模式,做一个冷备份。 
如果丢失的是当前激活的日志文件,数据库又没有镜像而且当前日志组中所有成员均变为不可用。首先将数据库shutdown abort,从最近的一次全备份中恢复所有的数据文件,将数据库启动到mount状态。如果原来的日志文件物理位置不可用,使用alter database rename file ‘xxx’ to ‘xxx’改变文件的存放位置。然后,使用recover database until cancel命令来恢复数据库,直到提示最后一个归档日志运用完之后,输入cancel。之后用alter database open resetlogs打开数据库,如果没有问题,立即进行一个冷备份。注意!所有包含在损坏的redo log中的信息将会丢失,也就是说数据库崩溃前已经提交的数据有可能会丢失。这对于某些要求很高的应用将会损失惨重,因此应尽量使每个日志组具有多个日志成员,并且放置在不同的驱动器上防止发生介质故障。
------解决方案--------------------
参考:用数据文件恢复数据库:
如何从完好的数据文件恢复oracle数据库
一.有数据文件、控制文件和日志文件的备份 
1.服务器重装了操作系统,oracle也重装了。如果重装的oracle和以前损坏的数据库是一模一样的结构,那么此时的恢复是比较简单的。 
1)删除掉新建数据库的所有数据文件、控制文件和日志文件。Copy原数据库的数据文件、控制文件和日志文件到对应目录下。 
2) 
Cmd>sqlplus /nolog 
Sql>conn as sysdba 
用户名:system 
密码:(此处密码为新创建数据库的密码) 
Sql>shutdown immediate 
Sql>startup nomount 
Sql>alter database mo