最近因重新系统(原系统Win2K Adv Srv,Oracle 数据库版本8.1.5),因备份疏忽,遗漏其中一个数据库(XYCJ),但数据库的文件均有备份(Oradata,Ora81,admin文件夹)请问如何将其中的数据库恢复出来;
另,我在别机器安装Oracle(因为找不到原8.1.5版本,安装的是8.1.7版本,直接覆盖Oradata文件夹出现 Ora-01033错误,求教如何解决本人Oracle新手,虽然计算机小有了解,但Oracle 尚属初学阶段,请高手赐教!重谢!

解决方案 »

  1.   

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

  2.   

    某个数据文件损坏,如何打开数据库——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中的信息将会丢失,也就是说数据库崩溃前已经提交的数据有可能会丢失。这对于某些要求很高的应用将会损失惨重,因此应尽量使每个日志组具有多个日志成员,并且放置在不同的驱动器上防止发生介质故障。 
      

  3.   

    参考:用数据文件恢复数据库:
    如何从完好的数据文件恢复oracle数据库
    一.有数据文件、控制文件和日志文件的备份 
    1.服务器重装了操作系统,oracle也重装了。如果重装的oracle和以前损坏的数据库是一模一样的结构,那么此时的恢复是比较简单的。 
    1)删除掉新建数据库的所有数据文件、控制文件和日志文件。Copy原数据库的数据文件、控制文件和日志文件到对应目录下。 
    2) 
    Cmd>sqlplus /nolog 
    Sql>conn as sysdba 
    用户名:system 
    密码:(此处密码为新创建数据库的密码) 
    Sql>shutdown immediate 
    Sql>startup nomount 
    Sql>alter database mount 
    此时看数据库是不是能mount起来,有时会提示没有口令文件PWDdemo.ora文件找不到。查看对应的目录(database下)会发现该文件是存在的。此时需要注意,该口令文件是新安装数据库后创建实例时生成的口令文件,不是以前所用数据库的口令文件,而现在,我们是用以前数据库的控制文件和数据文件来打开以前的数据库,所以此时需要重新创建一个口令文件。 
    Sql>shutdown immediate 
    Sql>host orapwd file=c:\oracle9i\database\PWDdemo.ora password=oracle 
    Entries=10 (放在database 目录下) 
    Sql>startup nomount 
    Sql>alter database mount 
    Sql>alter database open 
    打开数据库 
    2.如果新数据库的安装目录和原有数据库的目录不一样,那么此时可以重建控制文件来打开数据库。因为原控制文件中记录的数据文件地址和现有的数据文件位置不一样。此时和下面第二中情况一样。当然,此时也可以创建和原数据库一样的目录结构(前提是要记得原数据库的目录结构),需要注意的就是参数文件中记录的控制文件位置和控制文件中记录的数据文件位置。 
    说明:我们需要清楚数据库在打开的三个阶段中,需要读取的文件 
    Sql>startup nomount (此时读取参数文件) 
    Sql>alter database mount (根据参数文件中记录的控制文件地址,去读取控制文件) 
    Sql>alter database open (根据控制文件中记录的数据文件地址,读取数据文件,打开数据库) 
    二.只有数据文件备份,没有控制文件和日志文件 
    由于只有数据文件备份,没有控制文件和日志文件,此时只能采用重建控制文件来恢复数据库。以下通过两中方法来介绍如何通过重建控制文件来进行数据库的恢复。 
    1)仅安装数据库软件,通过新建oracle服务,引用数据文件来创建一个实例。下面以实例名为demo为例进行说明。 
    1.创建存储demo相关文件的目录。即::各类文件的存放地址。 
    C:\documents and settings\mkdir c:\demo 
    C:\documents and settings\mkdir c:\demo\bdump 
    C:\documents and settings\mkdir c:\demo\udump 
    C:\documents and settings\mkdir c:\demo\cdump 
    C:\documents and settings\mkdir c:\demo\pfile 
    C:\documents and settings\mkdir c:\demo\create 
    C:\documents and settings\mkdir c:\demo\oradata 
    C:\documents and settings\mkdir c:\demo\oradata\demo (放置datafile、logfile、controlfile) 
    2.创建初始化参数文件(pfile) 
    此处pfile文件可以从其他能正常运行的数据库上copy一个过来进行修改。(判断其他正常运行的数据库使用的是pfile还是spfile,如是pfile可以直接copy,如是spfile,则可根据spfile创建一个pfile文件) 
    Copy过来的pfile需要修改的地方: 
    background_dump_dest=c:\demo\bdump 
    core_dump_dest=c:\demo\cdump 
    user_dump_dest=c:\demo\udump 
    control_files=("c:\demo\oradata\demo\CONTROL01.CTL", "c:\demo\oradata\demo\CONTROL02.CTL", "c:\demo\oradata\demo\CONTROL03.CTL") 
    dispatchers="(PROTOCOL=TCP) (SERVICE=demoXDB)"(实例名) 
    dispatchers="(PROTOCOL=TCP) (SERVICE=demoXDB)" 
    db_domain="" 
    db_name=demo 
    3.创建oracle服务和口令文件 
    C:\documents and settings\oradim — new —sid demo —intpwd oracle 
    4.配置监听和服务 
    用net manager 进行配置(demo实例的配置) 
    5.复制数据文件备份到指定的目录下。此处为c:\demo\oradata\demo 
    6.重建controlfile 
    C:\Documents and Settings\hefan>sqlplus /nolog 
    SQL*Plus: Release 9.2.0.1.0 - Production on 星期一 12月 29 10:57:07 2008 
    Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved. 
    SQL> conn as sysdba 
    请输入用户名: system 
    请输入口令: 
    已连接。 
    SQL> shutdown immediate 
    ORA-01507: 未安装数据库 
    ORACLE 例程已经关闭。 
    SQL> startup nomount file= c:\demo\pfile\initdemo.ora 
    ORACLE 例程已经启动。 
    Total System Global Area 135338868 bytes 
    Fixed Size 453492 bytes 
    Variable Size 109051904 bytes 
    Database Buffers 25165824 bytes 
    Redo Buffers 667648 bytes 
    SQL> @d:\controlfile.sql 
    控制文件已创建 
    Controlfile.sql内容如下:(此处也可以直接在sql>下输入以下内容进行创建controlfile) 
    CREATE CONTROLFILE REUSE DATABASE "demo" RESETLOGS NOARCHIVELOG 
    MAXLOGFILES 50 
    MAXLOGMEMBERS 5 
    MAXDATAFILES 100 
    MAXINSTANCES 8 
    MAXLOGHISTORY 226 
    LOGFILE 
    GROUP 1 'c:\demo\oradata\demo\redo01.log' SIZE 50M, 
    GROUP 2 'c:\demo\oradata\demo\redo02.log' SIZE 50M, 
    GROUP 3 'c:\demo\oradata\demo\redo03.log' SIZE 50M 
    DATAFILE 
    'c:\demo\oradata\demo\system01.dbf', 
    'c:\demo\oradata\demo\odm01.dbf', 
    'c:\demo\oradata\demo\indx01.dbf', 
    'c:\demo\oradata\demo\tools01.dbf', 
    'c:\demo\oradata\demo\undotbs01.dbf', 
    'c:\demo\oradata\demo\users01.dbf', 
    'c:\demo\oradata\demo\xdb01.dbf', 
    'c:\demo\oradata\demo\cwmlite01.dbf', 
    'c:\demo\oradata\demo\drsys01.dbf', 
    'c:\demo\oradata\demo\example01.dbf' 
    CHARACTER SET zhs16gbk 
    说明:此时没有日志文件,所以只能进行reserlogs,如果是有logfile,则此处不需要resetlogs,noresetlogs就可以 
    7.恢复数据库 
    SQL> recover database using backup controlfile until cancel; 
    ORA-00279: ?? 523637 (? 12/23/2008 20:52:22 ??) ???? 1 ???? 
    ORA-00289: ??: C:\ORACLE9I\RDBMS\ARC00005.001 
    ORA-00280: ?? 523637 ???? 1 ???? # 5 ??? 
    指定日志: {<RET>=suggested | filename | AUTO | CANCEL} 
    cancel 
    介质恢复已取消。 
    SQL> recover database using backup controlfile until cancel; 
    ORA-00279: ?? 523637 (? 12/23/2008 20:52:22 ??) ???? 1 ???? 
    ORA-00289: ??: C:\ORACLE9I\RDBMS\ARC00005.001 
    ORA-00280: ?? 523637 ???? 1 ???? # 5 ??? 
    指定日志: {<RET>=suggested | filename | AUTO | CANCEL} 
    cancel 
    介质恢复已取消。 
    SQL> alter database open resetlogs; 
    数据库已更改。 
    Resetlog后要进行数据库的全备,以前的备份不可用。 2)安装数据库,创建一个实例,用备份的数据文件代替新创建实例的数据文件。 
    1.删除安装目录下所有的datafile、comtrolfile、logfile。(oradata目录下的文件) 
    2.Copy备份的数据文件到oradata目录下 
    3.重建控制文件 
    C:\Documents and Settings\hefan>sqlplus /nolog 
    SQL*Plus: Release 9.2.0.1.0 - Production on 星期一 12月 29 10:57:07 2008 
    Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved. 
    SQL> conn as sysdba 
    请输入用户名: system 
    请输入口令: 
    已连接。 
    SQL> shutdown immediate 
    ORA-01507: 未安装数据库 
    ORACLE 例程已经关闭。 
    SQL> startup nomount 
    ORACLE 例程已经启动。 
    Total System Global Area 135338868 bytes 
    Fixed Size 453492 bytes 
    Variable Size 109051904 bytes 
    Database Buffers 25165824 bytes 
    Redo Buffers 667648 bytes 
    SQL> @d:\controlfile.sql 
    控制文件已创建 
    4.恢复数据库 
    SQL> recover database using backup controlfile until cancel; 
    ORA-00279: ?? 523637 (? 12/23/2008 20:52:22 ??) ???? 1 ???? 
    ORA-00289: ??: C:\ORACLE9I\RDBMS\ARC00005.001 
    ORA-00280: ?? 523637 ???? 1 ???? # 5 ??? 
    指定日志: {<RET>=suggested | filename | AUTO | CANCEL} 
    cancel 
    介质恢复已取消。 
    SQL> recover database using backup controlfile until cancel; 
    ORA-00279: ?? 523637 (? 12/23/2008 20:52:22 ??) ???? 1 ???? 
    ORA-00289: ??: C:\ORACLE9I\RDBMS\ARC00005.001 
    ORA-00280: ?? 523637 ???? 1 ???? # 5 ??? 
    指定日志: {<RET>=suggested | filename | AUTO | CANCEL} 
    cancel 
    介质恢复已取消。 
    SQL> alter database open resetlogs; 
    数据库已更改。 
    进行数据库的全备份,resetlogs后以前的备份不可以用。 
    说明:此处新建实例的作用就是不需要创建参数文件、oracle服务。(创建实例时,这些都已经创建好了,此时只需要用备份的数据文件代替新创建实例的数据文件)。
      

  4.   

    我重新安装了ORACLE,把所有的文件都替换了,已解决上述问题,谢谢楼上几位的指导!