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

dawn009發表於2014-02-26

 -----轉載於:http://blog.csdn.net/leshami/article/details/8179253
最近在使用swingbench的時候碰到了ORA-01157故障,下面是其具體描述與解決。

  1. 1、故障現象  
  2. --查詢檢視dba_data_files時出現ORA-01157故障  
  3. SQL> select file_name,tablespace_name from dba_data_files where tablespace_name='SOE';  
  4. select file_name,tablespace_name from dba_data_files where tablespace_name='SOE'  
  5.                                       *  
  6. ERROR at line 1:  
  7. ORA-01157: cannot identify/lock data file 6 - see DBWR trace file  
  8. ORA-01110: data file 6: '/u01/oracle/db/dbs/soe.dbf'  
  9.   
  10. --嘗試drop tablespace 收到同樣的錯誤  
  11. SQL> drop tablespace soe including contents and datafiles;  
  12. drop tablespace soe including contents and datafiles  
  13. *  
  14. ERROR at line 1:  
  15. ORA-01157: cannot identify/lock data file 6 - see DBWR trace file  
  16. ORA-01110: data file 6: '/u01/oracle/db/dbs/soe.dbf'  
  17.   
  18. 2、分析  
  19. --從錯誤號後的文字可判斷DBWR不能識別或鎖定檔案號6,後面的ORA-01110給出了具體的檔案位置  
  20. --下面是錯誤號對應的具體描述  
  21. SQL> ho oerr ora 01157  
  22. 01157, 00000, "cannot identify/lock data file %s - see DBWR trace file"  
  23. // *Cause:  The background process was either unable to find one of the data  
  24. //         files or failed to lock it because the file was already in use.  
  25. //         The database will prohibit access to this file but other files will  
  26. //         be unaffected. However the first instance to open the database will  
  27. //         need to access all online data files. Accompanying error from the  
  28. //         operating system describes why the file could not be identified.  
  29. // *Action: Have operating system make file available to databaseThen either  
  30. //         open the database or do ALTER SYSTEM CHECK DATAFILES.  
  31.   
  32. --上面的描述指出了後臺程式不能尋找到資料檔案或者是因為檔案在被其他程式使用而DBWR無法對其鎖定。  
  33. --對於象這類檔案資料庫將禁止對其進行訪問,而其他資料檔案則不受影響。  
  34. --給出的決辦法是確認錯誤號後的資料檔案是否存在或可用,以及在open狀態下執行ALTER SYSTEM CHECK DATAFILES命令  
  35.   
  36. 3、解決  
  37. --嘗試執行alter system check datafiles  
  38. SQL> alter system check datafiles;  
  39.   
  40. System altered.  
  41.   
  42. --執行後故障依舊如下  
  43. SQL> select file_name,tablespace_name from dba_data_files where tablespace_name='SOE';  
  44. select file_name,tablespace_name from dba_data_files where tablespace_name='SOE'  
  45.                                       *  
  46. ERROR at line 1:  
  47. ORA-01157: cannot identify/lock data file 6 - see DBWR trace file  
  48. ORA-01110: data file 6: '/u01/oracle/db/dbs/soe.dbf'  
  49.   
  50. --檢視資料字典記錄的資訊表明當前的表空間為online狀態  
  51. SQL> select tablespace_name,status,contents from dba_tablespaces where tablespace_name='SOE';  
  52.   
  53. TABLESPACE_NAME                STATUS    CONTENTS  
  54. ------------------------------ --------- ---------  
  55. SOE                            ONLINE    PERMANENT  
  56.   
  57. --檢視alert日誌檔案,也給出了該錯誤提示,提示給出了tarce檔案  
  58. oracle@v2048db01p:/u01/oracle/admin/SYISDB/bdump> tail -8 alert_SYISDB1.log  
  59. Additional information: 3  
  60. Tue Nov 13 09:43:17 2012  
  61. Errors in file /u01/oracle/admin/SYISDB/bdump/syisdb1_dbw0_5925.trc:  
  62. ORA-01186: file 6 failed verification tests  
  63. ORA-01157: cannot identify/lock data file 6 - see DBWR trace file  
  64. ORA-01110: data file 6: '/u01/oracle/db/dbs/soe.dbf'  
  65. Tue Nov 13 09:43:17 2012  
  66. File 6 not verified due to error ORA-01157  
  67.   
  68. --檢視錶空間soe對應的資料檔案是否存在  
  69. oracle@v2048db01p:~> export ORACLE_SID=+ASM1  
  70. oracle@v2048db01p:~> asmcmd  
  71. ASMCMD> cd +DG2/SYISDB/DATAFILE  
  72. ASMCMD> ls  
  73. CCDATA.289.799174049  
  74. SYSAUX.260.796819341  
  75. SYSTEM.259.796819335  
  76. UNDOTBS1.261.796819339  
  77. UNDOTBS2.257.796819343  
  78. USERS.256.796819343  
  79. X.290.799234531  
  80. ccdata.dbf  
  81.   
  82. ASMCMD> ls *soe*   --#沒有任何含soe的資料檔案  
  83. asmcmd: entry '*soe*' does not exist in directory '+DG2/SYISDB/DATAFILE/'  
  84. ASMCMD> ls *SOE*   --#沒有任何含soe的資料檔案,由此可知表空間soe對應的資料檔案已經丟失  
  85. asmcmd: entry '*SOE*' does not exist in directory '+DG2/SYISDB/DATAFILE/'  
  86.   
  87. --因此直接刪除該表空間及資料檔案,注,生產環境不建議此操作  
  88. SQL> alter database datafile 6 offline drop;  
  89.   
  90. Database altered.  
  91.   
  92. --再次檢視資料字典資訊,依然處於Online狀態  
  93. --Author : Robinson  
  94. --Blog   : http://blog.csdn.net/robinson_0612  
  95. SQL> select tablespace_name,status,contents from dba_tablespaces where tablespace_name='SOE';  
  96.   
  97. TABLESPACE_NAME                STATUS    CONTENTS  
  98. ------------------------------ --------- ---------  
  99. SOE                            ONLINE    PERMANENT  
  100.   
  101. --下面的查詢貌似也有問題,對應的資料檔案在上一命令中已經清除了,而此時依舊顯示AVAILABLE  
  102. SQL> col file_name format a55  
  103. SQL> set linesize 160  
  104. SQL> select file_name,tablespace_name,status  from dba_data_files where tablespace_name='SOE';  
  105.   
  106. FILE_NAME                                TABLESPACE_NAME                STATUS  
  107. ---------------------------------------- ------------------------------ ---------  
  108. /u01/oracle/db/dbs/soe.dbf               SOE                            AVAILABLE  
  109.   
  110. --嘗試在該表空間建立物件,收到了ORA-01658錯誤  
  111. SQL> create table t tablespace soe as select * from dba_objects;  
  112. create table t tablespace soe as select * from dba_objects  
  113.                                                *  
  114. ERROR at line 1:  
  115. ORA-01658: unable to create INITIAL extent for segment in tablespace SOE  
  116.   
  117. --檢視對應的錯誤資訊  
  118. --錯誤資訊表明沒有足夠的連續空間分配初始extent.  
  119. SQL> ho oerr ora 01658  
  120. 01658, 00000, "unable to create INITIAL extent for segment in tablespace %s"  
  121. // *Cause:  Failed to find sufficient contiguous space to allocate INITIAL  
  122. //          extent for segment being created.  
  123. // *Action: Use ALTER TABLESPACE ADD DATAFILE to add additional space to the  
  124. //          tablespace or retry with a smaller value for INITIAL  
  125.   
  126. --再次檢視狀態,發現此時對應的資料檔案為RECOVER  
  127. SQL> col file_name format a40  
  128. SQL> select file_name,tablespace_name,status,ONLINE_STATUS from dba_data_files where tablespace_name='SOE';  
  129.   
  130. FILE_NAME                                TABLESPACE_NAME                STATUS    ONLINE_  
  131. ---------------------------------------- ------------------------------ --------- -------  
  132. /u01/oracle/db/dbs/soe.dbf               SOE                            AVAILABLE RECOVER  
  133.   
  134. --檢視v$recover_file檢視,給出檔案未找到OFFLINE FILE NOT FOUND  
  135. SQL> select * from v$recover_file;  
  136.   
  137.      FILE# ONLINE  ONLINE_ ERROR                                                                CHANGE# TIME  
  138. ---------- ------- ------- ----------------------------------------------------------------- ---------- ------------------  
  139.          6 OFFLINE OFFLINE FILE NOT FOUND                                                             0  
  140.   
  141. --檢視對應的資料檔案也不存在  
  142. SQL> ho ls -hltr /u01/oracle/db/dbs/soe.dbf  
  143. ls: /u01/oracle/db/dbs/soe.dbf: No such file or directory  
  144.   
  145. --刪除整個表空間及資料檔案  
  146. SQL> drop tablespace soe including contents and datafiles;  
  147.   
  148. Tablespace dropped.  
  149.   
  150. --下面的查詢表示表空間soe已經被徹底清除  
  151. SQL> select * from v$recover_file;  
  152.   
  153. no rows selected  
  154.   
  155. SQL>  select file_name,tablespace_name,status,ONLINE_STATUS from dba_data_files where tablespace_name='SOE';  
  156.   
  157. no rows selected  

總結:
  ORA-01157通常由後臺程式DBWR鎖定而產生。
  如果在恢復期間,如資料庫已經mount,而一個或多個資料檔案不能開啟導致資料庫不能open時會出現該提示。
  資料檔案丟失,資料檔案的許可問題,如資料檔案oracle使用者沒有寫許可權等都會產生ORA-01157。
  如果open狀態的情形下,ORA-01157未列出的資料檔案不會受到影響。

 

補充說明:
  細心的朋友應該可能已經發現當時在檢查對應的資料檔案的時候,只檢查了ASM磁碟是否存在對應的資料檔案。
  由於出錯資料庫為RAC,因此忽略了檢查提示中的檔案系統對應的資料檔案。說來還是不夠仔細,狂汗......
  就其原因應該是這樣,在使用swingbench時,建立soe表空間時直接一路next,導致將資料檔案建立到了檔案系統,而檔案系統是非共享的。(RAC環境)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29119536/viewspace-1093520/,如需轉載,請註明出處,否則將追究法律責任。

相關文章