通過控制程式碼恢復Linux下誤刪除的資料庫資料檔案
環境介紹:
OS:Redhat EnterPrise 5.4
DB:Oracle EnterPrise Database 11gR2(11.2.3.0)
在資料庫正常執行時,運維人員在無意中將部分資料檔案刪除了,此時資料庫管理員並不知道,且資料庫執行正常,並沒有立即丟擲錯誤和告警;但是開發人員在對某張表進行更新的時候,正好這張表在被刪除的資料檔案中,報出ORA-01110和ORA-27041錯誤。隨即資料庫管理人員來看現象,發現有一個檔案已經從系統層面刪除了,並且資料庫資料庫沒有進行重啟操作,所以在沒有進行更新的時候業務並沒有造成影響。
非常幸運的是,在資料檔案刪除的情況下,資料庫沒有重啟,使得這次的恢復變的較為簡單,基於這次的恢復,我在我得實驗裝置上進行了重演,記錄了完整的資料檔案刪除和恢復的完整步驟,如下:
一、準備測試環境,建立新的表空間及資料檔案:
-
SQL> create tablespace woo datafile
-
2 '/u01/app/oracle/oradata/PROD1/woo01.dbf'
-
3 size 20m autoextend on;
-
-
Tablespace created.
-
-
SQL> select name from v$dbfile;
-
-
NAME
-
--------------------------------------------------------------------------------
-
/u01/app/oracle/oradata/PROD1/users01.dbf
-
/u01/app/oracle/oradata/PROD1/undotbs01.dbf
-
/u01/app/oracle/oradata/PROD1/sysaux01.dbf
-
/u01/app/oracle/oradata/PROD1/system01.dbf
-
/u01/app/oracle/oradata/PROD1/example01.dbf
-
/u01/app/oracle/oradata/PROD1/tools.dbf
-
/u01/app/oracle/oradata/PROD1/test.dbf
-
/u01/app/oracle/oradata/PROD1/woo01.dbf
-
- 8 rows selected.
二、模擬故障,在系統級別刪除資料檔案:
- SQL> !rm -rf /u01/app/oracle/oradata/PROD1/woo01.dbf
三、檢查資料庫狀態,並且建立測試資料
-
SQL> !tail -100f /u01/app/oracle/diag/rdbms/prod1/PROD1/trace/alert*
-
-
Wed Aug 26 14:31:01 2015
-
create tablespace woo datafile
-
'/u01/app/oracle/oradata/PROD1/woo01.dbf'
-
size 20m autoextend on
-
Completed: create tablespace woo datafile
-
'/u01/app/oracle/oradata/PROD1/woo01.dbf'
-
size 20m autoextend on
-
-
#在這裡我們可以看到資料檔案在系統層面被刪除之後資料庫並沒產生告警。
-
-
-
SQL> create table test tablespace woo as select * from dba_users;
-
create table test tablespace woo as select * from dba_users
-
*
-
ERROR at line 1:
-
ORA-01116: error in opening database file 8
-
ORA-01110: data file 8: '/u01/app/oracle/oradata/PROD1/woo01.dbf'
-
ORA-27041: unable to open file
-
Linux Error: 2: No such file or directory
-
Additional information: 3
-
-
-
#而使在我們需要往這個刪除的檔案中寫入資料的時候才發現資料檔案被刪除了。
-
-
SQL> !tail -50 /u01/app/oracle/diag/rdbms/prod1/PROD1/trace/alert*
-
-
Wed Aug 26 14:34:33 2015
-
Errors in file /u01/app/oracle/diag/rdbms/prod1/PROD1/trace/PROD1_smon_9564.trc:
-
ORA-01116: error in opening database file 8
-
ORA-01110: data file 8: '/u01/app/oracle/oradata/PROD1/woo01.dbf'
-
ORA-27041: unable to open file
-
Linux Error: 2: No such file or directory
-
Additional information: 3
-
Wed Aug 26 14:34:33 2015
-
Checker run found 1 new persistent data failures
-
Wed Aug 26 14:39:44 2015
-
Errors in file /u01/app/oracle/diag/rdbms/prod1/PROD1/trace/PROD1_m000_14015.trc:
-
ORA-01116: error in opening database file 8
-
ORA-01110: data file 8: '/u01/app/oracle/oradata/PROD1/woo01.dbf'
-
ORA-27041: unable to open file
-
Linux Error: 2: No such file or directory
-
Additional information: 3
-
-
-
SQL> select instance_name,status from v$instance;
-
-
INSTANCE_NAME STATUS
-
---------------- ------------
- PROD1 OPEN #即便資料庫已經知道了資料庫檔案丟失,因為不是系統表空間的資料檔案,所以資料庫的執行並沒有收到影響。
四、查詢資料檔案
因為資料庫並沒有停止執行,這個時候我們可以通過dbwr寫資料檔案程式來找到程式控制程式碼號,進入該控制程式碼號就可以找到該程式鎖定的相關資料檔案了。
-
SQL> !ps -ef|grep dbw|grep -v grep
-
oracle 9554 1 0 07:16 ? 00:00:01 ora_dbw0_PROD1
-
-
#我們可以看到程式的ID為9554,通過程式ID查詢到程式下鎖定的所有檔案
-
SQL> !ls -rtl /proc/9554/fd
-
-
[oracle@edbjr2p1 trace]$ ls -rtl /proc//9554/fd
-
total 0
-
lr-x------ 1 oracle oinstall 64 Aug 26 14:37 0 -> /dev/null
-
lr-x------ 1 oracle oinstall 64 Aug 26 14:37 9 -> /dev/null
-
lr-x------ 1 oracle oinstall 64 Aug 26 14:37 8 -> /u01/app/oracle/product/11.2.0/dbhome_1/bin/oracle
-
lr-x------ 1 oracle oinstall 64 Aug 26 14:37 7 -> /dev/null
-
lrwx------ 1 oracle oinstall 64 Aug 26 14:37 6 -> /u01/app/oracle/product/11.2.0/dbhome_1/hpatch/orapatchPROD1.cfg
-
lrwx------ 1 oracle oinstall 64 Aug 26 14:37 5 -> /u01/app/oracle/product/11.2.0/dbhome_1/dbs/hc_PROD1.dat
-
lr-x------ 1 oracle oinstall 64 Aug 26 14:37 4 -> /dev/null
-
lr-x------ 1 oracle oinstall 64 Aug 26 14:37 3 -> /dev/null
-
l-wx------ 1 oracle oinstall 64 Aug 26 14:37 2 -> /dev/null
-
lrwx------ 1 oracle oinstall 64 Aug 26 14:37 19 -> /u01/app/oracle/product/11.2.0/dbhome_1/hpatch/orapatchPROD1.cfg
-
lr-x------ 1 oracle oinstall 64 Aug 26 14:37 18 -> /proc/9554/fd
-
lr-x------ 1 oracle oinstall 64 Aug 26 14:37 17 -> /u01/app/oracle/product/11.2.0/dbhome_1/rdbms/mesg/oraus.msb
-
lrwx------ 1 oracle oinstall 64 Aug 26 14:37 16 -> /u01/app/oracle/product/11.2.0/dbhome_1/dbs/hc_PROD1.dat
-
lr-x------ 1 oracle oinstall 64 Aug 26 14:37 15 -> /u01/app/oracle/product/11.2.0/dbhome_1/bin/oracle
-
lr-x------ 1 oracle oinstall 64 Aug 26 14:37 14 -> /dev/zero
-
lr-x------ 1 oracle oinstall 64 Aug 26 14:37 13 -> /dev/zero
-
lrwx------ 1 oracle oinstall 64 Aug 26 14:37 12 -> /u01/app/oracle/product/11.2.0/dbhome_1/hpatch/orapatchPROD1.cfg
-
lr-x------ 1 oracle oinstall 64 Aug 26 14:37 11 -> /dev/null
-
lr-x------ 1 oracle oinstall 64 Aug 26 14:37 10 -> /dev/null
-
l-wx------ 1 oracle oinstall 64 Aug 26 14:37 1 -> /dev/null
-
lrwx------ 1 oracle oinstall 64 Aug 26 14:37 268 -> /u01/app/oracle/oradata/PROD1/woo01.dbf (deleted) //我們找到了這個檔案,處於deleted
-
lrwx------ 1 oracle oinstall 64 Aug 26 14:37 267 -> /u01/app/oracle/oradata/PROD1/temp2.dbf
-
lrwx------ 1 oracle oinstall 64 Aug 26 14:37 266 -> /u01/app/oracle/oradata/PROD1/temp1.dbf
-
lrwx------ 1 oracle oinstall 64 Aug 26 14:37 265 -> /u01/app/oracle/oradata/PROD1/temp01.dbf
-
lrwx------ 1 oracle oinstall 64 Aug 26 14:37 264 -> /u01/app/oracle/oradata/PROD1/test.dbf
-
lrwx------ 1 oracle oinstall 64 Aug 26 14:37 263 -> /u01/app/oracle/oradata/PROD1/tools.dbf
-
lrwx------ 1 oracle oinstall 64 Aug 26 14:37 262 -> /u01/app/oracle/oradata/PROD1/example01.dbf
-
lrwx------ 1 oracle oinstall 64 Aug 26 14:37 261 -> /u01/app/oracle/oradata/PROD1/users01.dbf
-
lrwx------ 1 oracle oinstall 64 Aug 26 14:37 260 -> /u01/app/oracle/oradata/PROD1/undotbs01.dbf
-
lrwx------ 1 oracle oinstall 64 Aug 26 14:37 259 -> /u01/app/oracle/oradata/PROD1/sysaux01.dbf
-
lrwx------ 1 oracle oinstall 64 Aug 26 14:37 258 -> /u01/app/oracle/oradata/PROD1/system01.dbf
-
lrwx------ 1 oracle oinstall 64 Aug 26 14:37 257 -> /u01/app/oracle/oradata/PROD1/control02.ctl
-
lrwx------ 1 oracle oinstall 64 Aug 26 14:37 256 -> /u01/app/oracle/oradata/PROD1/control01.ctl
-
lr-x------ 1 oracle oinstall 64 Aug 26 14:37 24 -> /u01/app/oracle/product/11.2.0/dbhome_1/rdbms/mesg/oraus.msb
-
lrwx------ 1 oracle oinstall 64 Aug 26 14:37 23 -> /u01/app/oracle/product/11.2.0/dbhome_1/dbs/lkPROD1
-
lrwx------ 1 oracle oinstall 64 Aug 26 14:37 22 -> /u01/app/oracle/product/11.2.0/dbhome_1/dbs/hc_PROD1.dat
-
lr-x------ 1 oracle oinstall 64 Aug 26 14:37 21 -> /u01/app/oracle/product/11.2.0/dbhome_1/bin/oracle
-
lr-x------ 1 oracle oinstall 64 Aug 26 14:37 20 -> /dev/zero
- lrwx------ 1 oracle oinstall 64 Aug 26 15:09 25 -> socket:[173283]
五、將該檔案控制程式碼拷貝到原檔案位置:
- SQL> !cp /proc//9554/fd/268 /u01/app/oracle/oradata/PROD1/woo01.dbf
六、對拷貝回來的檔案執行常規的資料恢復操作,實際上也就是更新下資料檔案頭部的scn號:
-
SQL> col name format a50
-
SQL> select file#,status,name from v$datafile;
-
-
FILE# STATUS NAME
-
---------- ------- --------------------------------------------------
-
1 SYSTEM /u01/app/oracle/oradata/PROD1/system01.dbf
-
2 ONLINE /u01/app/oracle/oradata/PROD1/sysaux01.dbf
-
3 ONLINE /u01/app/oracle/oradata/PROD1/undotbs01.dbf
-
4 ONLINE /u01/app/oracle/oradata/PROD1/users01.dbf
-
5 ONLINE /u01/app/oracle/oradata/PROD1/example01.dbf
-
6 ONLINE /u01/app/oracle/oradata/PROD1/tools.dbf
-
7 ONLINE /u01/app/oracle/oradata/PROD1/test.dbf
-
8 ONLINE /u01/app/oracle/oradata/PROD1/woo01.dbf #我們可以看到這個時候該資料檔案是ONLINE狀態
-
-
8 rows selected.
-
-
-
#由於這是一套線上庫,且有其它業務,不可隨意停機,所以這個時候將需要恢復的資料檔案offline,就可以直接線上執行恢復了。
-
-
SQL> alter database datafile 8 offline;
-
-
Database altered.
-
-
SQL> select file#,status,name from v$datafile;
-
-
FILE# STATUS NAME
-
---------- ------- --------------------------------------------------
-
1 SYSTEM /u01/app/oracle/oradata/PROD1/system01.dbf
-
2 ONLINE /u01/app/oracle/oradata/PROD1/sysaux01.dbf
-
3 ONLINE /u01/app/oracle/oradata/PROD1/undotbs01.dbf
-
4 ONLINE /u01/app/oracle/oradata/PROD1/users01.dbf
-
5 ONLINE /u01/app/oracle/oradata/PROD1/example01.dbf
-
6 ONLINE /u01/app/oracle/oradata/PROD1/tools.dbf
-
7 ONLINE /u01/app/oracle/oradata/PROD1/test.dbf
-
8 RECOVER /u01/app/oracle/oradata/PROD1/woo01.dbf #在對資料檔案進行操作,觸發了該檔案,發現檔案頭部的scn不一致,提示需要進行恢復。’
-
-
8 rows selected.
-
-
#執行線上恢復並且online該資料檔案。
-
-
SQL> recover datafile 8;
-
Media recovery complete.
-
SQL> alter database datafile 8 online;
-
- Database altered.
七、驗證資料檔案恢復後是否可以正常使用
-
SQL> select file#,status,name from v$datafile;
-
-
FILE# STATUS NAME
-
---------- ------- --------------------------------------------------
-
1 SYSTEM /u01/app/oracle/oradata/PROD1/system01.dbf
-
2 ONLINE /u01/app/oracle/oradata/PROD1/sysaux01.dbf
-
3 ONLINE /u01/app/oracle/oradata/PROD1/undotbs01.dbf
-
4 ONLINE /u01/app/oracle/oradata/PROD1/users01.dbf
-
5 ONLINE /u01/app/oracle/oradata/PROD1/example01.dbf
-
6 ONLINE /u01/app/oracle/oradata/PROD1/tools.dbf
-
7 ONLINE /u01/app/oracle/oradata/PROD1/test.dbf
-
8 ONLINE /u01/app/oracle/oradata/PROD1/woo01.dbf
-
-
8 rows selected.
-
-
SQL> create table test tablespace woo as select * from dba_users;
-
- Table created.
八、至此完成該資料檔案的恢復
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/20674423/viewspace-1783254/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 透過控制程式碼檔案恢復linux下誤刪除的資料檔案Linux
- 通過檔案控制程式碼恢復刪除的資料檔案
- Linux下誤刪資料檔案從檔案控制程式碼恢復資料檔案Linux
- linux下恢復誤刪除的資料檔案Linux
- linux下恢復誤刪除oracle的資料檔案LinuxOracle
- 【資料庫資料恢復】LINUX環境下ORACLE資料庫誤刪除的資料恢復資料庫資料恢復LinuxOracle
- 誤刪除資料檔案、控制檔案的非RMAN恢復方法
- Oracle恢復誤刪除的資料檔案Oracle
- Oracle資料恢復 - Linux / Unix 誤刪除的檔案恢復(轉)Oracle資料恢復Linux
- 【伺服器資料恢復】linux ext3檔案系統下誤刪除mysql資料庫的資料恢復案例伺服器資料恢復LinuxMySql資料庫
- linux中誤刪除oracle資料檔案的恢復操作LinuxOracle
- 【oracle資料庫資料恢復】誤操作導致的資料庫誤刪除的資料恢復案例Oracle資料庫資料恢復
- 【伺服器資料恢復】Zfs檔案系統下誤刪除怎麼恢復資料伺服器資料恢復
- linux下 恢復被rm意外刪除資料檔案Linux
- linux中誤刪除oracle資料檔案的恢復操作(轉)LinuxOracle
- 資料檔案誤刪--但有資料檔案的copy恢復
- 恢復Oracle資料庫誤刪除資料的語句Oracle資料庫
- OS 刪除oracle資料檔案恢復過程Oracle
- 誤刪除儲存SqlServer資料庫資料恢復SQLServer資料庫資料恢復
- Oracle資料庫意外刪除資料檔案的恢復(轉載)Oracle資料庫
- 使用檔案描述符恢復誤刪除的資料檔案
- 【資料庫資料恢復】透過恢復NDF檔案修復資料庫的資料恢復過程資料庫資料恢復
- Sybase ASE資料庫恢復,Sybase資料恢復,資料誤刪除恢復工具READSYBDEVICE資料庫資料恢復dev
- LINUX下資料被誤刪除、LINUX下資料被誤格式化後資料恢復Linux資料恢復
- Oracle11g資料庫引數檔案誤刪除恢復Oracle資料庫
- oracle恢復誤刪除資料Oracle
- 【北亞資料恢復】誤刪除oracle表和誤刪除oracle表資料的資料恢復方法資料恢復Oracle
- 【資料庫資料恢復】HP-UX系統ORACLE資料庫被誤刪除的資料恢復資料庫資料恢復UXOracle
- MySQL資料庫表誤刪除恢復(一)MySql資料庫
- RM 刪除資料檔案恢復操作
- 歸檔模式下,線上刪除資料檔案的完全恢復模式
- 【北亞資料恢復】zfs檔案系統的伺服器誤刪除的資料恢復資料恢復伺服器
- SQL Server資料庫恢復,SQL Server資料恢復,SQL Server資料誤刪除恢復工具SQLRescueSQLServer資料庫資料恢復
- 【伺服器資料恢復】LINUX誤刪除、格式化的資料恢復伺服器資料恢復Linux
- mysql資料庫誤刪除後的資料恢復操作說明MySql資料庫資料恢復
- MySQL 資料庫誤刪除後的資料恢復操作說明MySql資料庫資料恢復
- 【恢復】非歸檔模式下因誤刪除資料檔案導致資料庫無法OPEN的故障處理模式資料庫
- 伺服器資料恢復-LINUX誤刪除/格式化資料的資料恢復方案伺服器資料恢復Linux