今天用本地数据库做表空间测试,在扩展表空间时,因为输错了扩展文件名,就把该外部文件删了。结果,提示“监听失败”,sqlplus和pl/sql developer都不能登录。经搜索查找资料,终于恢复了登录。解决方法如下:(感谢张航的博客)
(当时把文件名输错了:ALTER TABLESPACE sp001 ADD DATAFILE 'd:\sp001.bf' SIZE 100m; 事后就把sp001.bf文件删了)
- Microsoft Windows [版本 6.1.7601]
- 版权所有 (c) 2009 Microsoft Corporation。保留所有权利。
- C:\Users\Administrator>set ORACLE_SID=orcl
- C:\Users\Administrator>sqlplus / as sysdba
- SQL*Plus: Release 10.2.0.1.0 - Production on 星期二 10月 23 16:09:58 2012
- Copyright (c) 1982, 2005, Oracle. All rights reserved.
- 连接到:
- Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
- With the Partitioning, OLAP and Data Mining options
- SQL> shutdown immediate
- ORA-01109: 数据库未打开
- 已经卸载数据库。
- ORACLE 例程已经关闭。
- SQL> startup
- ORACLE 例程已经启动。
- Total System Global Area 293601280 bytes
- Fixed Size 1248600 bytes
- Variable Size 88081064 bytes
- Database Buffers 197132288 bytes
- Redo Buffers 7139328 bytes
- 数据库装载完毕。
- ORA-01157: 无法标识/锁定数据文件 7 - 请参阅 DBWR 跟踪文件
- ORA-01110: 数据文件 7: 'D:\TBS01.DBF'
- SQL> shutdown immediate
- ORA-01109: 数据库未打开
- 已经卸载数据库。
- ORACLE 例程已经关闭。
- SQL> startup mount
- ORACLE 例程已经启动。
- Total System Global Area 293601280 bytes
- Fixed Size 1248600 bytes
- Variable Size 88081064 bytes
- Database Buffers 197132288 bytes
- Redo Buffers 7139328 bytes
- 数据库装载完毕。
- SQL> recover datafile 2
- ORA-00283: 恢复会话因错误而取消
- ORA-00264: 不要求恢复
- SQL> recover datafile 7
- ORA-00283: 恢复会话因错误而取消
- ORA-01110: 数据文件 7: 'D:\TBS01.DBF'
- ORA-01157: 无法标识/锁定数据文件 7 - 请参阅 DBWR 跟踪文件
- ORA-01110: 数据文件 7: 'D:\TBS01.DBF'
- SQL> startup
- ORA-01081: 无法启动已在运行的 ORACLE - 请首先关闭它
- SQL> recover datafile 7
- ORA-00283: 恢复会话因错误而取消
- ORA-01110: 数据文件 7: 'D:\TBS01.DBF'
- ORA-01157: 无法标识/锁定数据文件 7 - 请参阅 DBWR 跟踪文件
- ORA-01110: 数据文件 7: 'D:\TBS01.DBF'
- SQL> select flashback_on from vdatabase
- 2 ;
- select flashback_on from vdatabase
- *
- 第 1 行出现错误:
- ORA-01219: 数据库未打开: 仅允许在固定表/视图中查询
- SQL> recover datafile 'd:/tbs01.dbf'
- ORA-00283: 恢复会话因错误而取消
- ORA-01110: 数据文件 7: 'D:\TBS01.DBF'
- ORA-01157: 无法标识/锁定数据文件 7 - 请参阅 DBWR 跟踪文件
- ORA-01110: 数据文件 7: 'D:\TBS01.DBF'
- SQL> select file_name,file_id,tablespace_name from dba_data_files;
- select file_name,file_id,tablespace_name from dba_data_files
- *
- 第 1 行出现错误:
- ORA-01219: 数据库未打开: 仅允许在固定表/视图中查询
- SQL> col file_name format a100;
- SQL> select file_name,file_id,tablespace_name from dba_data_files;
- select file_name,file_id,tablespace_name from dba_data_files
- *
- 第 1 行出现错误:
- ORA-01219: 数据库未打开: 仅允许在固定表/视图中查询
- SQL> startup mount;
- ORA-01081: 无法启动已在运行的 ORACLE - 请首先关闭它
- SQL> alter session set nls_language=american;
- Session altered.
- SQL> alter database open;
- alter database open
- *
- ERROR at line 1:
- ORA-01157: cannot identify/lock data file 7 - see DBWR trace file
- ORA-01110: data file 7: 'D:\TBS01.DBF'
- SQL> startup nomount;
- ORA-01081: 无法启动已在运行的 ORACLE - 请首先关闭它
- SQL> alter database mount;
- alter database mount
- *
- ERROR at line 1:
- ORA-01100: 数据库已装载
- SQL> alter session set nls_language=american;
- Session altered.
- SQL> alter database datafile 'd:\TBS01.dbf' offline drop;
- Database altered.
- SQL> alter database open;
- alter database open
- *
- ERROR at line 1:
- ORA-01157: cannot identify/lock data file 8 - see DBWR trace file
- ORA-01110: data file 8: 'D:\TBS02.DBF'
- SQL> alter database datafile 'd:\TBS02.dbf' offline drop;
- Database altered.
- SQL> alter database datafile 'd:\TBS03.dbf' offline drop;
- Database altered.
- SQL> alter database datafile 'd:\TBS04.dbf' offline drop;
- Database altered.
- SQL> alter database open;
- alter database open
- *
- ERROR at line 1:
- ORA-01157: cannot identify/lock data file 11 - see DBWR trace file
- ORA-01110: data file 11: 'D:\TBS05.DBF'
- SQL> alter database datafile 'd:\TBS05.dbf' offline drop;
- Database altered.
- SQL> alter database open;
- Database altered.
- SQL>
至此,修复完成,可以正常登陆。
原理:数据库启动到nomount状态,找到初始化参数文件(inittestDB.ora),根据这个定位到控制文件。控制文件中记录着数据库的文件结构信息(当然不止文件结构信息),比如:有哪些数据文件,日志文件数据文件的状态(online offline),但数据库在open 的时候并不查看offline状态下的datafile,所以将datafile offline,数据库不检查这个数据文件里,就可以打开。注意这里的数据文件只是用户数据文件,若是系统数据文件,另要考虑了。数据库启动到mount状态了,这时实例和硬盘上的数据库要关联了。处于这个状态时,可执行些管理型的任务,比如恢复。