ORA-01157: cannot identify/lock data file n 故障一例

  1. 云栖社区>
  2. 博客>
  3. 正文

ORA-01157: cannot identify/lock data file n 故障一例

leshami 2012-11-13 16:46:42 浏览552
展开阅读全文

    最近在使用swingbench的时候碰到了ORA-01157故障,下面是其具体描述与解决。

1、故障现象
--查询视图dba_data_files时出现ORA-01157故障
SQL> select file_name,tablespace_name from dba_data_files where tablespace_name='SOE';
select file_name,tablespace_name from dba_data_files where tablespace_name='SOE'
                                      *
ERROR at line 1:
ORA-01157: cannot identify/lock data file 6 - see DBWR trace file
ORA-01110: data file 6: '/u01/oracle/db/dbs/soe.dbf'

--尝试drop tablespace 收到同样的错误
SQL> drop tablespace soe including contents and datafiles;
drop tablespace soe including contents and datafiles
*
ERROR at line 1:
ORA-01157: cannot identify/lock data file 6 - see DBWR trace file
ORA-01110: data file 6: '/u01/oracle/db/dbs/soe.dbf'

2、分析
--从错误号后的文字可判断DBWR不能识别或锁定文件号6,后面的ORA-01110给出了具体的文件位置
--下面是错误号对应的具体描述
SQL> ho oerr ora 01157
01157, 00000, "cannot identify/lock data file %s - see DBWR trace file"
// *Cause:  The background process was either unable to find one of the data
//         files or failed to lock it because the file was already in use.
//         The database will prohibit access to this file but other files will
//         be unaffected. However the first instance to open the database will
//         need to access all online data files. Accompanying error from the
//         operating system describes why the file could not be identified.
// *Action: Have operating system make file available to database. Then either
//         open the database or do ALTER SYSTEM CHECK DATAFILES.

--上面的描述指出了后台进程不能寻找到数据文件或者是因为文件在被其他进程使用而DBWR无法对其锁定。
--对于象这类文件数据库将禁止对其进行访问,而其他数据文件则不受影响。
--给出的决办法是确认错误号后的数据文件是否存在或可用,以及在open状态下执行ALTER SYSTEM CHECK DATAFILES命令

3、解决
--尝试执行alter system check datafiles
SQL> alter system check datafiles;

System altered.

--执行后故障依旧如下
SQL> select file_name,tablespace_name from dba_data_files where tablespace_name='SOE';
select file_name,tablespace_name from dba_data_files where tablespace_name='SOE'
                                      *
ERROR at line 1:
ORA-01157: cannot identify/lock data file 6 - see DBWR trace file
ORA-01110: data file 6: '/u01/oracle/db/dbs/soe.dbf'

--查看数据字典记录的信息表明当前的表空间为online状态
SQL> select tablespace_name,status,contents from dba_tablespaces where tablespace_name='SOE';

TABLESPACE_NAME                STATUS    CONTENTS
------------------------------ --------- ---------
SOE                            ONLINE    PERMANENT

--查看alert日志文件,也给出了该错误提示,提示给出了tarce文件
oracle@v2048db01p:/u01/oracle/admin/SYISDB/bdump> tail -8 alert_SYISDB1.log
Additional information: 3
Tue Nov 13 09:43:17 2012
Errors in file /u01/oracle/admin/SYISDB/bdump/syisdb1_dbw0_5925.trc:
ORA-01186: file 6 failed verification tests
ORA-01157: cannot identify/lock data file 6 - see DBWR trace file
ORA-01110: data file 6: '/u01/oracle/db/dbs/soe.dbf'
Tue Nov 13 09:43:17 2012
File 6 not verified due to error ORA-01157

--查看表空间soe对应的数据文件是否存在
oracle@v2048db01p:~> export ORACLE_SID=+ASM1
oracle@v2048db01p:~> asmcmd
ASMCMD> cd +DG2/SYISDB/DATAFILE
ASMCMD> ls
CCDATA.289.799174049
SYSAUX.260.796819341
SYSTEM.259.796819335
UNDOTBS1.261.796819339
UNDOTBS2.257.796819343
USERS.256.796819343
X.290.799234531
ccdata.dbf

ASMCMD> ls *soe*   --#没有任何含soe的数据文件
asmcmd: entry '*soe*' does not exist in directory '+DG2/SYISDB/DATAFILE/'
ASMCMD> ls *SOE*   --#没有任何含soe的数据文件,由此可知表空间soe对应的数据文件已经丢失
asmcmd: entry '*SOE*' does not exist in directory '+DG2/SYISDB/DATAFILE/'

--因此直接删除该表空间及数据文件,注,生产环境不建议此操作
SQL> alter database datafile 6 offline drop;

Database altered.

--再次查看数据字典信息,依然处于Online状态
--Author : Robinson
--Blog   : http://blog.csdn.net/robinson_0612
SQL> select tablespace_name,status,contents from dba_tablespaces where tablespace_name='SOE';

TABLESPACE_NAME                STATUS    CONTENTS
------------------------------ --------- ---------
SOE                            ONLINE    PERMANENT

--下面的查询貌似也有问题,对应的数据文件在上一命令中已经清除了,而此时依旧显示AVAILABLE
SQL> col file_name format a55
SQL> set linesize 160
SQL> select file_name,tablespace_name,status  from dba_data_files where tablespace_name='SOE';

FILE_NAME                                TABLESPACE_NAME                STATUS
---------------------------------------- ------------------------------ ---------
/u01/oracle/db/dbs/soe.dbf               SOE                            AVAILABLE

--尝试在该表空间创建对象,收到了ORA-01658错误
SQL> create table t tablespace soe as select * from dba_objects;
create table t tablespace soe as select * from dba_objects
                                               *
ERROR at line 1:
ORA-01658: unable to create INITIAL extent for segment in tablespace SOE

--查看对应的错误信息
--错误信息表明没有足够的连续空间分配初始extent.
SQL> ho oerr ora 01658
01658, 00000, "unable to create INITIAL extent for segment in tablespace %s"
// *Cause:  Failed to find sufficient contiguous space to allocate INITIAL
//          extent for segment being created.
// *Action: Use ALTER TABLESPACE ADD DATAFILE to add additional space to the
//          tablespace or retry with a smaller value for INITIAL

--再次查看状态,发现此时对应的数据文件为RECOVER
SQL> col file_name format a40
SQL> select file_name,tablespace_name,status,ONLINE_STATUS from dba_data_files where tablespace_name='SOE';

FILE_NAME                                TABLESPACE_NAME                STATUS    ONLINE_
---------------------------------------- ------------------------------ --------- -------
/u01/oracle/db/dbs/soe.dbf               SOE                            AVAILABLE RECOVER

--查看v$recover_file视图,给出文件未找到OFFLINE FILE NOT FOUND
SQL> select * from v$recover_file;

     FILE# ONLINE  ONLINE_ ERROR                                                                CHANGE# TIME
---------- ------- ------- ----------------------------------------------------------------- ---------- ------------------
         6 OFFLINE OFFLINE FILE NOT FOUND                                                             0

--查看对应的数据文件也不存在
SQL> ho ls -hltr /u01/oracle/db/dbs/soe.dbf
ls: /u01/oracle/db/dbs/soe.dbf: No such file or directory

--删除整个表空间及数据文件
SQL> drop tablespace soe including contents and datafiles;

Tablespace dropped.

--下面的查询表示表空间soe已经被彻底清除
SQL> select * from v$recover_file;

no rows selected

SQL>  select file_name,tablespace_name,status,ONLINE_STATUS from dba_data_files where tablespace_name='SOE';

no rows selected

总结:
  ORA-01157通常由后台进程DBWR锁定而产生。
  如果在恢复期间,如数据库已经mount,而一个或多个数据文件不能打开导致数据库不能open时会出现该提示。
  数据文件丢失,数据文件的许可问题,如数据文件oracle用户没有写权限等都会产生ORA-01157。
  如果open状态的情形下,ORA-01157未列出的数据文件不会受到影响。

 

补充说明:
  细心的朋友应该可能已经发现当时在检查对应的数据文件的时候,只检查了ASM磁盘是否存在对应的数据文件。
  由于出错数据库为RAC,因此忽略了检查提示中的文件系统对应的数据文件。说来还是不够仔细,狂汗......
  就其原因应该是这样,在使用swingbench时,创建soe表空间时直接一路next,导致将数据文件创建到了文件系统,而文件系统是非共享的。(RAC环境)

 

更多参考:

ORA-01157错误解决

有关Oracle 网络配置相关基础以及概念性的问题请参考:
        配置ORACLE 客户端连接到数据库
        配置非默认端口的动态服务注册
        配置sqlnet.ora限制IP访问Oracle
       Oracle 监听器日志配置与管理
       设置 Oracle 监听器密码(LISTENER)
       Oracle RAC 监听配置
       ORACLE RAC 下非缺省端口监听配置(listener.ora tnsnames.ora)

       Oracle RAC 客户端连接负载均衡(Load Balance)

       配置RAC负载均衡与故障转移

   

有关基于用户管理的备份和备份恢复的概念请参

    Oracle 冷备份

    Oracle 热备份

    Oracle 备份恢复概念

    Oracle 实例恢复

    Oracle 基于用户管理恢复的处理

   SYSTEM 表空间管理及备份恢复

    SYSAUX表空间管理及恢复

   Oracle 基于备份控制文件的恢复(unsing backup controlfile)

 

有关RMAN的备份恢复与管理请参

    RMAN 概述及其体系结构

    RMAN 配置、监控与管理

    RMAN 备份详解

    RMAN 还原与恢复

    RMAN catalog 的创建和使用

    基于catalog 创建RMAN存储脚本

    基于catalog 的RMAN 备份与恢复

    RMAN 备份路径困惑

 

有关ORACLE体系结构请参

    Oracle 表空间与数据文件

    Oracle 密码文件

    Oracle 参数文件

    Oracle 联机重做日志文件(ONLINE LOG FILE)

    Oracle 控制文件(CONTROLFILE)

    Oracle 归档日志

    Oracle 回滚(ROLLBACK)和撤销(UNDO)

    Oracle 数据库实例启动关闭过程

    Oracle 10g SGA 的自动化管理

    Oracle 实例和Oracle数据库(Oracle体系结构)      

网友评论

登录后评论
0/500
评论
leshami
+ 关注