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