biti出的恢復題小記

blue_prince發表於2005-03-14

原文連結:http://www.itpub.net/326938.html

起個題目:關於資料檔案恢復
這是一個假設的例子(給出的條件並不一定都須用上):
週二晚,有一個 聯機複製os檔案的指令碼,依次執行下面虛擬碼

[@more@]backup controlfile;
set feedback,head,echo,term... off
spool filename;
select 'alter tablespace '||tablespace_name || 'begin backup;' from dba_tablespaces;

select 'cp ' ||name || '......' from v$datafile;

select 'alter tablespace '||tablespace_name || 'end backup;' from dba_tablespaces;

spool off

then run the script;

但是不幸,在備份過程中失敗,只有部分檔案備份成功,但是dba並不知道。

週三,dba新加了一個資料檔案

週四,控制檔案損壞,dba手工建立了控制檔案

週五,磁碟損壞,恰好丟失了所有控制檔案和新加的這個資料檔案(該資料檔案中有非常重要的期望恢復的資料)其他資料檔案都。檢查備份,結果發現原來的備份只有部分資料檔案複製成功然後備份意外終止不再繼續執行下面任何程式碼。 很不幸,備份出來的檔案也在這個磁碟上壞了。

在這種情況下,請問,該資料檔案是否能恢復,如能,請描述過程,如不能,請闡述理由。

測試過程:

一、週二:DBA備份了控制檔案,對錶空間users和test進行備份,但是備份失敗,沒有繼續執行接下的指令碼。BITI在這裡備份沒有正常結束的意思是給以後的恢復增加難, 事實上這一步的用處不大,在後面的恢復過程中也沒增加難度,只要把置於備份狀態的資料檔案進行恢復就可將其變至非備份狀態。


SQL> alter database backup controlfile to 'e:ctl.bak';

Database altered.

SQL> alter tablespace users begin backup;

Tablespace altered.

SQL> alter tablespace test begin backup;

Tablespace altered.

二、週三:DBA為表空間TEST新加了一個資料檔案:

SQL> alter tablespace test add datafile 'd:oracleoradatademotest02.dbf' size 5M;

Tablespace altered.

三、週四:使用者插入資料並提交,此時發生了INSTANCE CRASH,丟失了全部控制檔案。

SQL> create table t (a int) tablespace test;

Table created.

SQL> insert into t values(1);

1 row created.

SQL> commit;

Commit complete.

SQL> shutdown abort
ORACLE instance shut down.

SQL> host del d:oracleoradatademo*.ctl

在CRASH後,DBA啟動資料庫發現控制檔案全部丟失後,手工建立了控制檔案並進行相應恢復:

SQL> startup
ORACLE instance started.

Total System Global Area   55646712 bytes
Fixed Size                   453112 bytes
Variable Size              37748736 bytes
Database Buffers           16777216 bytes
Redo Buffers                 667648 bytes
ORA-00205: error in identifying controlfile, check alert log for more info


SQL> create controlfile reuse database DEMO noresetlogs archivelog
  2  logfile
  3  'd:oracleoradatademoredo01.log' size 5M,
  4  'd:oracleoradatademoredo02.log' size 5M
  5  datafile
  6  'd:oracleoradatademosystem01.dbf' ,
  8  'd:oracleoradatademoundotbs01.dbf',
  9  'd:oracleoradatademousers01.dbf',
 10  'd:oracleoradatademousers02.dbf',
 11  'd:oracleoradatademousers03.dbf',
 12  'd:oracleoradatademotest01.dbf',
 13  'd:oracleoradatademotest02.dbf'
 14  character set zhs16gbk;

Control file created.

SQL> recover database;
Media recovery complete.
SQL> alter database open;

Database altered.

這時候我們可以發現使用者提交的資料已恢復成功,且原來置於備份狀態的資料檔案狀態已經改變了。

SQL> select * from t;

         A
----------
         1

SQL> select * from v$backup;

     FILE# STATUS                CHANGE# TIME
---------- ------------------ ---------- ----------
         1 NOT ACTIVE                  0
         2 NOT ACTIVE                  0
         3 NOT ACTIVE             217167 12-3?  -05
         4 NOT ACTIVE             217167 12-3?  -05
         5 NOT ACTIVE             217167 12-3?  -05
         6 NOT ACTIVE             217171 12-3?  -05
         7 NOT ACTIVE                  0

7 rows selected.

四、週五:再次發生CRASH,丟失了全部控制檔案和新增加的資料檔案:

SQL> insert into t values(2);

1 row created.

SQL> commit;

Commit complete.

SQL> shutdown abort
ORACLE instance shut down.

SQL> host del d:oracleoradatademo*.ctl

SQL> host del d:oracleoradatademotest02.dbf


SQL> startup
ORACLE instance started.

Total System Global Area   55646712 bytes
Fixed Size                   453112 bytes
Variable Size              37748736 bytes
Database Buffers           16777216 bytes
Redo Buffers                 667648 bytes
ORA-00205: error in identifying controlfile, check alert log for more info

將備份的控制檔案進行復原:

SQL> host copy e:ctl.bak d:oracleoradatademocontrol01.ctl
已複製         1 個檔案。

SQL> host copy e:ctl.bak d:oracleoradatademocontrol02.ctl
已複製         1 個檔案。

SQL> host copy e:ctl.bak d:oracleoradatademocontrol03.ctl
已複製         1 個檔案。

SQL> alter database mount;
alter database mount
*
ERROR at line 1:
ORA-01991: invalid password file 'D:oracleora92DATABASEPWDdemo.ORA'

SQL> host del D:oracleora92DATABASEPWDdemo.ORA

SQL> host orapwd file=D:oracleora92DATABASEPWDdemo.ORA password=admin entries=5

開始對資料庫進行恢復,並指定一個當前聯機日誌進行恢復:

SQL> recover database using backup controlfile;
ORA-00279: change 216889 generated at 03/12/2005 17:25:13 needed for thread 1


Specify log: {=suggested | filename | AUTO | CANCEL}
d:oracleoradatademoredo01.log
ORA-00283: recovery session canceled due to errors
ORA-01244: unnamed datafile(s) added to controlfile by media recovery
ORA-01110: data file 7: 'D:ORACLEORADATADEMOTEST02.DBF'


ORA-01112: media recovery not started

恢復過程中控制檔案已經認到新新增了的資料檔案,我們進行重新建立:

SQL> alter database create datafile 'D:ORACLEORADATADEMOTEST02.DBF' as 'D:O
RACLEORADATADEMOTEST02.DBF';
alter database create datafile 'D:ORACLEORADATADEMOTEST02.DBF' as 'D:ORACLE
ORADATADEMOTEST02.DBF'
*
ERROR at line 1:
ORA-01516: nonexistent log file, datafile, or tempfile
"D:ORACLEORADATADEMOTEST02.DBF"


SQL> select name,status from v$datafile;

NAME                                     STATUS
---------------------------------------- -------
D:ORACLEORADATADEMOSYSTEM01.DBF      SYSTEM
D:ORACLEORADATADEMOUNDOTBS01.DBF     ONLINE
D:ORACLEORADATADEMOUSERS01.DBF       ONLINE
D:ORACLEORADATADEMOUSERS02.DBF       ONLINE
D:ORACLEORADATADEMOUSERS03.DBF       ONLINE
D:ORACLEORADATADEMOTEST01.DBF        ONLINE
D:ORACLEORA92DATABASEUNNAMED00007    RECOVER

7 rows selected.

SQL> alter database create datafile 'D:ORACLEORA92DATABASEUNNAMED00007' as '
D:ORACLEORADATADEMOTEST02.DBF';

Database altered.

新新增的資料檔案已經建立完畢,這時候開始對資料庫進行恢復:

SQL> recover database using backup controlfile;
ORA-00279: change 217203 generated at 03/12/2005 17:30:02 needed for thread 1
ORA-00289: suggestion : D:ORACLEORADATADEMOARCHIVE1.ARC
ORA-00280: change 217203 for thread 1 is in sequence #1


Specify log: {=suggested | filename | AUTO | CANCEL}
d:oracleoradatademoredo01.log
ORA-00279: change 237249 generated at 03/12/2005 17:34:21 needed for thread 1
ORA-00289: suggestion : D:ORACLEORADATADEMOARCHIVE2.ARC
ORA-00280: change 237249 for thread 1 is in sequence #2
ORA-00278: log file 'd:oracleoradatademoredo01.log' no longer needed for
this recovery


Specify log: {=suggested | filename | AUTO | CANCEL}
d:oracleoradatademoredo02.log
Log applied.
Media recovery complete.
SQL> select name,status from v$datafile;

NAME                                     STATUS
---------------------------------------- -------
D:ORACLEORADATADEMOSYSTEM01.DBF      SYSTEM
D:ORACLEORADATADEMOUNDOTBS01.DBF     ONLINE
D:ORACLEORADATADEMOUSERS01.DBF       ONLINE
D:ORACLEORADATADEMOUSERS02.DBF       ONLINE
D:ORACLEORADATADEMOUSERS03.DBF       ONLINE
D:ORACLEORADATADEMOTEST01.DBF        ONLINE
D:ORACLEORADATADEMOTEST02.DBF        ONLINE

7 rows selected.

SQL> select * from v$backup;

     FILE# STATUS                CHANGE# TIME
---------- ------------------ ---------- ----------
         1 NOT ACTIVE                  0
         2 NOT ACTIVE                  0
         3 NOT ACTIVE             217167 12-3?  -05
         4 NOT ACTIVE             217167 12-3?  -05
         5 NOT ACTIVE             217167 12-3?  -05
         6 NOT ACTIVE             217171 12-3?  -05
         7 NOT ACTIVE                  0

7 rows selected.

五、開啟資料庫,驗證恢復成功(如果是生產資料庫的話此時需馬上進行一次全備份):

SQL> alter database open resetlogs;

Database altered.

SQL> select * from t;

         A
----------
         1
         2

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

相關文章