OS 刪除oracle資料檔案恢復過程

pxbibm發表於2015-08-27
     在資料庫正常執行時,運維人員在無意中將部分資料檔案刪除了,此時資料庫管理員並不知道,且資料庫執行正常,並沒有立即丟擲錯誤和告警;但是開發人員在對某張表進行更新的時候,正好這張表在被刪除的資料檔案中,報出ORA-01110和ORA-27041錯誤。隨即資料庫管理人員來看現象,發現有一個檔案已經從系統層面刪除了,並且資料庫資料庫沒有進行重啟操作,所以在沒有進行更新的時候業務並沒有造成影響。

非常幸運的是,在資料檔案刪除的情況下,資料庫沒有重啟,使得這次的恢復變的較為簡單,基於這次的恢復,我在我得實驗裝置上進行了重演,記錄了完整的資料檔案刪除和恢復的完整步驟,如下:


一、準備測試環境,建立新的表空間及資料檔案:

 

SQL> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
CORE 11.2.0.4.0 Production
TNS for Linux: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production



SQL>create tablespace test1 datafile '/app/oracle11g/oradata/uporcl/testdata02.dbf' size 1g autoextend on;

Tablespace created.

SQL> select name from v$dbfile;

NAME
--------------------------------------------------------------------------------
/app/oracle11g/oradata/uporcl/system01.dbf
/app/oracle11g/oradata/uporcl/undotbs01.dbf
/app/oracle11g/oradata/uporcl/sysaux01.dbf
/app/oracle11g/oradata/uporcl/users01.dbf
/app/oracle11g/oradata/uporcl/testdata01.dbf
/app/oracle11g/oradata/uporcl/testdata02.dbf

6 rows selected.


 

二、模擬故障,在系統級別刪除資料檔案:


SQL> !rm -rf /app/oracle11g/oradata/uporcl/testdata02.dbf

三、檢查資料庫狀態,並且建立測試資料

SQL> !tail -f 300 /app/oracle11g/diag/rdbms/uporcl/uporcl/trace/alert*
tail: cannot open `300' for reading: No such file or directory
==> /app/oracle11g/diag/rdbms/uporcl/uporcl/trace/alert_uporcl.log <==
  Current log# 1 seq# 235 mem# 0: /app/oracle11g/oradata/uporcl/redo01.log
Thu Aug 27 13:47:36 2015
Errors in file /app/oracle11g/diag/rdbms/uporcl/uporcl/trace/uporcl_m001_27005.trc:
ORA-01116: error in opening database file 6
ORA-01110: data file 6: '/app/oracle11g/oradata/uporcl/testdata02.dbf'
ORA-27041: unable to open file
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
Thu Aug 27 13:47:37 2015
Checker run found 1 new persistent data failures

#在這裡我們可以看到資料檔案在系統層面被刪除之後資料庫並沒產生告警。

我們新增一個表,發現已經報錯了。
SQL> create table test tablespace test1 as select * from dba_tables;
create table test tablespace test1 as select * from dba_tables
                                                    *
ERROR at line 1:
ORA-01116: error in opening database file 6
ORA-01110: data file 6: '/app/oracle11g/oradata/uporcl/testdata02.dbf'
ORA-27041: unable to open file
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3

#在資料庫層面,我們需要往這個刪除的檔案中寫入資料的時候才發現資料檔案被刪除了。

SQL> select instance_name,status from v$instance;

INSTANCE_NAME  STATUS
---------------- ------------
uporcl   OPEN #即便資料庫已經知道了資料庫檔案丟失,因為不是系統表空間的資料檔案,所以資料庫的執行並沒有收到影響。


四、查詢資料檔案

因為資料庫並沒有停止執行,這個時候我們可以透過dbwr寫資料檔案程式來找到程式控制程式碼號,進入該控制程式碼號就可以找到該程式鎖定的相關資料檔案了。


SQL> !ps -ef|grep dbw
oracle   21705     1  0 Aug26 ?        00:00:03 ora_dbw0_uporcl
oracle   27137 26986  0 14:01 pts/1    00:00:00 /bin/bash -c ps -ef|grep dbw

#我們可以看到程式的ID為21705,透過程式ID查詢到程式下鎖定的所有檔案
SQL> !ls -rtl /proc/21705/fd
total 0
lrwx------ 1 oracle oinstall 64 Aug 27 14:02 9 -> /app/oracle11g/product/11.2.0/dbhome_1/dbs/hc_uporcl.dat
lr-x------ 1 oracle oinstall 64 Aug 27 14:02 8 -> /dev/zero
lr-x------ 1 oracle oinstall 64 Aug 27 14:02 7 -> /proc/21705/fd
lr-x------ 1 oracle oinstall 64 Aug 27 14:02 6 -> /app/oracle11g/product/11.2.0/dbhome_1/rdbms/mesg/oraus.msb
lr-x------ 1 oracle oinstall 64 Aug 27 14:02 5 -> /dev/null
lr-x------ 1 oracle oinstall 64 Aug 27 14:02 4 -> /dev/null
lr-x------ 1 oracle oinstall 64 Aug 27 14:02 3 -> /dev/null
lrwx------ 1 oracle oinstall 64 Aug 27 14:02 265 -> /app/oracle11g/oradata/uporcl/temp01.dbf
lrwx------ 1 oracle oinstall 64 Aug 27 14:02 264 -> /app/oracle11g/oradata/uporcl/testdata02.dbf (deleted)我們找到了這個檔案,處於deleted
lrwx------ 1 oracle oinstall 64 Aug 27 14:02 263 -> /app/oracle11g/oradata/uporcl/testdata01.dbf
lrwx------ 1 oracle oinstall 64 Aug 27 14:02 262 -> /app/oracle11g/oradata/uporcl/users01.dbf
lrwx------ 1 oracle oinstall 64 Aug 27 14:02 261 -> /app/oracle11g/oradata/uporcl/sysaux01.dbf
lrwx------ 1 oracle oinstall 64 Aug 27 14:02 260 -> /app/oracle11g/oradata/uporcl/undotbs01.dbf
lrwx------ 1 oracle oinstall 64 Aug 27 14:02 259 -> /app/oracle11g/oradata/uporcl/system01.dbf
lrwx------ 1 oracle oinstall 64 Aug 27 14:02 258 -> /app/oracle11g/oradata/uporcl/control03.ctl
lrwx------ 1 oracle oinstall 64 Aug 27 14:02 257 -> /app/oracle11g/oradata/uporcl/control02.ctl
lrwx------ 1 oracle oinstall 64 Aug 27 14:02 256 -> /app/oracle11g/oradata/uporcl/control01.ctl
l-wx------ 1 oracle oinstall 64 Aug 27 14:02 2 -> /dev/null
lr-x------ 1 oracle oinstall 64 Aug 27 14:02 11 -> /app/oracle11g/product/11.2.0/dbhome_1/rdbms/mesg/oraus.msb
lrwx------ 1 oracle oinstall 64 Aug 27 14:02 10 -> /app/oracle11g/product/11.2.0/dbhome_1/dbs/lkUPORCL
l-wx------ 1 oracle oinstall 64 Aug 27 14:02 1 -> /dev/null
lr-x------ 1 oracle oinstall 64 Aug 27 14:02 0 -> /dev/null


五、將該檔案控制程式碼複製到原檔案位置:

  1. SQL>!cp /proc/21705/fd/264      /app/oracle11g/oradata/uporcl/testdata02.dbf

六、對複製回來的檔案執行常規的資料恢復操作,實際上也就是更新下資料檔案頭部的scn號:


SQL> col name format a44
SQL> select file#,status,name from v$datafile;

     FILE# STATUS  NAME
---------- ------- --------------------------------------------
  1 SYSTEM  /app/oracle11g/oradata/uporcl/system01.dbf
  2 ONLINE  /app/oracle11g/oradata/uporcl/undotbs01.dbf
  3 ONLINE  /app/oracle11g/oradata/uporcl/sysaux01.dbf
  4 ONLINE  /app/oracle11g/oradata/uporcl/users01.dbf
  5 ONLINE  /app/oracle11g/oradata/uporcl/testdata01.dbf
  6 ONLINE  /app/oracle11g/oradata/uporcl/testdata02.dbf #我們可以看到這個時候該資料檔案是ONLINE狀態

6 rows selected.

   
#由於這是一套線上庫,且有其它業務,不可隨意停機,所以這個時候將需要恢復的資料檔案offline,就可以直接線上執行恢復了。
注意:在offline資料檔案時,如果是在非歸檔模式下需要offlien tablespace .如果直接offline 資料檔案會報錯
SQL> alter database datafile 6 offline;
alter database datafile 6 offline
*
ERROR at line 1:
ORA-01145: offline immediate disallowed unless media recovery enabled

SQL> archive log list;
Database log mode        No Archive Mode
Automatic archival        Disabled
Archive destination        USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     233
Current log sequence        235
SQL> alter tablespace test1 offline;

Tablespace altered.

SQL>  select file#,status,name from v$datafile;

     FILE# STATUS  NAME
---------- ------- --------------------------------------------
  1 SYSTEM  /app/oracle11g/oradata/uporcl/system01.dbf
  2 ONLINE  /app/oracle11g/oradata/uporcl/undotbs01.dbf
  3 ONLINE  /app/oracle11g/oradata/uporcl/sysaux01.dbf
  4 ONLINE  /app/oracle11g/oradata/uporcl/users01.dbf
  5 ONLINE  /app/oracle11g/oradata/uporcl/testdata01.dbf
  6 OFFLINE /app/oracle11g/oradata/uporcl/testdata02.dbf. #在對資料檔案進行操作,觸發了該檔案,發現檔案頭部的scn不一致,提示需要進行恢復。

6 rows selected

執行線上恢復並且online該資料檔案。

SQL>recover datafile 6;

Media recovery complete.

SQL>alter database datafile 8 online;
Database altered.


七、驗證資料檔案恢復後是否可以正常使用


SQL>  select file#,status,name from v$datafile;

     FILE# STATUS  NAME
---------- ------- --------------------------------------------
  1 SYSTEM  /app/oracle11g/oradata/uporcl/system01.dbf
  2 ONLINE  /app/oracle11g/oradata/uporcl/undotbs01.dbf
  3 ONLINE  /app/oracle11g/oradata/uporcl/sysaux01.dbf
  4 ONLINE  /app/oracle11g/oradata/uporcl/users01.dbf
  5 ONLINE  /app/oracle11g/oradata/uporcl/testdata01.dbf
  6 ONLINE /app/oracle11g/oradata/uporcl/testdata02.dbf


SQL>create table test tablespace test1 as select * from dba_users;

Table created.


八、至此完成該資料檔案的恢復



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

相關文章