Linux 下 rm 刪除文件極難恢復,但若數據庫進程仍在運行,可通過 /proc 文件系統找回被刪除的數據文件。本文以實戰案例演示 Oracle 數據文件誤刪後的緊急恢復全過程。
測試環境誤執行 rm test01.dbf 刪除表空間數據文件,數據庫實例尚未重啟,進程 dbw0 (PID 3493) 仍持有文件句柄。
Linux 文件刪除後,若有進程持有打開句柄,文件實體仍存在於磁盤,可通過 /proc/PID/fd/ 訪問。數據庫進程未重啟前,文件描述符保持有效。
# 查找數據庫寫進程 dbw0
ps -ef | grep dbw0
# oracle 3493 1 0 21:10 ? 00:00:00 ora_dbw0_dbwdn
ls -l /proc/3493/fd/ | grep test01.dbf
# lrwx------ 1 oracle oinstall 64 Nov 27 21:52 22 -> /u01/app/oracle/oradata/dbwdn/test01.dbf (deleted)
關鍵標識:(deleted) 表示文件已刪除但句柄有效,22 為文件描述符編號。
cp /proc/3493/fd/22 /u01/app/oracle/oradata/dbwdn/test01.dbf
ls -l /u01/app/oracle/oradata/dbwdn/test01.dbf
# -rw-r----- 1 oracle dba 26222592 Nov 27 21:52 test01.dbf
sqlplus "/as sysdba"
SQL> ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/dbwdn/test01.dbf' ONLINE;
SQL> ALTER TABLESPACE TEST ONLINE;
rm 數據文件,應通過 DROP TABLESPACE ... INCLUDING CONTENTS AND DATAFILES 刪除RMAN 定期備份,建立多層次恢復策略chattr +i 防誤刪此方法同樣適用於 MySQL、PostgreSQL 等數據庫,以及任何進程持有打開句柄的文件誤刪場景。
掌握 /proc 文件系統恢復技巧,關鍵時刻可挽回數據資產,是 Linux 運維必備硬核技能。