Oracle非關鍵資料檔案作業系統誤刪除處理

realkid4發表於2012-07-05

 

 

Oracle DBA而言,生產運維環境和資料的安全都是安身立命的根本。很多時候,行事謹慎、凡是先思後行往往比技術水平能力更重要。所有的Oracle使用者,在進行資料庫操作,特別是關鍵操作的時候,一定要三思而後行。

 

 

1、問題故障

 

臨下班之前,一個朋友電話諮詢資料檔案誤刪除的處理操作。問題的起因是運維DBA在建立表空間和資料檔案的時候,陰差陽錯的作業系統層面直接就將新建立出的資料檔案刪除掉。現在檔案日誌中不斷報錯說檔案不存在。具體關鍵資訊如下:

 

ü  測試環境,處在搭建過程中。資料沒有備份;

ü  誤刪除的表空間中沒有資料,經詢問也不需要將OS誤刪除的資料找回來。可以刪掉表空間之後重新建立資料;

ü  誤刪除之後,由於筆者朋友的介入,就沒有貿然關閉伺服器重啟;

ü  誤刪除表空間為普通的資料表空間,非系統System/SysauxTempUndo

ü  誤刪除表空間中包括多個資料檔案,只有一部分檔案被刪除;

ü  作業系統OSLinux環境,具體Oracle版本為10.2.0.5

 

從上面的資訊來看,這個案例不難處理。雖然沒有備份,但是畢竟這是測試環境,而且沒有任何業務資料在其中。所以,筆者是贊同將原有表空間進行丟棄處理。而且,資料表空間沒有什麼系統執行依賴,也就是即使目前損壞,也沒有對資料庫本身致命的影響。

 

由於各種原因,筆者在獲得故障alert_log之後,在自己的實驗環境中進行了相應的故障模擬。

 

2、實驗環境準備

 

這個案例中,資料庫Oracle版本不是關鍵問題。所以,筆者選擇了手頭方便的11g進行實驗。

 

 

SQL> select * from v$version;

 

BANNER

--------------------------------------------------------------------------------

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production

PL/SQL Release 11.2.0.1.0 - Production

CORE        11.2.0.1.0         Production

 

 

建立實驗表空間,由多個檔案共同組成。

 

 

SQL> create tablespace mytest datafile '/u01/app/oradata/ORA11G/datafile/mytesttbl01.dbf' size 10m autoextend off

  2  extent management local uniform. size 1m

  3  segment space management auto;

Tablespace created

 

SQL> alter tablespace mytest add datafile '/u01/app/oradata/ORA11G/datafile/mytesttbl02.dbf' size 10m autoextend off;

Tablespace altered

 

SQL> alter tablespace mytest add datafile '/u01/app/oradata/ORA11G/datafile/mytesttbl03.dbf' size 10m autoextend off;

Tablespace altered

 

SQL> alter tablespace mytest add datafile '/u01/app/oradata/ORA11G/datafile/mytesttbl04.dbf' size 10m autoextend off;

Tablespace altered

 

 

建立完的資料表空間和檔案結構如下:

 

 

SQL> select file_Name, bytes,tablespace_name from dba_data_files;

 

FILE_NAME                                                                             BYTES TABLESPACE_NAME

-------------------------------------------------------------------------------- ---------- ------------------------------

/u01/app/oradata/ORA11G/datafile/o1_mf_users_7vpyc2xd_.dbf                          5242880 USERS

/u01/app/oradata/ORA11G/datafile/o1_mf_undotbs1_7vpyc2py_.dbf                     267386880 UNDOTBS1

/u01/app/oradata/ORA11G/datafile/o1_mf_sysaux_7vpyc2hb_.dbf                       754974720 SYSAUX

/u01/app/oradata/ORA11G/datafile/o1_mf_system_7vpyc1x7_.dbf                       754974720 SYSTEM

/u01/app/oradata/ORA11G/datafile/mytesttbl01.dbf                                   10485760 MYTEST

/u01/app/oradata/ORA11G/datafile/mytesttbl02.dbf                                   10485760 MYTEST

/u01/app/oradata/ORA11G/datafile/mytesttbl03.dbf                                   10485760 MYTEST

/u01/app/oradata/ORA11G/datafile/mytesttbl04.dbf                                   10485760 MYTEST

 

8 rows selected

 

 

 

OS層面將一部分的資料檔案強制刪除。

 

 

[oracle@bsplinux datafile]$ ls -l

total 1836932

-rw-r----- 1 oracle oinstall  10493952 Jul  3 03:22 mytesttbl01.dbf

-rw-r----- 1 oracle oinstall  10493952 Jul  3 03:23 mytesttbl02.dbf

-rw-r----- 1 oracle oinstall  10493952 Jul  3 03:23 mytesttbl03.dbf

-rw-r----- 1 oracle oinstall  10493952 Jul  3 03:24 mytesttbl04.dbf

-rw-r----- 1 oracle oinstall 754982912 Jul  3 03:25 o1_mf_sysaux_7vpyc2hb_.dbf

-rw-r----- 1 oracle oinstall 754982912 Jul  3 03:23 o1_mf_system_7vpyc1x7_.dbf

-rw-r----- 1 oracle oinstall  54534144 Jul  2 22:26 o1_mf_temp_7vpz05do_.tmp

-rw-r----- 1 oracle oinstall 267395072 Jul  3 03:25 o1_mf_undotbs1_7vpyc2py_.dbf

-rw-r----- 1 oracle oinstall   5251072 Jul  3 03:14 o1_mf_users_7vpyc2xd_.dbf

 

 

[oracle@bsplinux datafile]$ rm -f mytesttbl03.dbf

[oracle@bsplinux datafile]$ rm -f mytesttbl04.dbf

 

[oracle@bsplinux datafile]$ ls -l

total 1816404

-rw-r----- 1 oracle oinstall  10493952 Jul  3 03:22 mytesttbl01.dbf

-rw-r----- 1 oracle oinstall  10493952 Jul  3 03:23 mytesttbl02.dbf

-rw-r----- 1 oracle oinstall 754982912 Jul  3 03:26 o1_mf_sysaux_7vpyc2hb_.dbf

-rw-r----- 1 oracle oinstall 754982912 Jul  3 03:26 o1_mf_system_7vpyc1x7_.dbf

-rw-r----- 1 oracle oinstall  54534144 Jul  2 22:26 o1_mf_temp_7vpz05do_.tmp

-rw-r----- 1 oracle oinstall 267395072 Jul  3 03:26 o1_mf_undotbs1_7vpyc2py_.dbf

-rw-r----- 1 oracle oinstall   5251072 Jul  3 03:14 o1_mf_users_7vpyc2xd_.dbf

 

 

此時,在alert_log中,雖然沒有明確的資訊,但是隻要涉及到相關的檔案操作,都會報錯。

 

 

SQL> create table t tablespace mytest as select * from dba_objects ;

 

create table t tablespace mytest as select * from dba_objects

 

ORA-01116: 開啟資料庫檔案 7 時出錯

ORA-01110: 資料檔案 7: '/u01/app/oradata/ORA11G/datafile/mytesttbl03.dbf'

ORA-27041: 無法開啟檔案

Linux Error: 2: No such file or directory

Additional information: 3

 

 

3、未關閉伺服器情況下的處理過程

 

處理檔案誤刪除,要區分是否關閉伺服器。在這個處理案例中,如果沒有關閉伺服器,處理的難度比較小。

 

處理的方法是直接強制的刪除表空間,連帶刪除檔案和相應內容。命令為:drop tablespace mytest including contents and datafiles。在日誌中,我們看到相關的報錯資訊。但是,還是可以成功的將表空間刪除。

 

 

Tue Jul 03 03:30:20 2012

drop tablespace mytest including contents and datafiles

 

Errors in file /u01/app/diag/rdbms/ora11g/ora11g/trace/ora11g_ora_4232.trc:

(亂碼)

Linux Error: 2: No such file or directory

Additional information: 3

(亂碼)

Linux Error: 2: No such file or directory

Additional information: 3

(亂碼)

Deleted file /u01/app/oradata/ORA11G/datafile/mytesttbl01.dbf

Deleted file /u01/app/oradata/ORA11G/datafile/mytesttbl02.dbf

Completed: drop tablespace mytest including contents and datafiles

 

 

對應的檔案資訊,的確也表示已經刪除。

 

 

[oracle@bsplinux datafile]$ ls -l

total 1795876

-rw-r----- 1 oracle oinstall 754982912 Jul  3 03:30 o1_mf_sysaux_7vpyc2hb_.dbf

-rw-r----- 1 oracle oinstall 754982912 Jul  3 03:30 o1_mf_system_7vpyc1x7_.dbf

-rw-r----- 1 oracle oinstall  54534144 Jul  2 22:26 o1_mf_temp_7vpz05do_.tmp

-rw-r----- 1 oracle oinstall 267395072 Jul  3 03:30 o1_mf_undotbs1_7vpyc2py_.dbf

-rw-r----- 1 oracle oinstall   5251072 Jul  3 03:14 o1_mf_users_7vpyc2xd_.dbf

 

 

 

4、關閉伺服器情況下的處理

 

如果因為各種原因,已經關閉了伺服器。怎麼處理呢?首先,讓我們恢復環境。

 

 

SQL> create tablespace mytest datafile '/u01/app/oradata/ORA11G/datafile/mytesttbl01.dbf' size 10m autoextend off

  2  extent management local uniform. size 1m

  3  segment space management auto;

 

Tablespace created

 

SQL> alter tablespace mytest add datafile '/u01/app/oradata/ORA11G/datafile/mytesttbl02.dbf' size 10m autoextend off;

 

Tablespace altered

 

SQL> alter tablespace mytest add datafile '/u01/app/oradata/ORA11G/datafile/mytesttbl03.dbf' size 10m autoextend off;

 

Tablespace altered

 

OS 層面的Ls –l結果)

total 1826668

-rw-r----- 1 oracle oinstall  10493952 Jul  3 03:33 mytesttbl01.dbf

-rw-r----- 1 oracle oinstall  10493952 Jul  3 03:33 mytesttbl02.dbf

-rw-r----- 1 oracle oinstall  10493952 Jul  3 03:34 mytesttbl03.dbf

-rw-r----- 1 oracle oinstall 754982912 Jul  3 03:33 o1_mf_sysaux_7vpyc2hb_.dbf

-rw-r----- 1 oracle oinstall 754982912 Jul  3 03:34 o1_mf_system_7vpyc1x7_.dbf

-rw-r----- 1 oracle oinstall  54534144 Jul  2 22:26 o1_mf_temp_7vpz05do_.tmp

-rw-r----- 1 oracle oinstall 267395072 Jul  3 03:34 o1_mf_undotbs1_7vpyc2py_.dbf

-rw-r----- 1 oracle oinstall   5251072 Jul  3 03:14 o1_mf_users_7vpyc2xd_.dbf

 

 

誤刪除表空間一個檔案。

 

 

[oracle@bsplinux datafile]$ rm mytesttbl03.dbf

[oracle@bsplinux datafile]$ ls -l

total 1816404

-rw-r----- 1 oracle oinstall  10493952 Jul  3 03:33 mytesttbl01.dbf

-rw-r----- 1 oracle oinstall  10493952 Jul  3 03:33 mytesttbl02.dbf

-rw-r----- 1 oracle oinstall 754982912 Jul  3 03:33 o1_mf_sysaux_7vpyc2hb_.dbf

-rw-r----- 1 oracle oinstall 754982912 Jul  3 03:34 o1_mf_system_7vpyc1x7_.dbf

-rw-r----- 1 oracle oinstall  54534144 Jul  2 22:26 o1_mf_temp_7vpz05do_.tmp

-rw-r----- 1 oracle oinstall 267395072 Jul  3 03:34 o1_mf_undotbs1_7vpyc2py_.dbf

-rw-r----- 1 oracle oinstall   5251072 Jul  3 03:14 o1_mf_users_7vpyc2xd_.dbf

 

 

注意,在這個時候,只有使用突然斷電和shutdown –abort方法才可能停機。因為其他幾種關機方式都會伴隨檔案檢查過程(如Checkpoint)。

 

 

SQL> conn / as sysdba

Connected.

SQL> shutdown immediate; 

ORA-01116: error in opening database file 7

ORA-01110: data file 7: '/u01/app/oradata/ORA11G/datafile/mytesttbl03.dbf'

ORA-27041: unable to open file

Linux Error: 2: No such file or directory

Additional information: 3

 

SQL> shutdown normal;

ORA-01116: error in opening database file 7

ORA-01110: data file 7: '/u01/app/oradata/ORA11G/datafile/mytesttbl03.dbf'

ORA-27041: unable to open file

Linux Error: 2: No such file or directory

Additional information: 3

 

SQL> shutdown abort

ORACLE instance shut down.

SQL>

 

 

在重新啟動的時候,從mountopen過程中,是會報錯。

 

 

SQL> conn / as sysdba

Connected to an idle instance.

SQL> startup

ORACLE instance started.

 

Total System Global Area  422670336 bytes

Fixed Size                  1336960 bytes

Variable Size             318769536 bytes

Database Buffers           96468992 bytes

Redo Buffers                6094848 bytes

Database mounted.

ORA-01157: cannot identify/lock data file 7 - see DBWR trace file

ORA-01110: data file 7: '/u01/app/oradata/ORA11G/datafile/mytesttbl03.dbf'

 

 

此時,alert_log中的資訊為。

 

 

Completed: ALTER DATABASE   MOUNT

Tue Jul 03 03:41:50 2012

ALTER DATABASE OPEN

Errors in file /u01/app/diag/rdbms/ora11g/ora11g/trace/ora11g_dbw0_4641.trc:

ORA-01157: cannot identify/lock data file 7 - see DBWR trace file

ORA-01110: data file 7: '/u01/app/oradata/ORA11G/datafile/mytesttbl03.dbf'

ORA-27037: unable to obtain file status

Linux Error: 2: No such file or directory

Additional information: 3

Errors in file /u01/app/diag/rdbms/ora11g/ora11g/trace/ora11g_ora_4684.trc:

ORA-01157: cannot identify/lock data file 7 - see DBWR trace file

ORA-01110: data file 7: '/u01/app/oradata/ORA11G/datafile/mytesttbl03.dbf'

ORA-1157 signalled during: ALTER DATABASE OPEN...

 

 

分析可以知道,在open階段,要去定位各個資料檔案,依據的內容是controlfile中的資料檔案資訊。故在open階段會報錯。

 

處理的方法是啟動到mount,之後透過命令將資料檔案向Oracle“隱藏”掉。具體處理如下:

 

 

SQL> shutdown abort

ORACLE instance shut down.

SQL> startup mount

ORACLE instance started.

 

Total System Global Area  422670336 bytes

Fixed Size                  1336960 bytes

Variable Size             318769536 bytes

Database Buffers           96468992 bytes

Redo Buffers                6094848 bytes

Database mounted.

 

 

mount階段將資料檔案隱藏掉,在open階段將tablespace刪除掉。

 

 

SQL> alter database datafile '/u01/app/oradata/ORA11G/datafile/mytesttbl03.dbf'  offline drop;

Database altered.

 

--mount階段不能處理tablespace刪除

SQL> drop tablespace mytest;     

drop tablespace mytest

*

ERROR at line 1:

ORA-01109: database not open

 

SQL> alter database open;

Database altered.

 

SQL> drop tablespace mytest;

Tablespace dropped.

 

 

Alert log上也顯示可以正常的啟動。

 

 

 

Recovery of Online Redo Log: Thread 1 Group 2 Seq 104 Reading mem 0

  Mem# 0: /u01/app/oradata/ORA11G/onlinelog/o1_mf_2_7vpyx20p_.log

  Mem# 1: /u01/app/flash_recovery_area/ORA11G/onlinelog/o1_mf_2_7vpyxdyv_.log

Completed redo application of 0.00MB

Completed crash recovery at

 Thread 1: logseq 104, block 5650, scn 2592058

 11 data blocks read, 11 data blocks written, 3 redo k-bytes read

Tue Jul 03 03:47:00 2012

Thread 1 advanced to log sequence 105 (thread open)

Thread 1 opened at log sequence 105

  Current log# 3 seq# 105 mem# 0: /u01/app/oradata/ORA11G/onlinelog/o1_mf_3_7vpyxw4h_.log

  Current log# 3 seq# 105 mem# 1: /u01/app/flash_recovery_area/ORA11G/onlinelog/o1_mf_3_7vpyy4ls_.log

Successful open of redo thread 1

MTTR advisory is disabled because FAST_START_MTTR_TARGET is not set

Successfully onlined Undo Tablespace 2.

Verifying file header compatibility for 11g tablespace encryption..

Verifying 11g file header compatibility for tablespace encryption completed

Tue Jul 03 03:47:01 2012

SMON: enabling cache recovery

SMON: enabling tx recovery

Database Characterset is AL32UTF8

No Resource Manager plan active

replication_dependency_tracking turned off (no async multimaster replication found)

Starting background process QMNC

Completed: alter database open

 

 

 

5、結論

 

在處理表空間、檔案和作業系統的時候,作為DBA一定要小心小心再小心。如果是在生產環境和沒有備份的情況下,問題處理就比較複雜了。

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

相關文章