使用檔案描述符恢復誤刪除的資料檔案

hooca發表於2016-06-06
OS:Oracle Linux 5u8 x64
DB:Oracle 11.2.0.4

在Oracle執行時,如果誤刪除了資料檔案,可以通過如下方式恢復。前提是不能關閉Oracle程式。因為檔案在用命令刪除時,並未立刻在磁碟上被刪除,其控制程式碼扔被程式訪問,因此一旦程式終止,將無法找回檔案。

另有一點注意,對於使用者表空間(如USERS),可用如下方式恢復。但如果是SYSTEM表空間則不可以,因為刪除SYSTEM表空間後,已無法使用sqlplus登入。

下面開始實驗。

資料庫已開啟,其下有資料檔案

點選(此處)摺疊或開啟

  1. $ cd /oradata/APR/datafile/
  2. [oracle@apr datafile]$ ll
  3. total 4690612
  4. -rw-r----- 1 oracle oinstall 597696512 Jun 6 23:04 o1_mf_sysaux_chzbv7op_.dbf
  5. -rw-r----- 1 oracle oinstall 786440192 Jun 6 23:04 o1_mf_system_chzbv7mg_.dbf
  6. -rw-r----- 1 oracle oinstall 30416896 Jun 6 23:06 o1_mf_temp_chzbynjn_.tmp
  7. -rw-r----- 1 oracle oinstall 1073750016 Jun 6 23:06 o1_mf_temp_chzg2zy8_.tmp
  8. -rw-r----- 1 oracle oinstall 94380032 Jun 6 23:04 o1_mf_undotbs1_chzbv7pc_.dbf
  9. -rw-r----- 1 oracle oinstall 2629312512 Jun 6 23:04 o1_mf_users_chzbv7qk_.dbf
刪除USERS表空間資料檔案

點選(此處)摺疊或開啟

  1. $ ll *users*
  2. -rw-r----- 1 oracle oinstall 2629312512 Jun 6 23:04 o1_mf_users_chzbv7qk_.dbf
  3. [oracle@apr datafile]$ rm -f *users*
此時,可能仍然能查詢該表空間內的資料,但應無法執行DML語句。

點選(此處)摺疊或開啟

  1. SQL> select owner,table_name,tablespace_name from dba_tables where owner='SH' and TABLE_NAME='SALES';

  2. OWNER TABLE_NAME
  3. ------------------------------ ------------------------------
  4. TABLESPACE_NAME
  5. ------------------------------
  6. SH SALES
  7. USERS

  8. SQL> connect sh/sh
  9. Connected.
  10. SQL> create table tt (x int);

  11. Table created.

  12. SQL> insert into tt values (1);
  13. insert into tt values (1)
  14.             *
  15. ERROR at line 1:
  16. ORA-01116: error in opening database file 4
  17. ORA-01110: data file 4: '/oradata/APR/datafile/o1_mf_users_chzbv7qk_.dbf'
  18. ORA-27041: unable to open file
  19. Linux-x86_64 Error: 2: No such file or directory
  20. Additional information: 3
下面開始嘗試恢復。

1. 確認PID

點選(此處)摺疊或開啟

  1. $ ps -ef | grep dbw
  2. oracle 4883 1 0 23:04 ? 00:00:00 ora_dbw0_apr
  3. oracle 5067 5034 0 23:07 pts/4 00:00:00 grep dbw
2. 確認FD

點選(此處)摺疊或開啟

  1. # lsof -p 4883
  2. ……
  3. oracle 4883 oracle 258uW REG 253,2 786440192 2867203 /oradata/APR/datafile/o1_mf_system_chzbv7mg_.dbf
  4. oracle 4883 oracle 259u REG 253,2 608182272 2867204 /oradata/APR/datafile/o1_mf_sysaux_chzbv7op_.dbf
  5. oracle 4883 oracle 260uW REG 253,2 94380032 2867205 /oradata/APR/datafile/o1_mf_undotbs1_chzbv7pc_.dbf
  6. oracle 4883 oracle 261uW REG 253,2 2629312512 2867206 /oradata/APR/datafile/o1_mf_users_chzbv7qk_.dbf (deleted)
  7. oracle 4883 oracle 262uW REG 253,2 30416896 2867213 /oradata/APR/datafile/o1_mf_temp_chzbynjn_.tmp
  8. oracle 4883 oracle 263uW REG 253,2 1073750016 2867214 /oradata/APR/datafile/o1_mf_temp_chzg2zy8_.tmp
  9. [root@apr ~]#
3. 複製相關檔案到新路徑
注意:cp後user01.dbf有可能是目錄,真正的檔案在改目錄下。移動重新命名即可。

點選(此處)摺疊或開啟

  1. $ mkdir /oradata/neworadata
  2. [oracle@apr ~]$ cp /proc/4883/fd/261 /oradata/neworadata/users01.dbf
4. 將問題資料檔案離線、重新命名、恢復、線上;
注意:在offline期間可能Oracle程式被自動強制關閉,此時需重新將Oracle啟動到mount狀態。

點選(此處)摺疊或開啟

  1. alter database datafile '/oradata/APR/datafile/o1_mf_users_chzbv7qk_.dbf' offline;

  2. alter database rename file '/oradata/APR/datafile/o1_mf_users_chzbv7qk_.dbf' to '/oradata/neworadata/users01.dbf';

  3. SQL> recover datafile '/oradata/neworadata/users01.dbf';
  4. Media recovery complete.
  5. SQL> alter database datafile '/oradata/neworadata/users01.dbf' online;

  6. Database altered.

  7. SQL> alter database open;

  8. Database altered.
完成!


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

相關文章