一次物理刪除資料檔案的恢復過程

dcswinner發表於2012-11-30

近幾天心情心情很低落,老是失眠,狀態很差。

中午吃晚飯後,運維小組的同事告訴我說有一臺資料庫的磁碟空間滿了。叫我處理一下,我登入到伺服器上一看:

[oracle@cpemsii-cx ~]$ df -h
Filesystem            容量  已用 可用 已用% 掛載點
/dev/cciss/c0d0p3     130G  80G  49G  62% /
/dev/cciss/c0d0p1     981M   25M  906M   3% /boot
none                   16G     0   16G   0% /dev/shm
/dev/cciss/c0d1       135G   93G   3.8M  100% /data

頭暈,先把操作日誌記下來,明天再寫。

今天補上。。。

[oracle@cpemsii-cx data]$ ll -rt                                       
總用量 133824236                                                       
drwx------  2 root   root           16384 2009-09-18  lost+found       
-rw-r-----  1 oracle oinstall  2097160192 11月 30 06:50 audit_indx02.dbf
-rw-r-----  1 oracle oinstall  5242888192 11月 30 06:51 audit_data05.dbf
-rw-r-----  1 oracle oinstall 34358697984 11月 30 06:51 audit_data03.dbf
-rw-r-----  1 oracle oinstall 21044928512 11月 30 07:04 audit_data04.dbf
-rw-r-----  1 oracle oinstall  4294975488 11月 30 11:04 audit_indx03.dbf
-rw-r-----  1 oracle oinstall 30260862976 11月 30 11:07 audit_indx06.dbf
-rw-r-----  1 oracle oinstall  3145736192 11月 30 11:07 audit_indx05.dbf
-rw-r-----  1 oracle oinstall  2097160192 11月 30 11:07 audit_indx04.dbf
-rw-r-----  1 oracle oinstall 34359730176 11月 30 11:07 audit_indx01.dbf

發現這個目錄下都是資料檔案,沒有什麼檔案可以刪除的。

檢視alert日誌:

[oracle@cpemsii-cx bdump]$ tail -f alert_emsaudt.log
Fri Nov 30 04:15:44 2012
Thread 1 cannot allocate new log, sequence 97073
Private strand flush not complete
  Current log# 1 seq# 97072 mem# 0: /home/oracle/oradata/emsaudt/redo01.log
Fri Nov 30 04:16:05 2012
Thread 1 advanced to log sequence 97073 (LGWR switch)
  Current log# 2 seq# 97073 mem# 0: /home/oracle/oradata/emsaudt/redo02.log
Fri Nov 30 05:02:04 2012
ORA-1653: unable to extend table AUDITCUST.TB_RST_SEAL_NO_CLCT by 128 in                 tablespace AUDIT_DATA
ORA-1653: unable to extend table AUDITCUST.TB_RST_SEAL_NO_CLCT by 8192 in                 tablespace AUDIT_DATA
Fri Nov 30 11:04:00 2012

後臺已經在報表空間不足的錯誤,為了不影響業務資料的插入,只能現在/目下的$ORACLE_BASE/oradata目錄下將AUDIT_DATA表空間新增一個資料檔案了。臨時解決插入報錯的問題。

SQL> ALTER TABLESPACE AUDIT_DATA ADD DATAFILE '/home/oracle/oradata/emsaudt/audit_data06.dbf' SIZE 2g ;                               

Tablespace altered.

再看alert日誌:

Fri Nov 30 11:24:44 2012
ALTER TABLESPACE AUDIT_DATA ADD DATAFILE '/home/oracle/oradata/emsaudt/audit_data06.dbf' SIZE 2g
Fri Nov 30 11:25:16 2012
Completed: ALTER TABLESPACE AUDIT_DATA ADD DATAFILE '/home/oracle/oradata/emsaudt/audit_data06.dbf' SIZE 2g .

看來插入報錯的問題臨時解決了,但是/data目錄空間不足的問題還是沒有解決。

那隻能通過新增儲存空間或者將這個目錄下的一些資料檔案移到根目錄下。擴盤短期是不可能的了,那就移檔案吧。

考慮到時間的因素,就將一個4G左右的索引檔案audit_indx03.dbf移走吧:

SQL> conn /as sysdba
Connected.
SQL>
SQL>
SQL> alter tablespace AUDIT_INDX offline;

Tablespace altered.

SQL> !cp '/data/audit_indx03.dbf' '/home/oracle/oradata/emsaudt/audit_indx03.dbf';

SQL> alter tablespace  AUDIT_INDX rename datafile '/data/audit_indx03.dbf' to '/home/oracle/oradata/emsaudt/audit_indx03.dbf';

Tablespace altered.

SQL> alter tablespace AUDIT_INDX online;

Tablespace altered.

移動成功。

但是/data目錄下的空間還沒有釋放出來,因為是cp的,那應該可以通過mv這個檔案,但是mv這個檔案空間也是不能釋放的,因為資料庫dbwr程式還在佔用這個檔案。那隻能將資料重啟釋放這個檔案控制程式碼,以釋放空間。。。想想這個思路應該沒有什麼問題,在徵求應用經理的同意後,我覺得這麼做。

[oracle@cpemsii-cx data]$ ll -rt
總用量 133824236
drwx------  2 root   root           16384 2009-09-18  lost+found
-rw-r-----  1 oracle oinstall  2097160192 11月 30 06:50 audit_indx02.dbf
-rw-r-----  1 oracle oinstall  5242888192 11月 30 06:51 audit_data05.dbf
-rw-r-----  1 oracle oinstall 34358697984 11月 30 06:51 audit_data03.dbf
-rw-r-----  1 oracle oinstall 21044928512 11月 30 07:04 audit_data04.dbf
-rw-r-----  1 oracle oinstall  4294975488 11月 30 11:04 audit_indx03.dbf
-rw-r-----  1 oracle oinstall 30260862976 11月 30 11:07 audit_indx06.dbf
-rw-r-----  1 oracle oinstall  3145736192 11月 30 11:07 audit_indx05.dbf
-rw-r-----  1 oracle oinstall  2097160192 11月 30 11:07 audit_indx04.dbf
-rw-r-----  1 oracle oinstall 34359730176 11月 30 11:07 audit_indx01.dbf[oracle@cpemsii-cx data]$ rm -rf audit_data03.dbf  -----就是因為今天情緒低落,狀態不好,將這個檔案刪除錯了,本來應該是刪除udit_indx03.dbf,這就造就了後面的物理恢復!當時本人還不知道。
[oracle@cpemsii-cx data]$ df -h
Filesystem            容量  已用 可用 已用% 掛載點
/dev/cciss/c0d0p3     130G   80G   45G  65% /
/dev/cciss/c0d0p1     981M   25M  906M   3% /boot
none                   16G     0   16G   0% /dev/shm
/dev/cciss/c0d1       135G  128G  3.8M 100% /data
[oracle@cpemsii-cx data]$ ll -rt
下面還是按照前面的思路,重啟資料庫!

SQL> shutdown immediate
ORA-01116: error in opening database file 14
ORA-01110: data file 14: '/data/audit_data03.dbf'
ORA-27041: unable to open file
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3

到這我才意識到自己刪錯檔案了,心理緊張了一把,這個庫平時不是太重要,沒有做任何備份!!!

此時我立馬想到了,此時絕對不能關閉資料庫,否則檔案控制程式碼釋放,這個檔案就徹底的沒了!

看了資料庫的總大小,不是很大。因此應該為了穩妥起見,先在另外一臺測試的伺服器上趁現在資料庫是open的將這個資料庫做一個邏輯備份。因為這個資料庫只有一個使用者,而且刪除的資料檔案都是這個使用者下的,因此只要做一個schema級別的邏輯備份就行。以防物理恢復失敗,好用這個邏輯備份來恢復。

想到這就在另一個測試環境上讓這個備份做著。

另一當面我得試試物理恢復了:

查詢資料庫寫程式:[oracle@cpemsii-cx emsaudt]$ ps -ef|grep dbw|grep -v grep
oracle    5409     1  0  2011 ?        23:32:58 ora_dbw0_emsaudt
oracle    5411     1  0  2011 ?        23:28:54 ora_dbw1_emsaudt

發現有兩個程式在寫:

[oracle@cpemsii-cx emsaudt]$ ll /proc/5409/fd/
總用量 42
lr-x------  1 oracle oinstall 64 11月 30 12:19 0 -> /dev/null
lr-x------  1 oracle oinstall 64 11月 30 12:19 1 -> /dev/null
lr-x------  1 oracle oinstall 64 11月 30 12:19 10 -> /dev/zero
lr-x------  1 oracle oinstall 64 11月 30 12:19 11 -> /dev/zero
lr-x------  1 oracle oinstall 64 11月 30 12:19 12 -> /home/oracle/product/10.2.0/rdbms/mesg/orazhs.msb
lr-x------  1 oracle oinstall 64 11月 30 12:19 13 -> /home/oracle/product/10.2.0/rdbms/mesg/oraus.msb
lrwx------  1 oracle oinstall 64 11月 30 12:19 14 -> /home/oracle/product/10.2.0/dbs/hc_emsaudt.dat
lrwx------  1 oracle oinstall 64 11月 30 12:19 15 -> /home/oracle/product/10.2.0/dbs/lkEMSAUDT
lrwx------  1 oracle oinstall 64 11月 30 12:19 16 -> /home/oracle/oradata/emsaudt/control01.ctl
lrwx------  1 oracle oinstall 64 11月 30 12:19 17 -> /home/oracle/oradata/emsaudt/control02.ctl
lrwx------  1 oracle oinstall 64 11月 30 12:19 18 -> /home/oracle/oradata/emsaudt/control03.ctl
lrwx------  1 oracle oinstall 64 11月 30 12:19 19 -> /home/oracle/oradata/emsaudt/system01.dbf
lr-x------  1 oracle oinstall 64 11月 30 12:19 2 -> /dev/null
lrwx------  1 oracle oinstall 64 11月 30 12:19 20 -> /home/oracle/oradata/emsaudt/undotbs01.dbf
lrwx------  1 oracle oinstall 64 11月 30 12:19 21 -> /home/oracle/oradata/emsaudt/sysaux01.dbf
lrwx------  1 oracle oinstall 64 11月 30 12:19 22 -> /home/oracle/oradata/emsaudt/users01.dbf
lrwx------  1 oracle oinstall 64 11月 30 12:19 23 -> /home/oracle/oradata/emsaudt/audit_data01.dbf
lrwx------  1 oracle oinstall 64 11月 30 12:19 24 -> socket:[806445420]
lrwx------  1 oracle oinstall 64 11月 30 12:19 25 -> /home/oracle/oradata/emsaudt/snpm_data.pdf
lrwx------  1 oracle oinstall 64 11月 30 12:19 26 -> /home/oracle/oradata/emsaudt/snpm_indx.pdf
lrwx------  1 oracle oinstall 64 11月 30 12:19 27 -> /home/oracle/oradata/emsaudt/audit_data02.dbf
lrwx------  1 oracle oinstall 64 11月 30 12:19 28 -> /data/audit_indx02.dbf
lrwx------  1 oracle oinstall 64 11月 30 12:19 29 -> /data/audit_indx01.dbf
lr-x------  1 oracle oinstall 64 11月 30 12:19 3 -> /dev/null
lrwx------  1 oracle oinstall 64 11月 30 12:19 30 -> /home/oracle/oradata/emsaudt/audit_indx03.dbf
lrwx------  1 oracle oinstall 64 11月 30 12:19 31 -> /data/audit_indx04.dbf
lrwx------  1 oracle oinstall 64 11月 30 12:19 32 -> /data/audit_data03.dbf (deleted)
lrwx------  1 oracle oinstall 64 11月 30 12:19 33 -> /data/audit_data04.dbf
lrwx------  1 oracle oinstall 64 11月 30 12:19 34 -> /data/audit_indx05.dbf
lrwx------  1 oracle oinstall 64 11月 30 12:19 35 -> /home/oracle/oradata/emsaudt/ems_monitor_dat.dbf
lrwx------  1 oracle oinstall 64 11月 30 12:19 36 -> /home/oracle/oradata/emsaudt/temp01.dbf
lr-x------  1 oracle oinstall 64 11月 30 12:19 37 -> /home/oracle/product/10.2.0/rdbms/mesg/orazhs.msb
lr-x------  1 oracle oinstall 64 11月 30 12:19 38 -> /home/oracle/product/10.2.0/rdbms/mesg/oraus.msb
lrwx------  1 oracle oinstall 64 11月 30 12:19 39 -> /data/audit_data05.dbf
lr-x------  1 oracle oinstall 64 11月 30 12:19 4 -> /dev/null
lrwx------  1 oracle oinstall 64 11月 30 12:19 40 -> /data/audit_indx06.dbf
lrwx------  1 oracle oinstall 64 11月 30 12:19 41 -> /home/oracle/oradata/emsaudt/audit_data06.dbf
l-wx------  1 oracle oinstall 64 11月 30 12:19 5 -> /home/oracle/admin/emsaudt/udump/emsaudt_ora_5399.trc
l-wx------  1 oracle oinstall 64 11月 30 12:19 6 -> /home/oracle/admin/emsaudt/bdump/alert_emsaudt.log
lrwx------  1 oracle oinstall 64 11月 30 12:19 7 -> /home/oracle/product/10.2.0/dbs/lkinstemsaudt (deleted)
l-wx------  1 oracle oinstall 64 11月 30 12:19 8 -> /home/oracle/admin/emsaudt/bdump/alert_emsaudt.log
lrwx------  1 oracle oinstall 64 11月 30 12:19 9 -> /home/oracle/product/10.2.0/dbs/hc_emsaudt.dat
[oracle@cpemsii-cx emsaudt]$ ll /proc/5411/fd/
總用量 30
lr-x------  1 oracle oinstall 64 11月 30 12:20 0 -> /dev/null
lr-x------  1 oracle oinstall 64 11月 30 12:20 1 -> /dev/null
lr-x------  1 oracle oinstall 64 11月 30 12:20 10 -> /dev/zero
lr-x------  1 oracle oinstall 64 11月 30 12:20 11 -> /dev/zero
lr-x------  1 oracle oinstall 64 11月 30 12:20 12 -> /home/oracle/product/10.2.0/rdbms/mesg/orazhs.msb
lr-x------  1 oracle oinstall 64 11月 30 12:20 13 -> /home/oracle/product/10.2.0/rdbms/mesg/oraus.msb
lrwx------  1 oracle oinstall 64 11月 30 12:20 14 -> /home/oracle/product/10.2.0/dbs/hc_emsaudt.dat
lrwx------  1 oracle oinstall 64 11月 30 12:20 15 -> /home/oracle/product/10.2.0/dbs/lkEMSAUDT
lr-x------  1 oracle oinstall 64 11月 30 12:20 16 -> /home/oracle/product/10.2.0/rdbms/mesg/orazhs.msb
lr-x------  1 oracle oinstall 64 11月 30 12:20 17 -> /home/oracle/product/10.2.0/rdbms/mesg/oraus.msb
lrwx------  1 oracle oinstall 64 11月 30 12:20 18 -> /home/oracle/oradata/emsaudt/system01.dbf
lrwx------  1 oracle oinstall 64 11月 30 12:20 19 -> /home/oracle/oradata/emsaudt/undotbs01.dbf
lr-x------  1 oracle oinstall 64 11月 30 12:20 2 -> /dev/null
lrwx------  1 oracle oinstall 64 11月 30 12:20 20 -> /home/oracle/oradata/emsaudt/sysaux01.dbf
lrwx------  1 oracle oinstall 64 11月 30 12:20 21 -> /home/oracle/oradata/emsaudt/audit_data01.dbf
lrwx------  1 oracle oinstall 64 11月 30 12:20 22 -> /home/oracle/oradata/emsaudt/audit_data02.dbf
lrwx------  1 oracle oinstall 64 11月 30 12:20 23 -> /home/oracle/oradata/emsaudt/audit_data06.dbf
lrwx------  1 oracle oinstall 64 11月 30 12:20 24 -> /data/audit_indx06.dbf
lrwx------  1 oracle oinstall 64 11月 30 12:20 28 -> /data/audit_data03.dbf (deleted)
lrwx------  1 oracle oinstall 64 11月 30 12:20 29 -> /data/audit_data04.dbf
lr-x------  1 oracle oinstall 64 11月 30 12:20 3 -> /dev/null
lrwx------  1 oracle oinstall 64 11月 30 12:20 30 -> /data/audit_indx02.dbf
lrwx------  1 oracle oinstall 64 11月 30 12:20 31 -> /home/oracle/oradata/emsaudt/temp01.dbf
lrwx------  1 oracle oinstall 64 11月 30 12:20 32 -> /data/audit_data05.dbf
lr-x------  1 oracle oinstall 64 11月 30 12:20 4 -> /dev/null
l-wx------  1 oracle oinstall 64 11月 30 12:20 5 -> /home/oracle/admin/emsaudt/udump/emsaudt_ora_5399.trc
l-wx------  1 oracle oinstall 64 11月 30 12:20 6 -> /home/oracle/admin/emsaudt/bdump/alert_emsaudt.log
lrwx------  1 oracle oinstall 64 11月 30 12:20 7 -> /home/oracle/product/10.2.0/dbs/lkinstemsaudt (deleted)
l-wx------  1 oracle oinstall 64 11月 30 12:20 8 -> /home/oracle/admin/emsaudt/bdump/alert_emsaudt.log
lrwx------  1 oracle oinstall 64 11月 30 12:20 9 -> /home/oracle/product/10.2.0/dbs/hc_emsaudt.dat

發現刪除的檔案還在這兩個目錄下,看看/目錄下還有49G,而刪除的檔案是32G,可以考慮將這個刪除的檔案物理恢復到$ORACLE_BASE/oradata/emsaudit下。

[oracle@cpemsii-cx fd]$ cp /proc/5409/fd/32 /home/oracle/oradata/emsaudit/audit_data03.dbf
恢復完後發現這個檔案大小是34358697984。和原來的一樣大小。

應該就是這個檔案吧。但是還想到5411目錄下還有一個檔案,當時害怕這個檔案也起作用,當時為了穩妥起見就將5411目錄下的檔案恢復到測試庫上暫時放在,以防後面需要用。

[oracle@cpemsii-cx fd]$ scp /proc/5411/fd/28 oracle@192.xx.xx.xx:/orabak/audit_data03.dbf

恢復完這個檔案也是34358697984這麼大,應該恢復的檔案是一樣的,那就先暫且用本機上恢復的檔案吧。

步驟:

SQL> alter database datafile 14 offline;
alter database datafile 14 offline
*
ERROR at line 1:
ORA-01145: offline immediate disallowed unless media recovery enabled

--由於資料庫未作歸檔,offline資料檔案需要新增drop選項。

SQL> alter database datafile 14 offline drop;

Database altered.

SQL> alter database rename file  '/data/audit_data03.dbf' to '/home/oracle/oradata/audit/audit_data03.dbf';

Database altered.

SQL> recover datafile 14;
Media recovery complete.
SQL> alter database datafile 14 online;

Database altered.

資料檔案恢復成功!

切換日誌:

SQL> alter system switch logfile;

System altered.

檢視alert日誌:

Private strand flush not complete
  Current log# 2 seq# 97073 mem# 0: /home/oracle/oradata/emsaudt/redo02.log
Fri Nov 30 15:59:07 2012
Thread 1 advanced to log sequence 97074 (LGWR switch)
  Current log# 3 seq# 97074 mem# 0: /home/oracle/oradata/emsaudt/redo03.log
資料庫沒有報錯:

在檢視/data空間。發現已經釋放了:

[oracle@cpemsii-cx ~]$ df -h
Filesystem            容量  已用 可用 已用% 掛載點
/dev/cciss/c0d0p3     130G   89G   13G  68% /
/dev/cciss/c0d0p1     981M   25M  906M   3% /boot
none                   16G     0   16G   0% /dev/shm
/dev/cciss/c0d1       135G  96G  32G 71% /data

問題暫時解決了,但是長久來看空間還是很少,需要新增物理磁碟來解決。

和領導彙報了此事,領導答應了。

 

--總結:

在處理這個問題的過程本來不需要做物理恢復的,就是由於本人當時犯的錯誤,好在能及時意識到問題的嚴重性且找到了解決思路。否則這次就麻煩大了,因此對這件事內心還是挺愧疚的,做了5年的DBA沒有出現過誤刪除檔案的事情,這次主要還是心情太複雜,狀態太差,處理問題不細心導致的,以後一定要警鐘長鳴,切忌做到細心,細心,再細心。。。

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

相關文章