1. 程式人生 > >Linux下Oracle 數據文件被物理誤刪除的恢復

Linux下Oracle 數據文件被物理誤刪除的恢復

oracle linux 數據文件被物理誤刪除的恢復

#加深對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]

/* */ >select table_name from user_tables;


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 數據文件被物理誤刪除的恢復