Oracle系統表空間剛新增的一個資料檔案誤刪除恢復處理

湖湘文化發表於2013-12-27
 

    Oracle系統表空間剛新增的一個資料檔案誤刪除恢復處理

一次誤刪除求助

早上有朋友在itpub論壇發帖求助

標題:急求救!!!誤刪了oracle系統表空間的一個資料檔案導致資料庫無法啟動

帖子地址:http://www.itpub.net/thread-1837554-1-1.html

帖子內容:

昨天檢視資料庫的系統表空間,發現已經使用99%,之前加過一個系統表空間資料檔案,這次再打算增加一個system03.dbf資料檔案,但是加入後誤刪了這個資料檔案,導致資料庫無法啟動了,用了網上的方法offiine drop這個檔案,再次開啟的時候又提示這個檔案offline了,還是打不開,還rman好像也沒奏效,一定要恢復這個檔案嗎???有什麼辦法能開啟資料庫啊,這個檔案倒是無關緊要的,搞了一個晚上也沒弄出來,大牛們幫幫忙吧!!!
這是現在開啟的狀態::
SQL> startup        
ORACLE instance started.

Total System Global Area 6714322944 bytes
Fixed Size                    2226056 bytes
Variable Size                 5066721400 bytes
Database Buffers         1627389952 bytes
Redo Buffers                   17985536 bytes
Database mounted.
ORA-01147: SYSTEM tablespace file 25 is offline
ORA-01110: data file 25: '/u01/oradata/wilson/system03.dbf'

無法把offline改為online::


SQL> alter database datafile 25 online;
alter database datafile 25 online
*
ERROR at line 1:
ORA-01157: cannot identify/lock data file 25 - see DBWR trace file
ORA-01110: data file 25: '/u01/oradata/wilson/system03.dbf'

這個是system表空間,網上說的刪除表空間的辦法也不可行啊

高手支招:(最後樓主採用此方法恢復成功)

既然新新增的,加的時候一直到現在的日誌都還在嗎,在的話create一個空的然後恢復下就行了

alter database create datafile '/u01/oradata/wilson/system03.dbf';
recover datafile '/u01/oradata/wilson/system03.dbf';

恢復成功。

一點思考和總結:

這種情況的恢復看來也簡單,兩條命令,可是樓主說“搞了一個晚上也沒弄出來”,估計是經驗有限或者搜尋能力有待加強,另外可能沒有高手指點,總之應該走了不少彎路。由此可見,學習和搜尋能力,以及有高手指點,多麼重要!不用擔心受怕,不用那麼折騰了,還能輕鬆搞定問題。

本案例幸虧是剛新增的資料檔案(應該沒有資料),幸虧是誤刪除操作發生的早、發現的早(非歸檔模式,重做日誌還沒被覆蓋),否則可能要使用非常規手段了,比如bbed,或者掃描磁碟。

另外,猜測本案例涉及的應該是linuxunix平臺,發現問題後如果沒有關閉過資料庫,也可以根據檔案控制程式碼來恢復;

參考

最重要的,所有生產庫都應該設定為歸檔模式,特殊情況除外。

還有,操作要小心,做好有效的資料備份,尤其是生產環境。

另外,系統表空間不要輕易動,尤其是一些關鍵的資料字典等物件。表空間使用率高,那有可能只是表面現象,或許資料檔案還可以自動擴充套件,沒搞清楚狀況和做好充分準備前,不要隨便操作。

歸檔模式下做兩個實驗,加強印象

實驗環境  linux 5.7 64位,oracle 11.2.0.4 單例項,檔案系統

 

實驗一,誤刪除系統表空間新加的資料檔案後,透過建立空檔案,然後使用歸檔日誌或/和重做日誌來恢復

1、歸檔模式,為系統表空間新增資料檔案:

sys@ORACLE11> archive log list;

Database log mode              Archive Mode

Automatic archival             Enabled

Archive destination            USE_DB_RECOVERY_FILE_DEST

Oldest online log sequence     16

Next log sequence to archive   18

Current log sequence           18

sys@ORACLE11> alter tablespace system add datafile '/u01/app/oradata/oracle11g/system02.dbf' size 10m autoextend on;

Tablespace altered.

2、刪除新新增的資料檔案

oracle11g:/u01/app/oradata/oracle11g$mv system02.dbf system02.dbf.bak

3、建立測試表,觸發報錯:

為了觸發oracle檢測到問題,在系統表空間嘗試建立表(生產環境不能這麼操作!),建立失敗,不能開啟6號檔案:

sys@ORACLE11> create table test as select * from dba_objects;

create table test as select * from dba_objects

                                   *

ERROR at line 1:

ORA-01116: error in opening database file 6

ORA-01110: data file 6: '/u01/app/oradata/oracle11g/system02.dbf'

ORA-27041: unable to open file

Linux-x86_64 Error: 2: No such file or directory

Additional information: 3

4、嘗試直接恢復,失敗

此時如果直接恢復,會失敗,報錯檔案在使用或恢復:

sys@ORACLE11> alter database create datafile '/u01/app/oradata/oracle11g/system02.dbf';

alter database create datafile '/u01/app/oradata/oracle11g/system02.dbf'

*

ERROR at line 1:

ORA-01182: cannot create database file 6 - file is in use or recovery

ORA-01110: data file 6: '/u01/app/oradata/oracle11g/system02.dbf'

sys@ORACLE11> recover datafile 6;

ORA-00283: recovery session canceled due to errors

ORA-01124: cannot recover data file 6 - file is in use or recovery

ORA-01110: data file 6: '/u01/app/oradata/oracle11g/system02.dbf'

同時,如果手工產生檢查點,例項直接崩潰,失去聯絡:

sys@ORACLE11> alter system checkpoint;

ERROR:

ORA-03114: not connected to ORACLE

alter system checkpoint

*

ERROR at line 1:

ORA-03113: end-of-file on communication channel

Process ID: 4259

Session ID: 1 Serial number: 13

5、重啟資料庫,無法open

此時,只能嘗試啟動資料庫,報錯,找不到6號資料檔案,資料庫無法open

sys@ORACLE11> conn / as sysdba

Connected to an idle instance.

idle> startup

ORACLE instance started.

Total System Global Area  308981760 bytes

Fixed Size                  2252784 bytes

Variable Size             222298128 bytes

Database Buffers           79691776 bytes

Redo Buffers                4739072 bytes

Database mounted.

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

ORA-01110: data file 6: '/u01/app/oradata/oracle11g/system02.dbf'

開始恢復:

6、建立名字一樣的空資料檔案,不要指定大小

idle> alter database create datafile '/u01/app/oradata/oracle11g/system02.dbf';

Database altered.

注意:

此處使用的命令是alter database create datafile

如果嘗試用之前為system表空間新增資料檔案的sql語句來建立檔案會失敗,報錯,資料庫未開啟:

idle> alter tablespace system add datafile '/u01/app/oradata/oracle11g/system02.dbf' size 10m  autoextend on;

alter tablespace system add datafile '/u01/app/oradata/oracle11g/system02.dbf' size 10m  autoextend on

*

ERROR at line 1:

ORA-01109: database not open

如果指定大小等屬性,也會失敗,報錯:

idle> alter database create datafile '/u01/app/oradata/oracle11g/system02.dbf' size 10m  autoextend on;

alter database create datafile '/u01/app/oradata/oracle11g/system02.dbf' size 10m  autoextend on

                                                                         *

ERROR at line 1:

ORA-02000: missing AS keyword

7、資料檔案恢復:

idle> recover datafile 6;

Media recovery complete.

idle> select instance_name ,status from v$instance;

INSTANCE_NAME    STATUS

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

oracle11g        MOUNTED

8、開啟資料庫,恢復成功:

idle> alter database open;

Database altered.

idle> conn / as sysdba

Connected.

sys@ORACLE11> select file_name,bytes/1024/1024 M ,autoextensible,status from dba_data_files;

FILE_NAME                                                   M AUT STATUS

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

/u01/app/oradata/oracle11g/users01.dbf                 213.75 YES AVAILABLE

/u01/app/oradata/oracle11g/undotbs01.dbf                   70 YES AVAILABLE

/u01/app/oradata/oracle11g/sysaux01.dbf                   550 YES AVAILABLE

/u01/app/oradata/oracle11g/system01.dbf                   760 YES AVAILABLE

/u01/app/oradata/oracle11g/goldengate01.dbf                10 YES AVAILABLE

/u01/app/oradata/oracle11g/system02.dbf                    10 YES AVAILABLE

6 rows selected.

恢復成功。

實驗二,誤刪除系統表空間新加的資料檔案後,透過檔案控制程式碼,然後使用歸檔日誌或/和重做日誌來恢復

1、資料庫open時,系統級別刪除系統表空間新加的資料檔案

sys@ORACLE11> host rm /u01/app/oradata/oracle11g/system02.dbf

2、建立測試表,觸發報錯

sys@ORACLE11> create table test as select * from dba_objects;

create table test as select * from dba_objects

                                   *

ERROR at line 1:

ORA-01116: error in opening database file 6

ORA-01110: data file 6: '/u01/app/oradata/oracle11g/system02.dbf'

ORA-27041: unable to open file

Linux-x86_64 Error: 2: No such file or directory

Additional information: 3

此時資料庫還沒有關閉,作業系統級別利用檔案控制程式碼複製回資料檔案:

3、獲得dbw程式號:

oracle11g:/u01/app/oradata/oracle11g$ps -ef|grep dbw0|grep -v grep

oracle    4308     1  0 14:34 ?        00:00:00 ora_dbw0_oracle11g

4dbw程式會開啟所有資料檔案的控制程式碼。到proc相應目錄下檢視,目錄名是程式號,fd表示檔案描述符,紅色標記deleted為被刪除了的:

oracle11g:/u01/app/oradata/oracle11g$cd /proc/4308/fd

oracle11g:/proc/4308/fd$pwd

/proc/4308/fd

oracle11g:/proc/4308/fd$ls

0  1  10  13  2  256  257  258  259  260  261  262  263  264  3  4  5  6  7  8  9

oracle11g:/proc/4308/fd$ls -l

總計 0

lr-x------ 1 oracle oinstall 64 12-27 15:02 0 -> /dev/null

l-wx------ 1 oracle oinstall 64 12-27 15:02 1 -> /dev/null

lrwx------ 1 oracle oinstall 64 12-27 15:02 10 -> /u01/app/oracle/product/11.2/dbs/lkORACLE11G

lr-x------ 1 oracle oinstall 64 12-27 15:02 13 -> /u01/app/oracle/product/11.2/rdbms/mesg/oraus.msb

l-wx------ 1 oracle oinstall 64 12-27 15:02 2 -> /dev/null

lrwx------ 1 oracle oinstall 64 12-27 15:02 256 -> /u01/app/oradata/oracle11g/control01.ctl

lrwx------ 1 oracle oinstall 64 12-27 15:02 257 -> /u01/app/oracle/fast_recovery_area/oracle11g/control02.ctl

lrwx------ 1 oracle oinstall 64 12-27 15:02 258 -> /u01/app/oradata/oracle11g/system01.dbf

lrwx------ 1 oracle oinstall 64 12-27 15:02 259 -> /u01/app/oradata/oracle11g/sysaux01.dbf

lrwx------ 1 oracle oinstall 64 12-27 15:02 260 -> /u01/app/oradata/oracle11g/undotbs01.dbf

lrwx------ 1 oracle oinstall 64 12-27 15:02 261 -> /u01/app/oradata/oracle11g/users01.dbf

lrwx------ 1 oracle oinstall 64 12-27 15:02 262 -> /u01/app/oradata/oracle11g/goldengate01.dbf

lrwx------ 1 oracle oinstall 64 12-27 15:02 263 -> /u01/app/oradata/oracle11g/system02.dbf (deleted)

lrwx------ 1 oracle oinstall 64 12-27 15:02 264 -> /u01/app/oradata/oracle11g/temp01.dbf

lr-x------ 1 oracle oinstall 64 12-27 15:02 3 -> /dev/null

lr-x------ 1 oracle oinstall 64 12-27 15:02 4 -> /dev/null

lr-x------ 1 oracle oinstall 64 12-27 15:02 5 -> /dev/null

lr-x------ 1 oracle oinstall 64 12-27 15:02 6 -> /u01/app/oracle/product/11.2/rdbms/mesg/oraus.msb

lr-x------ 1 oracle oinstall 64 12-27 15:02 7 -> /proc/4308/fd

lr-x------ 1 oracle oinstall 64 12-27 15:02 8 -> /dev/zero

lrwx------ 1 oracle oinstall 64 12-27 15:02 9 -> /u01/app/oracle/product/11.2/dbs/hc_oracle11g.dat

5、直接cp該控制程式碼檔名回原來的位置:

oracle11g:/proc/4308/fd$cp 263 /u01/app/oradata/oracle11g/system02.dbf

oracle11g:/proc/4308/fd$cd /u01/app/oradata/oracle11g/

oracle11g:/u01/app/oradata/oracle11g$ls

control01.ctl     redo01.log  redo03.log    system01.dbf  temp01.dbf     users01.dbf

goldengate01.dbf  redo02.log  sysaux01.dbf  system02.dbf  undotbs01.dbf

6、直接恢復,報錯,當前在使用不能恢復:

因為是系統表空間,不能離線不能直接恢復,需要重啟資料庫後才能進行恢復;

sys@ORACLE11> alter database datafile 6 offline;

alter database datafile 6 offline

*

ERROR at line 1:

ORA-01541: system tablespace cannot be brought offline; shut down if necessary

sys@ORACLE11> recover datafile 6;

ORA-00283: recovery session canceled due to errors

ORA-01124: cannot recover data file 6 - file is in use or recovery

ORA-01110: data file 6: '/u01/app/oradata/oracle11g/system02.dbf'

7、重啟資料庫

sys@ORACLE11> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

sys@ORACLE11> startup

ORACLE instance started.

Total System Global Area  308981760 bytes

Fixed Size                  2252784 bytes

Variable Size             222298128 bytes

Database Buffers           79691776 bytes

Redo Buffers                4739072 bytes

Database mounted.

ORA-01113: file 6 needs media recovery

ORA-01110: data file 6: '/u01/app/oradata/oracle11g/system02.dbf'

8、進行系統表空間資料檔案恢復

sys@ORACLE11> sys@ORACLE11> sys@ORACLE11> recover datafile 6;

Media recovery complete.

sys@ORACLE11> truncate table test;

truncate table test

*

ERROR at line 1:

ORA-01109: database not open

9、開啟資料庫,恢復成功:

sys@ORACLE11> alter database open;

Database altered.

恢復成功。

實驗總結:

系統表空間新新增的資料檔案恢復,以上兩種方法都需要重啟資料庫,都需要使用歸檔日誌或線上重做日誌來恢復。

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

相關文章