萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> 資料庫綜合

ORA-01157 無法識別/鎖定資料檔:四大故障場景與標準恢復流程

ORA-01157: cannot identify/lock data file - see DBWR trace file 伴隨 ORA-01110 指明具體檔案編號與路徑,表示 DBWR 背景進程無法存取該資料檔。本文針對四大典型場景 (檔案遷移/重命名、檔案遺失損壞、臨時表空間檔案遺失、OS/儲存層故障) 提供標準化恢復 SOP。

錯誤訊息結構

ORA-01157: cannot identify/lock data file 5 - see DBWR trace file
ORA-01110: data file 5: '/u01/oradata/users01.dbf'
-- DBWR Trace 內容:
ORA-27037: unable to obtain file status
SVR4 Error: 2: No such file or directory

場景一:檔案存在但路徑/名稱變更 (OS 層重命名/移動)

原則:讓 Control File 記錄的路徑與實體檔案一致。

資料庫 OPEN 狀態 (Online Rename)

  1. 查詢該 Tablespace 所有檔案狀態:
    SELECT file_name, status FROM dba_data_files WHERE tablespace_name = 'USERS';
  2. 確認所有檔案 STATUS = AVAILABLE
  3. 將 Tablespace 設為 READ ONLY (確保無寫入):
    ALTER TABLESPACE users READ ONLY;
  4. 驗證:SELECT tablespace_name, status FROM dba_tablespaces WHERE tablespace_name='USERS'; → READ ONLY
  5. OS 層複製/移動檔案至新路徑
  6. Tablespace OFFLINE:ALTER TABLESPACE users OFFLINE;
  7. 資料庫層重命名 (自動更新 Control File):
    ALTER DATABASE RENAME FILE
      '/old/path/users01.dbf' TO '/new/path/users01.dbf';
  8. Tablespace ONLINE:ALTER TABLESPACE users ONLINE;
  9. 恢復 READ WRITE:ALTER TABLESPACE users READ WRITE;
  10. OS 層刪除舊檔案

資料庫 MOUNT 狀態 (Shutdown Rename)

  1. SHUTDOWN IMMEDIATE
  2. OS 層複製/移動檔案至新路徑
  3. STARTUP MOUNT (讀取 Control File,不開啟 Data Files)
  4. ALTER DATABASE RENAME FILE '/old/path/users01.dbf' TO '/new/path/users01.dbf';
  5. ALTER DATABASE OPEN;

場景二:檔案實際遺失或損壞 (OS Error 2/27046)

兩大策略:重建表空間 (適用非關鍵表空間、正常關閉) vs 備份恢復 (適用關鍵表空間、有備份、Archive 模式)

策略 A:重建表空間 (USERS/TEMP/INDEX、正常關閉、無作用 Undo)

  1. STARTUP MOUNT
  2. ALTER DATABASE DATAFILE '/path/lost.dbf' OFFLINE DROP;
  3. ALTER DATABASE OPEN;
  4. DROP TABLESPACE users INCLUDING CONTENTS AND DATAFILES;
  5. CREATE TABLESPACE users DATAFILE '/new/path/users01.dbf' SIZE 100M AUTOEXTEND ON;
  6. 重建物件 (DDL 腳本 / IMPDP / 近期 Export Dump)

策略 B:備份恢復 (System/Undo/關鍵業務、Archive 模式)

  1. 從備份還原遺失/損壞 Data File 至原路徑或新路徑 (新路徑需 RENAME FILE)
  2. STARTUP MOUNT
  3. 查詢所需 Archived Log 範圍:
    SELECT file#, change# FROM v$recover_file;
    SELECT group#, member, sequence#, first_change# FROM v$log v1, v$logfile v2 WHERE v1.group#=v2.group#;
  4. 非歸檔模式:若 change# > min(first_change#) 可用 Online Redo 恢復,否則只能重建表空間/全庫恢復
  5. 歸檔模式:RECOVER DATAFILE '/path/restored.dbf'; → 提示 Media recovery complete
  6. ALTER DATABASE OPEN; (若用備份控制檔則 OPEN RESETLOGS)

場景三:臨時表空間資料檔遺失

不影響資料庫 OPEN (Tempfile 無 Checkpoint):

ALTER DATABASE TEMPFILE '/path/temp01.dbf' DROP;
ALTER TABLESPACE temp ADD TEMPFILE '/path/temp01.dbf' SIZE 100M AUTOEXTEND ON;

場景四:OS/儲存層故障 (LUN 離線、多路徑斷裂、權限變更)

  1. 儲存/OS 層修復:掛載 LUN、修復多路徑、恢復檔案權限 (Oracle 安裝擁有者讀寫)
  2. 驗證:ls -l /u01/oradata/users01.dbf、dd if=/u01/oradata/users01.dbf of=/dev/null bs=8k count=1 可讀寫
  3. 資料庫層:若資料庫因檔案不可用已 Crash → STARTUP 自動 Instance Recovery
  4. 若資料庫仍 OPEN 但該檔案 OFFLINE:ALTER DATABASE DATAFILE '/path/users01.dbf' ONLINE; (若需恢復則先 RECOVER DATAFILE)

關鍵驗證查詢

-- 確認所有資料檔線上
SELECT file#, name, status, enabled FROM v$datafile WHERE status <> 'ONLINE';

-- 確認表空間狀態
SELECT tablespace_name, status FROM dba_tablespaces;

-- 確認是否需媒體恢復
SELECT file#, error, change#, time FROM v$recover_file;

依場景選擇正確流程,嚴禁在不明根因下嘗試 RESETLOGS 或 DROP TABLESPACE,避免不可逆的資料損失。

copyright © 萬盛學電腦網 all rights reserved