檔案描述符恢復rm掉的dbf

dotaddjj發表於2012-08-21

Eygle的最近的一本dba手記4上面說到了利用檔案描述符恢復意外刪除的資料檔案,雖然這本書最近還沒有入手,翻閱了一下文件做了一個測試,資料得到完全恢復,記錄如下:

[oracle@server119 admin]$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.5.0 - Production on Tue Aug 21 15:11:31 2012

Copyright (c) 1982, 2010, Oracle. All Rights Reserved.

Connected to:

Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bit Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> create tablespace rm datafile .dbf' size 50m;

Tablespace created.

SQL> conn xiaoyu/xiaoyu

Connected.

SQL> create table rm01 tablespace rm as select * from dba_Objects;

Table created.

SQL> select count(*) from rm01;

COUNT(*)

----------

52653

建立測試的資料檔案/db2/oracle10g/oradata/rm01和表rm01

[oracle@server119 ~]$ rm -rf /db2/oracle10g/oradata/rm01.dbf

Os上刪除資料檔案。

[oracle@server119 ~]$ sqlplus xiaoyu/xiaoyu

SQL*Plus: Release 10.2.0.5.0 - Production on Tue Aug 21 15:29:04 2012

Copyright (c) 1982, 2010, Oracle. All Rights Reserved.

Connected to:

Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bit Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> select count(*) from rm01;

COUNT(*)

----------

52653

這兒系統讀取的是記憶體的資訊,如果重新整理一下cache buffer,也就是標記記憶體的buffer為過期的。

SQL> alter system flush buffer_cache;

System altered.

SQL> select count(*) from rm01;

select count(*) from rm01

*

ERROR at line 1:

ORA-01116: error in opening database file 574

ORA-01110: data file 574: '/db2/oracle10g/oradata/rm01.dbf'

ORA-27041: unable to open file

Linux-x86_64 Error: 2: No such file or directory

Additional information: 3

存在兩個程式dbwn來對資料檔案進行操作。

[root@server119 fd]# lsof |grep /db2/oracle10g/oradata/rm01.dbf

oracle 2199 oracle 594uW REG 8,17 52436992 12648449 /db2/oracle10g/oradata/rm01.dbf (deleted)

oracle 2201 oracle 19u REG 8,17 52436992 12648449 /db2/oracle10g/oradata/rm01.dbf (deleted)

[root@server119 fd]# ps -ef|grep 2199

oracle 2199 1 0 15:24 ? 00:00:00 ora_dbw0_benguo

root 12226 12798 0 15:47 pts/11 00:00:00 grep 2199

[root@server119 fd]# ps -ef|grep 2201

oracle 2201 1 0 15:24 ? 00:00:00 ora_dbw1_benguo

root 12267 12798 0 15:47 pts/11 00:00:00 grep 2201

關於rm其實只是刪除了檔案的連線inode,檔案中所佔用的block並沒有被刪除,這點到和oracletruncatedrop原理差不多,可以看出系統的程式並沒有釋放,如果此時我們不關閉資料庫,那麼這個資料檔案是可以完全恢復出來的,而如果關閉資料檔案的連線程式則會釋放,可能引起資料丟失。

[root@server119 fd]# cp -a /proc/2199/fd/594 /db2/oracle10g/oradata/rm01.dbf

cp: 無法建立符號連結 /db2/oracle10g/oradata/rm01.dbf: 許可權不夠

[root@server119 fd]# cp /proc/2199/fd/594 /db2/oracle10g/oradata/rm01.dbf

[root@server119 fd]# ls -l /db2/oracle10g/oradata/rm01.dbf

-rw-r----- 1 root root 52436992 08-21 15:54 /db2/oracle10g/oradata/rm01.dbf

[root@server119 fd]# chown oracle:dba /db2/oracle10g/oradata/rm01.dbf

[root@server119 fd]# stat /db2/oracle10g/oradata/rm01.dbf

File: “/db2/oracle10g/oradata/rm01.dbf”

Size: 52436992 Blocks: 102536 IO Block: 4096 一般檔案

Device: 811h/2065d Inode: 12648450 Links: 1

Access: (0640/-rw-r-----) Uid: ( 500/ oracle) Gid: ( 501/ dba)

Access: 2012-08-21 15:54:18.000000000 +0800

Modify: 2012-08-21 15:54:18.000000000 +0800

Change: 2012-08-21 15:54:35.000000000 +0800

[root@server119 fd]# su - oracle

[oracle@server119 ~]$ sqlplus xiaoyu/xiaoyu

SQL*Plus: Release 10.2.0.5.0 - Production on Tue Aug 21 15:55:34 2012

Copyright (c) 1982, 2010, Oracle. All Rights Reserved.

Connected to:

Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bit Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> select count(*) from rm01;

COUNT(*)

----------

52653

而如果關閉了資料庫後由於程式已經釋放,已經無法利用檔案描述符恢復了。

SQL> startup force;

ORACLE instance started.

Total System Global Area 2.6844E+10 bytes

Fixed Size 2144984 bytes

Variable Size 855639336 bytes

Database Buffers 2.5971E+10 bytes

Redo Buffers 14630912 bytes

Database mounted.

ORA-01157: cannot identify/lock data file 574 - see DBWR trace file

ORA-01110: data file 574: '/db2/oracle10g/oradata/rm01.dbf'

此時lsof列出程式開啟的檔案中並沒有當時意外rm掉的檔案。

[root@server119 ~]# lsof |grep /db2/oracle10g/oradata/rm01.dbf

資料得到完全恢復,並不存在丟失,os結合oracle可以讓問題得到更輕鬆的解決。暫時還沒有測試asm檔案系統的利用lsof的效果,asm上也僅僅只是因為普通的cp無法使用,應該可以利用oracleftphttp功能來上傳資料檔案到asm磁碟。

所以當資料庫出現問題時,如果db是開啟的往往是幸運的,而如果馬上關閉將很可能引起一系列問題,當然有備份則不用過多擔心,在診斷問題時往往需要我們先冷靜,然後才去實際處理,現場往往是寶貴的。

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25362835/viewspace-1059232/,如需轉載,請註明出處,否則將追究法律責任。

相關文章