天天看點

在oracle下我們如何正确的執行資料庫恢複

當資料庫需要進行媒體恢複時,為了確定資料庫能夠順利的執行恢複過程,恢複資料庫到目前狀态。我們要做的就是驗證!驗證什麼呢?當然是驗證備份集和歸檔是否能夠進行有效的恢複。防止我們restore後,執行recover時卻發現歸檔缺少了一堆,頓時傻眼。

比方說,在資料庫目前日志序列号為3時我們完全備份了資料庫。在資料庫目前聯機日志序列号為13時資料庫損壞需要恢複。假設資料庫聯機日志組為3組,則可以推斷資料庫聯機日志序列号分别為11、12、13。是以當資料庫執行restore database後,再執行recover時不難推斷資料庫需要應用歸檔3、4、5、6、7、8、9、10以及聯機日志11、12、13來進行完全恢複。

為了能夠順利的執行完全恢複,我們在執行恢複前,需要對restore調用的備份集進行恢複驗證(語句為:restorevalidate database)以及驗證recover過程所需的歸檔3-10(語句為:restore validate archivelog sequence between 3 and10)。

以完全恢複為例,舉例如下:

1資料庫目前日志seq号為59,我們備份資料庫

SQL> selectgroup#,archived,sequence#,status from v$log;

  GROUP# ARC  SEQUENCE# STATUS

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

       1 YES         58 INACTIVE

       2 NO         59 CURRENT

       3 YES         57 INACTIVE

RMAN> backup database format'/backup/fullbk-%T-%U.bak';      

Starting backup at 2014-02-17 12:03:28

using channel ORA_DISK_1

channel ORA_DISK_1: starting full datafilebackup set

channel ORA_DISK_1: specifying datafile(s)in backup set

input datafile file number=00004name=/oracle/CRM/CRM/users01.dbf

input datafile file number=00001name=/oracle/CRM/CRM/system01.dbf

input datafile file number=00002name=/oracle/CRM/CRM/sysaux01.dbf

input datafile file number=00003name=/oracle/CRM/CRM/undotbs01.dbf

input datafile file number=00005name=/oracle/CRM/CRM/crm.dbf

input datafile file number=00006name=/oracle/CRM/test.dbf

input datafile file number=00008name=/oracle/CRM/jxc.dbf

input datafile file number=00007name=/oracle/CRM/user01.dbf

channel ORA_DISK_1: starting piece 1 at2014-02-17 12:03:29

channel ORA_DISK_1: finished piece 1 at2014-02-17 12:05:57

piecehandle=/backup/fullbk-20140217-3ep0rj0h_1_1.bak tag=TAG20140217T120328 comment=NONE

channel ORA_DISK_1: backup set complete,elapsed time: 00:02:28

including current control file in backupset

including current SPFILE in backup set

channel ORA_DISK_1: starting piece 1 at2014-02-17 12:06:01

channel ORA_DISK_1: finished piece 1 at2014-02-17 12:06:02

piecehandle=/backup/fullbk-20140217-3fp0rj56_1_1.bak tag=TAG20140217T120328comment=NONE

channel ORA_DISK_1: backup set complete,elapsed time: 00:00:01

Finished backup at 2014-02-17 12:06:02

2 當資料庫聯機日志為69時資料庫崩潰需要進行媒體恢複

SQL> selectgroup#,archived,sequence#,status from v$Log;

       1 YES         67 INACTIVE

       2 YES         68 INACTIVE

       3 NO          69 CURRENT

注意:這裡其實我們可以推斷,如果資料庫需要恢複到目前狀态,那麼歸檔59到歸檔66的所有歸檔,必須能夠進行有效的恢複。我們隻需要發起restore database preview指令,Oracle便可以給出我們歸檔清單,繼續往下看。

3 判定目前資料庫恢複所需要備份集和歸檔條目

注意對于restore database preview列出的歸檔條目,recover執行完全恢複時并不會完全應用,因為完全恢複recover過程是:應用相關歸檔+ 所有聯機日志,seq号從小到大依次應用。後面會抓取recover過程,這裡先暫且提一下。

RMAN> restore database preview;

Starting restore at 2014-02-17 16:14:21

using target database control file insteadof recovery catalog

allocated channel: ORA_DISK_1

channel ORA_DISK_1: SID=63 device type=DISK

List of Backup Sets

===================

BS Key Type LV Size       Device TypeElapsed Time Completion Time    

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

108    Full    2.03G      DISK        00:02:26     2014-02-17 12:05:38

      BP Key: 108   Status:AVAILABLE  Compressed: NO  Tag: TAG20140217T120328

Piece Name:/backup/fullbk-20140217-3ep0rj0h_1_1.bak  

注意:這裡顯示備份片總是rman資料庫中記錄的資料檔案最新的備份

List of Datafiles in backup set 108

File LV Type Ckp SCN    CkpTime            Name

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

1       Full 4028039    2014-02-17 12:03:29/oracle/CRM/CRM/system01.dbf

2       Full 4028039    2014-02-17 12:03:29/oracle/CRM/CRM/sysaux01.dbf

3       Full 4028039    2014-02-17 12:03:29/oracle/CRM/CRM/undotbs01.dbf

4       Full 4028039    2014-02-17 12:03:29/oracle/CRM/CRM/users01.dbf

5       Full 4028039    2014-02-17 12:03:29 /oracle/CRM/CRM/crm.dbf

6       Full 4028039    2014-02-17 12:03:29 /oracle/CRM/test.dbf

7       Full 4028039    2014-02-17 12:03:29 /oracle/CRM/user01.dbf

8       Full 4028039    2014-02-17 12:03:29 /oracle/CRM/jxc.dbf

List of Archived Log Copies for databasewith db_unique_name CRM

=====================================================================

Key    Thrd Seq    S Low Time          

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

131    1    59      A 2014-02-17 11:55:37

Name:/oracle/archivelog/arch_1_59_839098938.arch

132    1    60      A 2014-02-17 12:10:20

Name:/oracle/archivelog/arch_1_60_839098938.arch

133    1    61      A 2014-02-17 12:10:21

Name:/oracle/archivelog/arch_1_61_839098938.arch

134    1    62      A 2014-02-17 12:10:26

Name:/oracle/archivelog/arch_1_62_839098938.arch

135    1    63      A 2014-02-17 12:10:30

Name:/oracle/archivelog/arch_1_63_839098938.arch

136    1    64      A 2014-02-17 12:10:31

Name:/oracle/archivelog/arch_1_64_839098938.arch

137    1    65      A 2014-02-17 12:10:32

Name:/oracle/archivelog/arch_1_65_839098938.arch

138    1    66      A 2014-02-17 12:10:33

Name:/oracle/archivelog/arch_1_66_839098938.arch

139    1    67      A 2014-02-17 12:10:34

 Name:/oracle/archivelog/arch_1_67_839098938.arch

140    1    68      A 2014-02-17 12:10:36

Name:/oracle/archivelog/arch_1_68_839098938.arch

Media recovery start SCN is 4028039

Recovery must be done beyond SCN 4028039 toclear datafile fuzziness

Finished restore at 2014-02-17 16:14:24

注意:

1 上面seq号這一列顯示的最後一個歸檔seq為68(從前面可知資料庫目前聯機日志檔案seq号為69)也就是說restore database preview顯示的歸檔清單結果中最後一個歸檔seq号總是比目前聯機日志(目前聯機日志也就是檢視v$log狀态為currnt的日志組)檔案seq号小于1.

2  結合目前資料庫的聯機日志組seq号分别為67 68 69,可以判斷:在recover應用最後一個歸檔seq号為66後,oracle會讀取seq号為67、68、69聯機日志檔案繼續推進該資料庫來實作整個資料庫完全恢複過程。

下面将示範整個驗證和恢複過程:

4 驗證恢複時需要用到的備份集是否能夠正常恢複。

RMAN> restore validate database;

注意:這條指令直接會去rman資料庫中找最新的備份集進行驗證,也就是restore database preview指令顯示的備份集。

Starting restore at 2014-02-17 16:14:59

channel ORA_DISK_1: starting validation ofdatafile backup set

channel ORA_DISK_1: reading from backuppiece /backup/fullbk-20140217-3ep0rj0h_1_1.bak

channel ORA_DISK_1: piecehandle=/backup/fullbk-20140217-3ep0rj0h_1_1.bak tag=TAG20140217T120328

channel ORA_DISK_1: restored backup piece 1

channel ORA_DISK_1: validation complete,elapsed time: 00:00:36

Finished restore at 2014-02-17 16:15:35

5 驗證恢複時應用的歸檔

RMAN> restore validate archivelogsequence between 59 and 66;

Starting restore at 2014-02-17 16:16:34

channel ORA_DISK_1: scanning archived log /oracle/archivelog/arch_1_59_839098938.arch

channel ORA_DISK_1: scanning archived log/oracle/archivelog/arch_1_60_839098938.arch

channel ORA_DISK_1: scanning archived log/oracle/archivelog/arch_1_61_839098938.arch

channel ORA_DISK_1: scanning archived log/oracle/archivelog/arch_1_62_839098938.arch

channel ORA_DISK_1: scanning archived log/oracle/archivelog/arch_1_63_839098938.arch

channel ORA_DISK_1: scanning archived log/oracle/archivelog/arch_1_64_839098938.arch

channel ORA_DISK_1: scanning archived log/oracle/archivelog/arch_1_65_839098938.arch

channel ORA_DISK_1: scanning archived log/oracle/archivelog/arch_1_66_839098938.arch

Finished restore at 2014-02-17 16:16:37

6 執行restore和recover過程如下

RMAN> restore database;

Starting restore at 2014-02-17 16:36:23

channel ORA_DISK_1: starting datafilebackup set restore

channel ORA_DISK_1: specifying datafile(s)to restore from backup set

channel ORA_DISK_1: restoring datafile 00001to /oracle/CRM/CRM/system01.dbf

channel ORA_DISK_1: restoring datafile00002 to /oracle/CRM/CRM/sysaux01.dbf

channel ORA_DISK_1: restoring datafile00003 to /oracle/CRM/CRM/undotbs01.dbf

channel ORA_DISK_1: restoring datafile00004 to /oracle/CRM/CRM/users01.dbf

channel ORA_DISK_1: restoring datafile00005 to /oracle/CRM/CRM/crm.dbf

channel ORA_DISK_1: restoring datafile00006 to /oracle/CRM/test.dbf

channel ORA_DISK_1: restoring datafile00007 to /oracle/CRM/user01.dbf

channel ORA_DISK_1: restoring datafile00008 to /oracle/CRM/jxc.dbf

channel ORA_DISK_1: restore complete,elapsed time: 00:02:08

Finished restore at 2014-02-17 16:38:35

注意:restore後我們通過查詢x$kcvfh的redo位元組位址(RBA)的seq号(也就是是FHRBA_SEQ字段)可以得到restore database 後資料檔案頭部記錄的rba.seq号, 該值近一步表明recover過程需要從seq号為59歸檔開始應用。

或者也可以從restore database後資料檔案頭部的scn值,對比歸檔的first_change# 和 next_change# 推斷出recover 需要應用歸檔開始。

SQL> select hxfil,fhscn,fhrba_seq fromx$kcvfh;

   HXFIL FHSCN             FHRBA_SEQ

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

       1 4028039                  59

       2 4028039                 59

       3 4028039                  59

       4 4028039                  59

       5 4028039                  59

       6 4028039                  59

       7 4028039                  59

       8 4028039                  59

8 rows selected.

當然restore database 後,我們也可以直接查詢v$recvoery_log來得到recover過程需要應用的歸檔條目,如下所示:

select * from v$recovery_log;

 THREAD#  SEQUENCE# TIME      ARCHIVE_NAME

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

       1         59 17-FEB-14/oracle/archivelog/arch_1_59_839098938.arch

       1         60 17-FEB-14/oracle/archivelog/arch_1_60_839098938.arch

       1         61 17-FEB-14 /oracle/archivelog/arch_1_61_839098938.arch

       1         62 17-FEB-14/oracle/archivelog/arch_1_62_839098938.arch

       1         63 17-FEB-14/oracle/archivelog/arch_1_63_839098938.arch

       1         64 17-FEB-14/oracle/archivelog/arch_1_64_839098938.arch

       1         65 17-FEB-14/oracle/archivelog/arch_1_65_839098938.arch

       1         66 17-FEB-14/oracle/archivelog/arch_1_66_839098938.arch

RMAN> recover database;

Starting recover at 2014-02-17 16:45:01

starting media recovery

archived log for thread 1 with sequence 59is already on disk as file /oracle/archivelog/arch_1_59_839098938.arch

archived log for thread 1 with sequence 60is already on disk as file /oracle/archivelog/arch_1_60_839098938.arch

archived log for thread 1 with sequence 61is already on disk as file /oracle/archivelog/arch_1_61_839098938.arch

archived log for thread 1 with sequence 62is already on disk as file /oracle/archivelog/arch_1_62_839098938.arch

archived log for thread 1 with sequence 63is already on disk as file /oracle/archivelog/arch_1_63_839098938.arch

archived log for thread 1 with sequence 64is already on disk as file /oracle/archivelog/arch_1_64_839098938.arch

archived log for thread 1 with sequence 65is already on disk as file /oracle/archivelog/arch_1_65_839098938.arch

archived log for thread 1 with sequence 66is already on disk as file /oracle/archivelog/arch_1_66_839098938.arch

archived log for thread 1 with sequence 67is already on disk as file /oracle/archivelog/arch_1_67_839098938.arch

archived log for thread 1 with sequence 68is already on disk as file /oracle/archivelog/arch_1_68_839098938.arch

archived log filename=/oracle/archivelog/arch_1_59_839098938.arch thread=1 sequence=59

archived log file name=/oracle/archivelog/arch_1_60_839098938.archthread=1 sequence=60

archived log filename=/oracle/archivelog/arch_1_61_839098938.arch thread=1 sequence=61

archived log filename=/oracle/archivelog/arch_1_62_839098938.arch thread=1 sequence=62

archived log filename=/oracle/archivelog/arch_1_63_839098938.arch thread=1 sequence=63

archived log filename=/oracle/archivelog/arch_1_64_839098938.arch thread=1 sequence=64

archived log filename=/oracle/archivelog/arch_1_65_839098938.arch thread=1 sequence=65

archived log filename=/oracle/archivelog/arch_1_66_839098938.arch thread=1 sequence=66

media recovery complete, elapsed time:00:00:08

Finished recover at 2014-02-17 16:45:16

注意:這裡可以清楚的看到應用的歸檔條目(紅色标記處)

7 跟蹤recover過程内容如下:

alter database recoverlogfile '/oracle/archivelog/arch_1_59_839098938.arch'

Media Recovery Log/oracle/archivelog/arch_1_59_839098938.arch

Mon Feb 17 16:45:12 2014

ORA-279 signalled during: alter databaserecover logfile '/oracle/archivelog/arch_1_59_839098938.arch'...

alter database recoverlogfile '/oracle/archivelog/arch_1_60_839098938.arch'

Media Recovery Log/oracle/archivelog/arch_1_60_839098938.arch

ORA-279 signalled during: alter databaserecover logfile '/oracle/archivelog/arch_1_60_839098938.arch'...

alter database recoverlogfile '/oracle/archivelog/arch_1_61_839098938.arch'

Media Recovery Log/oracle/archivelog/arch_1_61_839098938.arch

ORA-279 signalled during: alter databaserecover logfile '/oracle/archivelog/arch_1_61_839098938.arch'...

alter database recoverlogfile '/oracle/archivelog/arch_1_62_839098938.arch'

Media Recovery Log/oracle/archivelog/arch_1_62_839098938.arch

ORA-279 signalled during: alter databaserecover logfile '/oracle/archivelog/arch_1_62_839098938.arch'...

alter database recoverlogfile '/oracle/archivelog/arch_1_63_839098938.arch'

Media Recovery Log/oracle/archivelog/arch_1_63_839098938.arch

ORA-279 signalled during: alter databaserecover logfile '/oracle/archivelog/arch_1_63_839098938.arch'...

alter database recoverlogfile '/oracle/archivelog/arch_1_64_839098938.arch'

Media Recovery Log/oracle/archivelog/arch_1_64_839098938.arch

ORA-279 signalled during: alter databaserecover logfile '/oracle/archivelog/arch_1_64_839098938.arch'...

alter database recoverlogfile '/oracle/archivelog/arch_1_65_839098938.arch'

Media Recovery Log/oracle/archivelog/arch_1_65_839098938.arch

ORA-279 signalled during: alter databaserecover logfile '/oracle/archivelog/arch_1_65_839098938.arch'...

alter database recoverlogfile '/oracle/archivelog/arch_1_66_839098938.arch'

Media Recovery Log/oracle/archivelog/arch_1_66_839098938.arch

Mon Feb 17 16:45:14 2014

Recovery of Online RedoLog: Thread 1 Group 1 Seq 67 Reading mem 0

Mem# 0: /oracle/CRM/CRM/redo01.log

Recovery of Online RedoLog: Thread 1 Group 2 Seq 68 Reading mem 0

Mem# 0: /oracle/CRM/CRM/redo02.log

Recovery of Online RedoLog: Thread 1 Group 3 Seq 69 Reading mem 0

Mem# 0: /oracle/CRM/CRM/redo03.log

Media Recovery Complete(CRM)

注意:通過跟蹤整個恢複過程,可以清楚的觀察到在用recover進行完全恢複時,先應用歸檔,後再通過所有聯機日志檔案推進整個資料庫來實作完全恢複的過程。

8 如果資料庫進行不完全恢複如何擷取恢複所需要的歸檔

以基于時間點恢複為例,我們可以這麼使用得出恢複到這個時間點資料庫需要的歸檔清單。

run{

sql 'alter session setnls_date_format="yyyy-mm-dd hh24:mi:ss"';

set until time='2013-12-09:05:50:12';

restore database preview;

}

總結:

1 在對資料庫進行恢複的時,第一步先看看資料庫是否歸檔,第二步看看資料庫是否有備份,第三步驗證備份和歸檔的有效性。最後執行整個恢複過程。

2 完全恢複時,通過對比restore database preview 顯示的歸檔清單seq号和聯機日志組的seq号,我們便可以清楚的推出資料庫完全恢複時,recover需要應用的歸檔。

本文轉自 zhangxuwl 51CTO部落格,原文連結:http://blog.51cto.com/jiujian/1361353,如需轉載請自行聯系原作