Oracle 檔案意外刪除恢復(Linux)

chenoracle發表於2023-03-25

實驗一:

透過作業系統命令,意外刪除資料檔案(資料庫open狀態);
1 建立測試資料
2 意外刪除資料檔案
3 檢查 dbwr 的程式 PID
4 查詢被誤刪除檔案控制程式碼
5 複製該控制程式碼檔名回原位置

實驗二:

透過作業系統命令,意外刪除資料檔案(資料庫無法啟動狀態);
1 意外刪除資料檔案
2 資料庫例項被重啟,並且無法open
3 extundelete工具嘗試找回

實驗一:

1 建立測試資料

SQL> create tablespace test datafile '/u01/app/oracle/oradata/PROD2/test01a.dbf' size 2M autoextend on;
SQL> create user chen identified by a default tablespace test;
SQL> grant connect,resource,dba to chen;
SQL> create table chen.t1 as select level as id from dual connect by level<=10;

2 意外刪除資料檔案

SQL> host rm -rf /u01/app/oracle/oradata/PROD2/test01a.dbf
SQL> conn chen/a
SQL>  create table chen.t3  as select level as id from dual connect by level<=10;
 create table chen.t3  as select level as id from dual connect by level<=10
                                                  *
ERROR at line 1:
ORA-01116: error in opening database file 6
ORA-01110: data file 6: '/u01/app/oracle/oradata/PROD2/test01a.dbf'
ORA-27041: unable to open file
Linux Error: 2: No such file or directory
Additional information: 3

[oracle@edbjr2p1 ~]$ cd /u01/app/oracle/diag/rdbms/prod2/PROD2/trace/
[oracle@edbjr2p1 trace]$ tail -f alert_PROD2.log
Tue Nov 14 14:50:55 2017
Checker run found 1 new persistent data failures
Tue Nov 14 14:57:08 2017
Errors in file /u01/app/oracle/diag/rdbms/prod2/PROD2/trace/PROD2_m000_4867.trc:
ORA-01116: error in opening database file 6
ORA-01110: data file 6: '/u01/app/oracle/oradata/PROD2/test01a.dbf'
ORA-27041: unable to open file
Linux Error: 2: No such file or directory
Additional information: 3

3 檢查dbwr程式 PID

[root@edbjr2p1 ~]# ps -ef|grep dbw0|grep -v grep
oracle    4579     1  0 14:34 ?        00:00:00 ora_dbw0_PROD2

4 查詢被誤刪除檔案控制程式碼

dbwr 會開啟所有資料檔案的控制程式碼。

在 proc 目錄中可以查到,目錄名是程式 PID,fd 表示檔案描述符。

[root@edbjr2p1 4579]# cd /proc/4579/fd/
[root@edbjr2p1 fd]# ls -l
......
lrwx------ 1 oracle oinstall 64 Nov 14 15:00 264 -> /u01/app/oracle/oradata/PROD2/test01a.dbf (deleted)

5 複製該控制程式碼檔名回原位置

[root@edbjr2p1 fd]# cp 264 /u01/app/oracle/oradata/PROD2/test01a.dbf
[root@edbjr2p1 fd]# chown oracle.oinstall /u01/app/oracle/oradata/PROD2/test01a.dbf

不用recover資料檔案,直接可以使用;

SQL> create table chen.t3  as select level as id from dual connect by level<=10;
Table created.
SQL> alter system checkpoint;
System altered.
SQL> select file#,CHECKPOINT_CHANGE#,status from v$datafile;
     FILE# CHECKPOINT_CHANGE# STATUS
---------- ------------------ -------
         1            1009869 SYSTEM
         2            1009869 ONLINE
         3            1009869 ONLINE
         4            1009869 ONLINE
         5            1009869 ONLINE
         6            1009869 ONLINE
6 rows selected.

實驗二:

官網下載地址:


安裝extundelete

[root@edbjr2p1 oracle]# ll -rht extundelete-0.2.4.tar.bz2 
-rw-r--r-- 1 oracle oinstall 106K Nov 14 15:40 extundelete-0.2.4.tar.bz2
[root@edbjr2p1 oracle]# yum -y install e2fsprogs-libs e2fsprogs e2fsprogs-devel
[root@edbjr2p1 oracle]# rpm -q e2fsprogs-libs e2fsprogs e2fsprogs-devel
[root@edbjr2p1 oracle]# tar jxvf extundelete-0.2.4.tar.bz2
[root@edbjr2p1 extundelete-0.2.4]# pwd
/home/oracle/extundelete-0.2.4
[root@edbjr2p1 extundelete-0.2.4]# ./configure && make && make install
Configuring extundelete 0.2.4
Writing generated files to disk
make -s all-recursive
Making all in src
Making install in src
  /usr/bin/install -c extundelete '/usr/local/bin'
[root@edbjr2p1 ~]# extundelete --help

在資料刪除之後,首先要解除安裝被刪除資料所在的磁碟或是分割槽,

如果是系統根分割槽遭到誤刪除, 就需要進入單使用者模式下,將根分割槽以只讀的方式掛載。

原因:

因為檔案刪除之後,僅僅是將檔案的inode節點中的扇區指標清零,實際上檔案還存在磁碟上面

如果磁碟以讀寫方式掛載,這些刪除的資料塊可能會被系統從新分配出去,這些資料塊被覆蓋之後,

這些 資料就真的丟失了,所以以只讀的方式掛載,儘可能避免資料被覆蓋。

[root@edbjr2p1 ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda3              15G  5.4G  8.4G  40% /
/dev/sda2              30G  7.6G   21G  27% /u01
/dev/sda1              99M   29M   65M  31% /boot
tmpfs                 1.5G  536M  987M  36% /dev/shm
[root@edbjr2p1 ~]# df -i
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sda3            3932160  164322 3767838    5% /
/dev/sda2            8102656   40214 8062442    1% /u01
/dev/sda1              26104      56   26048    1% /boot
tmpfs                 221920     227  221693    1% /dev/shm
[root@edbjr2p1 ~]# umount /u01
umount: /u01: device is busy
umount: /u01: device is busy
[root@edbjr2p1 ~]# fuser -m -v -i -k /u01
[root@edbjr2p1 ~]# umount /u01

使用extundelete恢復單個檔案測試

[root@edbjr2p1 /]# cat 000.sh 
00000000000000000000000000
11111111111111111111111111
22222222222222222222222222

刪除檔案

[root@edbjr2p1 /]# rm -rf 000.sh

檢視磁碟掛載資訊

[root@edbjr2p1 /]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda3              15G  5.4G  8.4G  40% /
/dev/sda1              99M   29M   65M  31% /boot
tmpfs                 1.5G  540M  982M  36% /dev/shm
/dev/sda2              30G  7.6G   21G  27% /u01

恢復

[root@edbjr2p1 /]# extundelete /dev/sda3 --inode 2
......
Loading filesystem metadata ... 120 groups loaded.
Group: 0
Contents of inode 2:
000                                               98309          Deleted
000.sh                                            98309          Deleted
000~                                              98307          Deleted

恢復指定檔案

[root@edbjr2p1 /]# extundelete /dev/sda3 --restore-file 000.sh
......
Loading filesystem metadata ... 120 groups loaded.
Loading journal descriptors ... 30791 descriptors loaded.
Successfully restored file 000.sh

檢視檔案

[root@edbjr2p1 /]# cd RECOVERED_FILES/
[root@edbjr2p1 RECOVERED_FILES]# cat 000.sh 
00000000000000000000000000
11111111111111111111111111
22222222222222222222222222

使用extundelete恢復整個目錄

[root@edbjr2p1 /]# mkdir abccc
[root@edbjr2p1 /]# touch /abccc/chen.sh
[root@edbjr2p1 /]# echo 66666666666666666 > /abccc/chen.sh

刪除目錄

[root@edbjr2p1 /]# rm -rf abccc/

恢復

[root@edbjr2p1 /]# extundelete /dev/sda3 --inode 2
NOTICE: Extended attributes are not restored.
WARNING: EXT3_FEATURE_INCOMPAT_RECOVER is set.
The partition should be unmounted to undelete any files without further data loss.
If the partition is not currently mounted, this message indicates
......
abccc                                             2588673        Deleted

恢復目錄檔案

[root@edbjr2p1 /]# extundelete /dev/sda3 --restore-directory /abccc
......
Loading filesystem metadata ... 120 groups loaded.
Loading journal descriptors ... 30318 descriptors loaded.
Searching for recoverable inodes in directory /abccc ... 
805 recoverable inodes found.
Looking through the directory structure for deleted files ... 
805 recoverable inodes still lost.
No files were undeleted.

同理可以恢復被誤刪除的資料檔案等。

###chenjuchao 2023-03-25###

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

相關文章