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
原則:讓 Control File 記錄的路徑與實體檔案一致。
SELECT file_name, status FROM dba_data_files WHERE tablespace_name = 'USERS';
STATUS = AVAILABLEALTER TABLESPACE users READ ONLY;
SELECT tablespace_name, status FROM dba_tablespaces WHERE tablespace_name='USERS'; → READ ONLYALTER TABLESPACE users OFFLINE;ALTER DATABASE RENAME FILE
'/old/path/users01.dbf' TO '/new/path/users01.dbf';
ALTER TABLESPACE users ONLINE;ALTER TABLESPACE users READ WRITE;SHUTDOWN IMMEDIATESTARTUP MOUNT (讀取 Control File,不開啟 Data Files)ALTER DATABASE RENAME FILE '/old/path/users01.dbf' TO '/new/path/users01.dbf';ALTER DATABASE OPEN;兩大策略:重建表空間 (適用非關鍵表空間、正常關閉) vs 備份恢復 (適用關鍵表空間、有備份、Archive 模式)
STARTUP MOUNTALTER DATABASE DATAFILE '/path/lost.dbf' OFFLINE DROP;ALTER DATABASE OPEN;DROP TABLESPACE users INCLUDING CONTENTS AND DATAFILES;CREATE TABLESPACE users DATAFILE '/new/path/users01.dbf' SIZE 100M AUTOEXTEND ON;RENAME FILE)STARTUP MOUNTSELECT file#, change# FROM v$recover_file;
SELECT group#, member, sequence#, first_change# FROM v$log v1, v$logfile v2 WHERE v1.group#=v2.group#;
change# > min(first_change#) 可用 Online Redo 恢復,否則只能重建表空間/全庫恢復RECOVER DATAFILE '/path/restored.dbf'; → 提示 Media recovery completeALTER 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;
ls -l /u01/oradata/users01.dbf、dd if=/u01/oradata/users01.dbf of=/dev/null bs=8k count=1 可讀寫STARTUP 自動 Instance RecoveryALTER 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,避免不可逆的資料損失。