Linux下Oracle 數據文件被物理誤刪除的恢復
#加深對Linux句柄的理解/緊急情況下Oracle的快速恢復
不同於從Oracle中drop掉數據文件,在某些情況下,可能會遇到數據庫在運行時數據文件在操作系統級別被刪除,而此時Oracle實例並未崩潰,仍然處於open狀態。此時就要求盡量在最小的影響下最高效率地完成恢復。現將恢復過程整理出來,以備不時之需。
<<過程模擬>>
<STEP 1>模擬刪除
[email protected] >select name from v$datafile;
NAME
--------------------------------------------------
/ora_data/icsdb/system01.dbf
/ora_data/icsdb/sysaux01.dbf
/ora_data/icsdb/undotbs01.dbf
/ora_data/icsdb/users01.dbf
/ora_data/icsdb/icsdb01.bdf
/ora_data/icsdb/hr01.dbf
已選擇6行。
[[email protected] icsdb]# ls -ld icsdb01.bdf
-rw-r-----. 1 oracle oinstall 1073750016 5月 25 16:24 icsdb01.bdf
檢查一下數據看看當前表和數據條數,有3個表
[email protected]
TABLE_NAME
------------------------------------------------------------------------------------------
SC
COURSE
STUDENT
已student表為例,說明表中有39條數據
[email protected] >select count(*) from student;
COUNT(*)
----------
39
insert into student values(200216303,‘王偉‘,‘男‘,33,‘IS‘);
刪除測試數據文件
[[email protected] icsdb]# rm -rf /oracle_data/icsdb/icsdb01.dbf
SQL> ho rm /oracle_data/icsdb/icsdb01.dbf --刪除用戶數據文件;
在查看數據文件已經不在了
[[email protected] icsdb]# ls -ld icsdb01.bdf
ls: 無法訪問icsdb01.bdf: 沒有那個文件或目錄
這裏千萬不要重啟數據庫,否則就真丟了
<STEP 2>通過句柄恢復數據文件--先找出db writer所對應的PID(3742)
[[email protected] icsdb]# ps -ef|grep dbw0|grep -v grep
oracle 3742 1 0 11:13 ? 00:00:00 ora_dbw0_icsdb
--再找出被進程所刪除文件的句柄(3742),可能會有多個進程,本處只有一個
[[email protected] icsdb]# ls -l /proc/3742/fd | grep deleted
lrwx------. 1 oracle oinstall 64 5月 25 16:36 263 -> /ora_data/icsdb/icsdb01.bdf (deleted)
--將被刪數據文件的句柄拷貝回數據文件,先備份到tmp下
[[email protected] icsdb]# cp /proc/3742/fd/263 /tmp/icsdb01.dbf
重啟數據庫測試恢復,關閉數據庫關閉不掉會報錯
[email protected] >shutdown immediate;
ORA-01116: 打開數據庫文件 5 時出錯
ORA-01110: 數據文件 5: ‘/ora_data/icsdb/icsdb01.bdf‘
ORA-27041: 無法打開文件
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
強制關閉數據庫
[email protected] >shutdown abort
ORACLE 例程已經關閉。
啟動數據庫測試,啟動只能啟動到mount狀態,open不了
[email protected] >startup
ORACLE 例程已經啟動。
Total System Global Area 471830528 bytes
Fixed Size 2254344 bytes
Variable Size 360712696 bytes
Database Buffers 104857600 bytes
Redo Buffers 4005888 bytes
數據庫裝載完畢。
ORA-01157: 無法標識/鎖定數據文件 5 - 請參閱 DBWR 跟蹤文件 ORA-01110:
數據文件 5: ‘/ora_data/icsdb/icsdb01.bdf‘
[email protected] >select instance_name,status from v$instance;
INSTANCE_NAME STATUS
------------------------------------------------ ------------------------------------
icsdb MOUNTED
將數據文件拷貝會原來目錄,並修改屬組為oracle
[[email protected] tmp]# mv icsdb01.dbf /ora_data/icsdb/
[[email protected] icsdb]# chown oracle:oinstall icsdb01.dbf
alter tablespace ICSDB rename DATAFILE ‘/ora_data/icsdb/icsdb01.bdf‘ to ‘/ora_data/icsdb/icsdb01.dbf‘;
<STEP 3>通過日誌恢復事務
接下來便是事務的恢復操作,分為兩種情況:
1)對於歸檔模式,只需簡單offline掉數據文件,進行recover最後再將數據文件online即可,如:
SQL> alter database datafile 4 offline;
Database altered.
SQL> recover datafile 4;
Media recovery complete.
SQL> alter database datafile 4 online;
Database altered.
2)如果是非歸檔,那麽作offline datafile的時候會遇到ORA-01145錯誤,但是可以在copy完文件句柄之後,
嘗試offline tablespace,然後再online tablespace,這時候會要求恢復之前誤刪除的文件,如果日誌組還沒有切換到全部覆蓋,那麽recover是可以成功的。
SQL> alter tablespace users offline;
Tablespace altered.
SQL> recover datafile 4 ;
Media recovery complete.
SQL> alter tablespace users online;
Tablespace altered.
至此恢復完成!
<<恢復原理>>
在Linux操作系統中,如果文件從操作系統級別被rm掉,之前打開該文件的進程仍然持有相應的文件句柄,所指向的文件仍然可以讀寫,
並且該文件的文件描述符可以從/proc目錄中獲得。但是要註意的是,此時如果關閉數據庫,則此句柄會消失,那麽除了掃描磁盤進行文件恢復之外就沒有 其它方法了,
因此在數據庫出現問題的時候,如果不確認情況的復雜程度,千萬不要隨便關閉數據庫。重啟數據庫往往是沒有意義的,甚至是致命的。
另:rm操作始終是系統上最危險的區域,需謹慎駕駛!
本文出自 “學習像樹一樣活著” 博客,請務必保留此出處http://laobaiv1.blog.51cto.com/2893832/1948152
Linux下Oracle 數據文件被物理誤刪除的恢復