用戶管理的和基於RMAN的不完全恢復

用戶管理的和基於RMAN的不完全恢復

執行不完全的數據庫恢復操作,需要理解重做日誌和archivelog進程/oracle數據庫的同步和允許執行不完全恢復使用的選項.

不完全恢復是出現某些類型的錯誤時,唯一可以使用的恢復方法.理解何時以及怎樣使用不完全恢復方法是很重要的.在任何時候,只要出現了一個可以導致你不能恢復到改變以前的數據庫狀態的錯誤,就需要使用下面幾種不完全恢復方法之一.

Cancel:基於刪除的不完全介質恢復;

Time:基於時間的不完全介質恢復;

Change:基於變化的不完全介質恢復.

每一個選項都可以恢復到出錯的那一刻.出現三種選項的主要原因是,如果有三個選項的話,DBA就會有更大的靈活性,並且在恢復過程中能夠控制到何處停止恢復.在下面的部分中,講詳細地描述每一個選項.

只要不想把所有的在線和歸檔日誌文件都應用到數據庫中,在任何時間都可以執行不完全恢復.

可能會需要這種類型恢復的情況是:數據文件損壞,重做日誌損壞,或者由於用戶的錯誤丟失了一個表.

有些情況下只能執行不完全恢復.如果是由於當前的,不活動的,非歸檔重做日誌文件的損壞或者丟失引起的錯誤,就不能使用這些文件中的事務對數據庫進行恢復.相反,如果執行了完全的恢復,恢復過程的結果就是再一次引入錯誤.

基於刪除的恢復

這種恢復提供的靈活性最小,並且控制恢復過程中停止點的能力也最小.這裏,恢復過程需要使用檔案日誌,在完成恢復之前的某點輸入cancel命令,在這一點恢復就會停止,並且不會再使用更多的檔案日誌.

下面是執行基於刪除的不完全恢復所需要的步驟:

1.       確保數據庫是使用sqlplus中的shutdown命令關閉的(包括四種類型的shutdown);

2.       確保當前的數據文件/控制文件/參數文件存在副本(恢復前備份當前的數據庫文件).萬一出現錯誤,只要這些文件存在,就可以重新啓動恢復過程,如果需要的話,還可以不引入任何新的錯誤,而這些錯誤在以前的錯誤恢復過程中可能會引入.

3.       確保備份文件存在.

4.       把數據文件從備份位置恢復到正確的位置.

5.       啓動mount模式下的數據庫.

6.       確保要恢復的數據文件都是聯機的.select file#,status,enabled,name frm v$datafile;

7.       recover database [using backup controlfile] until cancel;

8.       alter database open resetlogs; 選項resetlogs用於確保用在恢復過程中的日誌文件永遠不能再被其他的任何操作使用.因爲reseglogs會重新設置日誌文件順序並重建現存的聯機重做日誌.resetlogs不斷地刪除存在於非歸檔日誌文件中的事務.同時,這個過程還使日誌文件和數據文件/控制文件保持同步,如果沒有清除這些事務的話,日誌文件就會創建錯誤的檔案日誌.這就是執行不完全恢復之前,需要給控制文件/數據文件和重做日誌文件做一個備份的原因,一旦出錯,可以用備份的文件重啓恢復過程.

9.       重新執行數據庫的冷備份或完全熱備份,現存的備份不在有效,需要清除.

基於時間的恢復

在這種類型的恢復中,dba將數據庫恢復到出錯前的那一點.這比基於刪除的恢復有更大的靈活性和控制能力.基於刪除選項的粒度就是重做日誌文件的大小;一旦你應用了某個重做日誌文件,就會獲得該文件中的所有事務.而不管填滿那個日誌所需要的時間,如果你選擇auto,則會導致應用所有的歸檔日誌文件.

在基於時間的恢復中,把檔案日誌應用到數據庫的指定點上,這一點如果在檔案日誌的前半部分,則沒有必要應用整個的檔案日誌.

使用基於時間的恢復步驟和基於刪除的恢復步驟一樣,只是需要在第7步將代碼稍做修改如下:recover database using backup controlfile until time ‘2009-02-27 10:37’;

     下面我們來作個測試,在刪除某個表之後,使用基於時間的恢復完成數據庫的不完全恢復過程.

1,確保數據庫是使用sqlplus中的shutdown命令關閉的(包括四種類型的shutdown);

SQL> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

 

2,對數據庫執行冷備,備份所有的數據文件,控制文件,和在線日誌文件

$ cp *.dbf backup1

$ cp *.ctl backup1

$ cp *.LOG backup1

3,啓動數據庫,創建一個表,在插入數據後記錄時間點,刪除該表

SQL> startup

ORACLE instance started.

 

Total System Global Area 1511484856 bytes

Fixed Size                   736696 bytes

Variable Size             553648128 bytes

Database Buffers      956301312 bytes

Redo Buffers              798720 bytes

Database mounted.

Database opened.

SQL> create table mytable(f1 varchar2(2));

 

Table created.

 

SQL> alter system switch logfile;

 

System altered.

 

SQL> insert into mytable

  2  select 21 from dual;

 

1 row created.

 

SQL> commit;

 

Commit complete.

 

SQL> alter system switch logfile;

 

System altered.

 

SQL> insert into mytable

  2  select 22 from dual;

 

1 row created.

 

SQL> commit;

 

Commit complete.

 

SQL> alter system switch logfile;

 

System altered.

 

SQL> insert into mytable

  2  select 23 from dual;

 

1 row created.

 

SQL> commit;

 

Commit complete.

 

SQL> alter system switch logfile;

 

System altered.

 

SQL> insert into mytable

  2  select 24 from dual;

 

1 row created.

 

SQL> commit;

 

Commit complete.

 

SQL> alter system switch logfile;

 

System altered.

 

SQL> insert into mytable

  2  select 25 from dual;

 

1 row created.

 

SQL> commit;

 

Commit complete.

 

SQL>                 

SQL>

SQL>

SQL>

SQL> select * from mytable;

 

F1

----

21

22

23

24

25

 

SQL> select to_char(sysdate,'YYYY-MM-DD HH24:MI:SS') from dual;

 

TO_CHAR(SYSDATE,'YYYY-MM-DDHH24:MI:SS'

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

2009-02-27 10:54:55

 

SQL> drop table mytable;

 

Table dropped.

 

SQL> alter system switch logfile;

 

System altered.

 

SQL> shutdown

Database closed.

Database dismounted.

ORACLE instance shut down.

4,確保當前的數據文件/控制文件/參數文件存在副本(恢復前備份當前的數據庫文件).萬一出現錯誤,只要這些文件存在,就可以重新啓動恢復過程,如果需要的話,還可以不引入任何新的錯誤,而這些錯誤在以前的錯誤恢復過程中可能會引入.

$ mv *.dbf backup1

$ ls

REDO1_01.LOG     REDO2_01.LOG     ant              backup_datafile  control02.ctl    lost+found

REDO1_0101.LOG   REDO2_02.LOG     backcopies       bea              control03.ctl    tmp

REDO1_0102.LOG   REDO3_01.LOG     backup           bea80            directory.out

REDO1_02.LOG     REDO3_02.LOG     backup1          control01.ctl    file

$

$

$ mv *.ctl backup1

$ cp *.LOG backup1

5,確保備份文件存在.

$ cd backcopies

$

$ ls

CTL01.dbf       OD01.dbf        REDO1_02.LOG    REDO3_02.LOG    control01.ctl   drsys01.dbf     temp01.dbf

FBI.dbf         REDO1_01.LOG    REDO2_01.LOG    RPTD01.dbf      control02.ctl   example01.dbf   tools01.dbf

HAPPYTREE.dbf   REDO1_0101.LOG  REDO2_02.LOG    RPTI01.dbf      control03.ctl   indx01.dbf      undotbs03.dbf

HTEC.dbf        REDO1_0102.LOG  REDO3_01.LOG    TEMP1_01.dbf    cwmlite01.dbf   system01.dbf    users01.dbf

6,把數據文件從備份位置恢復到正確的位置.

$ cp *.dbf /oradata

$ pwd

/oradata/backcopies

$ cp *.ctl /oradata

7,啓動mount模式下的數據庫.

SQL> startup mount 

ORACLE instance started.

 

Total System Global Area 1511484856 bytes

Fixed Size                   736696 bytes

Variable Size             553648128 bytes

Database Buffers      956301312 bytes

Redo Buffers              798720 bytes

Database mounted.

8,recover database [using backup controlfile] until time ‘2009-02-27 10:54:55’;

SQL> recover database until time '2009-02-27 10:54:55';

Media recovery complete.

SQL>

SQL>

SQL>

SQL> alter database open;

alter database open

*

ERROR at line 1:

ORA-01589: must use RESETLOGS or NORESETLOGS option for database open

 

 

SQL> alter database open resetlogs;

 

Database altered.

9,重新執行數據庫的冷備份或完全熱備份,現存的備份不在有效,需要清除.

用戶或者會發現,如果執行上面的測試,我們並沒有辦法恢復已經刪除的表數據,這是因爲我們對一個不需要recover的表進行了recover,所以until 操作並不會生效.

 

基於變化(SCN)的恢復

在基於變化的恢復中,需要恢復到出錯前的SCN(system change number),這種類型的恢復,可以進行控制的方面更多.SCNoracle中用來唯一標識每一個提交事務的工具,scn是一個號碼,它順序排列每個重做日誌中出現的每一個事務.在反轉段/控制文件和數據文件的事務表中,也有對這個號碼的記錄(用戶可以使用LOGMNR查看得到需要恢復到的SCN).SCN用來調節這些事務和這些文件與數據庫的同步,使之處於統一的狀態.

每一個重做日誌與一個低的和高的SCN相關聯,v$log_history視圖下可以看到這些SCN信息.

通過使用until change scn可以完成一個基於變化的不完全恢復.

小結:

使用不完全恢復,可以把數據庫恢復到數據庫出錯前的那一刻,或者是恢復到出錯前最後一個可用的事務.換句話說,這種恢復類型的結果是,恢復後的數據庫丟失了事務,所以叫不完全恢復.

可能有很多原因,使得你不得不執行數據庫的不完全恢復.比如數據庫系統癱瘓或者丟失了數據庫對象.這意味着,在恢復過程中需要停止使用可用的檔案日誌.如果不停止的話,可能會把錯誤重新引入到數據庫中,因爲從檔案重做日誌中重新讀入了錯誤的事務.

另一種需要執行不完全恢復的情況是,數據庫丟失了當前的重做日誌文件,這種錯誤只能使用不完全恢復解決問題.

不完全恢復是恢復某些類型的錯誤的關鍵方法,爲了對測試進行更充分的準備,必須理解這些概念.在日常維護中,比如要把數據庫從一個服務器轉移到另外一個服務器時也可以使用這些概念.

 

 

 

 

 

 

發佈了86 篇原創文章 · 獲贊 5 · 訪問量 46萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章