Oracle 基於使用者管理恢復的處理

beatony發表於2011-07-29
Oracle 基於使用者管理恢復的處理
分類: Oracle 備份恢復 238人閱讀 評論(0) 舉報

--================================

-- Oracle 基於使用者管理恢復的處理

--================================

 

    Oracle支援多種方式來管理資料檔案的備份與恢復來保證資料庫的可靠與完整。除了使用RMAN工具以及第三方備份與恢復工具之外,基於

使用者管理的備份與恢復也是DBA經常使用的方式之一。本文首先介紹了恢復的相關概念,接下來詳細講述了在歸檔模式下使用基於使用者管理恢

復的處理過程。

 

 

一、恢復的相關概念     

    介質恢復

        首先使用備份還原資料,然後再應用歸檔日誌、重做日誌的恢復方式稱為介質恢復。

        介質恢復能將一個經過還原的資料更新到當前的時間點或之前的某個時間點。

        通常介質恢復這個術語專指對資料檔案進行恢復的過程。

        資料塊的介質恢復指資料檔案中的個別資料塊出現錯誤時進行的特殊恢復操作。

        介質恢復通常又可以分為完全恢復和不完全恢復

       

    完全恢復

        使用資料庫,表空間或資料檔案的備份進行還原,再使用歸檔,重做日誌或增量備份將資料更新到當前時間點

        使用者可以實現基於對資料庫、表空間、資料檔案執行完全恢復

        對整個資料庫實現完全恢復的步驟

            啟動資料庫到mount 狀態

            確保所有需要被恢復的資料檔案處於聯機(online)狀態

            還原資料庫或需要恢復的資料檔案

            應用聯機重做日誌或/與歸檔重做日誌

        對錶空間及資料檔案實現完全恢復的步驟

            如果資料庫處於開啟狀態,應將需要恢復的表空間或資料檔案置為離線(offline)狀態

            還原需要恢復的資料檔案

            應用聯機重做日誌或/與歸檔重做日誌

            使表空間或資料檔案聯機

           

    不完全恢復

        與完全恢復是同樣的步驟,只不過不完全恢復僅僅是將資料恢復到某一個特定的時間點或特定的SCN,而

        不是當前時間點。下列情況通常需要進行不完全恢復:

            介質故障(media failure)導致部分或全部聯機重做日誌(online redo log)損壞

            使用者操作失誤(user error)導致資料丟失,例如,使用者由於疏忽而移除了表,提交了無效的資料到表

            由於歸檔重做日誌(archived redo log)丟失而無法進行完全恢復(complete recovery)

            當前控制檔案(control file)丟失,必須使用備份的控制檔案開啟(open)資料庫

        不完全恢復的步驟

            關閉資料庫並備份資料庫(以防止恢復失敗)

            啟動資料庫到mount 狀態

            還原所有受損的資料檔案,同時可以選擇還原控制檔案

            將資料庫恢復至某個時間點、序列、或系統改變號

            使用RESETLOGS關鍵字開啟資料庫

        注意:

            在做不完全恢復前建議在恢復前後做一次備份,避免恢復失敗導致不必要的損失

            不完全恢復完成後,建議不要直接使用OPEN RESETLOGS 命令以讀/寫模式開啟(open)資料庫,而應先以只讀模式開啟資料庫,

                並檢查是否已將資料庫恢復到正確的時間點。如果恢復的時間點有誤,在沒有使用OPEN RESETLOGS命令的情況下,重新執

                行恢復操作相對簡單。如果恢復結果早於指定的時間點,只需重新執行恢復操作。如果恢復結果超過了指定的時間點,則

                應再次還原資料庫並重新進行恢復。

            Flashback Database(閃回資料庫)是一種進行不完全恢復的方法

           

        不完全介質恢復的幾種型別:

            基於時間的恢復(Time-based recovery) 將資料恢復到指定的時間點

           使用者控制的恢復(Cancel-based recovery) 當使用者提交CANCEL後停止恢復(此選項在使用RMAN時無效)

           基於SCN 的恢復(Change-based recovery) 將資料恢復到指定的SCN

            按重做日誌序號恢復(Log sequence recovery)將資料恢復到指定的重做日誌序號(僅使用RMAN時有效)

 

        表空間按時間點恢復(tablespace point-in-time recoveryTSPITR)

            可以將一個或多個表空間恢復到與資料庫中其他表空間不同的時間點

            TSPITR的適用情況:

                因錯誤地移除(drop)及清除(truncate)表而進行的恢復

                恢復存在邏輯錯誤的表

                由於不正確的批處理作業或其他DML 語句導致資料庫中部分資料有誤,因而需要恢復

                單獨將某個方案(schema)恢復到與物理資料庫中其他方案不同的時間點

                    (假設資料庫中不同的方案使用不同的表空間)

                恢復大型資料庫(VLDB)中的一個表空間,而不必先使用備份復原整個資料庫再執行所有前滾(roll-forward)操作

            TSPITR的限制

                SYSTEM表空間,UNDO表空間,或任何包含回滾段(rollback segment)的表空間無法使用TSPITR功能

                與其它表空間有依賴性的表空間應當同時恢復被依賴的表空間,如兩張表存在依賴性且位於不同的表空間

   

    資料檔案的介質恢復

        用於對丟失或損壞的資料檔案及控制檔案進行恢復

        也可恢復因沒有使用OFFLINE NORMAL 選項執行離線操作而造成資料丟失的表空間

       

        資料檔案介質恢復具有以下特點:

            能夠將資料修改應用到被還原(restore)的受損資料檔案中。

            能夠使用歸檔重做日誌(archived redo log)及聯機重做日誌(online redo log)

            需要使用者顯式的執行。

            不能自動地檢測介質故障(media failure)(即不能自動地執行復原操作)。但在使用備份進行復原後,能夠自動地檢測是否需要

                透過介質恢復(media recovery)來恢復資料。

            恢復所需時間完全由使用者備份恢復策略(例如備份頻率,並行恢復引數,上次備份後資料庫內的事務量)決定,Oracle內部機制無關

 

        如果資料庫記憶體在需要介質恢復(media recovery)的聯機資料檔案(online datafile),那麼此資料庫將無法開啟(open),如果一個

        資料檔案需要介質恢復,那麼此檔案將無法聯機。因此需要離線該資料檔案(非系統資料檔案)再開啟資料庫。

       

        在出現以下情況時需要進行介質恢復:

            使用備份還原了一個資料檔案。

            使用備份還原了一個控制檔案(即使此時所有資料檔案都是最新的)。

            將資料檔案離線(offline)(無論是使用者手動執行的,還是Oracle 自動執行的)沒有使用OFFLINE NORMAL 選項。

 

        如果資料庫已經被一個例項開啟,資料檔案介質恢復將只能針對離線資料檔案。即便資料庫只需進行崩潰恢復(crash recovery)

        使用者也可以在資料庫開啟前執行介質恢復。此時,崩潰恢復仍會在資料庫開啟時自動執行。

       

       需要注意的是,如果一個檔案需要介質恢復,即使所有對此檔案的修改都包含在聯機重做日誌檔案中也必須進行介質恢復.也就是說,

        即使無需應用歸檔重做日誌也必須進行介質恢復。如果對無需恢復的資料檔案執行了介質恢復,那麼介質恢復將發現自己無需進行

        任何處理,併發出"no recovery required(無需恢復)"錯誤。

 

    資料塊介質恢復(block media recovery 

        能夠在所有資料檔案聯機且可用的情況下對個別的資料塊進行還原(restore)及恢復(recover)。如果資料錯誤侷限在某些資料檔案的

        少量資料塊中,此時適宜採用資料塊介質恢復來對資料檔案進行恢復。

 

        資料塊介質恢復是透過RMAN 來執行的。如果使用者沒有使用RMAN 作為資料庫的備份方案,可以向RMAN儲存倉庫(repository)中添

        加相關的使用者管理的資料檔案(user-managed datafile)資訊及歸檔重做日誌備份(archived redo log backup)資訊,這樣也能使用

        RMAN 進行資料塊介質恢復。

 

二、基於使用者管理恢復的方法 

    資料恢復時的常用檢視

        v$reover_file     --查詢需要恢復的檔案,該檢視資訊來自控制檔案,如控制檔案來自備份或重建過則資訊會不準

        v$archived_log    --查詢所有歸檔日誌列表

        v$recovery_log    --查詢所有需要用於恢復的日誌

   

    常用的recover命令

        --mount狀態下執行恢復

            SQL> recover database

            SQL> recover datafile '

' | fileno

        --open狀態下執行恢復

            SQL> recover tablespace users

            SQL> recover datafile '

' | fileno

 

    配置恢復自動使用歸檔日誌

        在介質恢復前透過設定set autorecovery on來自動應用歸檔日誌實現恢復

        也可以在輸入歸檔日誌路徑、檔名時輸入auto

        使用recover automatic命令

   

    恢復檔案到新路徑

        使用作業系統命令恢復檔案到新位置

        使用alter database rename file '

' to ''

 

三、基於使用者管理的完全恢復 

 

    1.下面建立演示環境 

        SQL> create tablespace bk datafile '/u01/app/oracle/oradata/orcl/bk01.dbf' --建立表空間bk

          2  size 100m extent management local segment space management auto;

 

        SQL> create user bk identified by bk default tablespace bk  --建立使用者bk

          2  temporary tablespace temp;

 

        SQL> grant connect ,resource to bk;    --授予許可權

 

        SQL> conn bk/bk

       

        SQL> create table tb_bk(id int,name varchar2(10));   --建立表tb_bk

 

        SQL> insert into tb_bk select 0,'Jackson' from dual;   --插入記錄

 

        SQL> commit;

 

        SQL> shutdown immediate;    --關閉例項

 

        [oracle@oradb orcl]$ cp * /u01/app/oracle/coolbak/   --進行冷備

 

        --重啟資料庫後使用bk登陸

        SQL> conn bk/bk    --等陸後,假定該sessionsession1

       

        SQL> select * from tb_bk;

 

                ID NAME

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

                 0 Jackson

 

        SQL> insert into tb_bk values(1,'Frank');  --插入一條新記錄

 

        SQL> commit;

 

        SQL> select * from tb_bk;

 

                ID NAME

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

                 0 Jackson

                 1 Frank

         

        --開啟另外一個session中修改表空間的備份模式,假定為session2

        SQL> show user; 

        USER is "SYS"

        SQL> alter tablespace bk begin backup;   --將表空間bk置於熱備模式

 

        [oracle@oradb orcl]$ cp bk01.dbf /u01/app/oracle/hotbak  --對錶空間bk進行熱備

 

        SQL> alter tablespace bk end backup;    --解凍表空間bk

 

        SQL> insert into tb_bk values(2,'Henry');  --session1中再次插入新記錄

 

        SQL> commit;

 

        SQL> select * from tb_bk;   --最終結果

 

                ID NAME

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

                 0 Jackson

                 1 Frank

                 2 Henry

         

        --歸檔日誌

        SQL> alter system switch logfile;

 

        SQL> ho ls -lht /u01/app/oracle/flash_recovery_area/ORCL/archivelog/2010_10_17

        total 364K

        -rw-r----- 1 oracle oinstall 2.0K Oct 17 12:39 o1_mf_1_15_6cnzjft0_.arc

        -rw-r----- 1 oracle oinstall 1.0K Oct 17 12:39 o1_mf_1_14_6cnzjdnc_.arc

        -rw-r----- 1 oracle oinstall 350K Oct 17 12:39 o1_mf_1_13_6cnzjcgf_.arc

       

    2.完全恢復的幾種場景

        a.資料庫處於關閉狀態下的恢復

            包括系統表空間(系統資料檔案)Undo 表空間、整個資料庫

            步驟:--&gt關閉例項--&gt還原資料檔案--&gt使用歸檔日誌更新到最新--&gt開啟資料庫

           

            [oracle@oradb orcl]$ rm -f *.dbf

 

            SQL> shutdown immediate;  --如果不能關閉資料庫,直接使用shutdown abort

       

            SQL> startup   --啟動後出現錯誤提示

           

            Database mounted.

            ORA-01113: file 1 needs media recovery

            ORA-01110: data file 1: '/u01/app/oracle/oradata/orcl/system01.dbf'

 

            SQL> select * from v$recover_file;  --檢視中顯示需要恢復的檔案

 

                 FILE# ONLINE  ONLINE_ ERROR                   CHANGE# TIME

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

                     1 ONLINE  ONLINE                          1734106 17-OCT-10

                     2 ONLINE  ONLINE                          1734106 17-OCT-10

                     3 ONLINE  ONLINE                          1734106 17-OCT-10

                     4 ONLINE  ONLINE                          1734106 17-OCT-10

                     5 ONLINE  ONLINE                          1734106 17-OCT-10

                     6 ONLINE  ONLINE                          1734106 17-OCT-10

                     7 ONLINE  ONLINE                          1734106 17-OCT-10

 

            SQL> ho cp /u01/app/oracle/coolbak/* $ORACLE_BASE/oradata/orcl/          --*/

            SQL> set autorecovery off;  --關閉自動恢復選項

            SQL> recover datafile 1,2;  --僅僅恢復資料檔案和

            ORA-00279: change 1734106 generated at 10/17/2010 12:32:10 needed for thread 1

            ORA-00289: suggestion : ?/flash_recovery_area/ORCL/archivelog/2010_10_17/o1_mf_1_13_%u_.arc

            ORA-00280: change 1734106 for thread 1 is in sequence #13

 

            Specify log: {<RET>=suggested | filename | AUTO | CANCEL}

            auto    --自動尋找所需要的歸檔日誌

            Log applied.

            Media recovery complete.

           

            SQL>  select * from v$recover_file;    --可以看到資料檔案,2已經不存在於該檢視中

 

                 FILE# ONLINE  ONLINE_ ERROR                   CHANGE# TIME

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

                     3 ONLINE  ONLINE                          1734106 17-OCT-10

                     4 ONLINE  ONLINE                          1734106 17-OCT-10

                     5 ONLINE  ONLINE                          1734106 17-OCT-10

                     6 ONLINE  ONLINE                          1734106 17-OCT-10

                     7 ONLINE  ONLINE                          1734106 17-OCT-10

           

            SQL> recover database

           

            SQL> alter database open;

 

            SQL> select * from bk.tb_bk;

 

                    ID NAME

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

                     1 Frank

                     2 Henry

                     0 Jackson

                 

        b.資料庫處於開啟狀態下,非系統資料檔案丟失的恢復

            將資料檔案offline(alter database datafile n offline)

            還原資料檔案(restore)

            恢復資料檔案(recover datafile n)

            使資料檔案online (alter database datafile n online)

       

            SQL> connect bk/bk

       

            [oracle@oradb orcl]$ rm bk01.dbf    --刪除bk01.dbf檔案

 

            SQL>  insert into tb_bk values(3,'Robinson');

 

            SQL> commit;  --表空間所在的檔案刪除後還可以插入和提交,因為資料是被更新到資料緩衝區,commit是寫日誌,因此沒有報錯

 

            SQL> select * from v$recover_file;  --session1中檢視是否有檔案需要恢復

 

            no rows selected                    --現在Oracle還不知道有資料檔案丟失

 

            SQL>  alter system switch logfile;  --對日誌進行歸檔

 

            SQL> alter system checkpoint;--執行檢查點程式,將資料緩衝區內容寫入到檔案,bk01.dbf已丟失,則告警日誌將產生該記錄

 

            SQL> ho tail -n 20 /u01/app/oracle/admin/orcl/bdump/alert_orcl.log --日誌檔案已顯示出錯

           

            Errors in file /u01/app/oracle/admin/orcl/bdump/orcl_ckpt_3195.trc:

            ORA-01171: datafile 7 going offline due to error advancing checkpoint

            ORA-01116: error in opening database file 7

            ORA-01110: data file 7: '/u01/app/oracle/oradata/orcl/bk01.dbf'

            ORA-27041: unable to open file

            Linux Error: 2: No such file or directory

            Additional information: 3

            Sun Oct 17 13:52:09 2010

            Thread 1 advanced to log sequence 19 (LGWR switch)

              Current log# 1 seq# 19 mem# 0: /u01/app/oracle/oradata/orcl/redo01.log

           

            SQL> alter database datafile 7 offline;

           

            SQL> select * from v$recover_file;  --Oracle已發現有資料檔案丟失,需要進行恢復

                                                                                   

                 FILE# ONLINE  ONLINE_ ERROR                   CHANGE# TIME

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

                     7 OFFLINE OFFLINE FILE NOT FOUND                0

             

            SQL> ho cp $ORACLE_BASE/hotbak/bk01.dbf /$ORACLE_BASE/oradata/orcl/  --使用先前熱備的資料還原資料檔案

 

            SQL> recover datafile 7;                 --恢復資料檔案

            ORA-00279: change 1734321 generated at 10/17/2010 12:38:23 needed for thread 1

            ORA-00289: suggestion : ?/flash_recovery_area/ORCL/archivelog/2010_10_17/o1_mf_1_13_%u_.arc

            ORA-00280: change 1734321 for thread 1 is in sequence #13

 

            Specify log: {<RET>=suggested | filename | AUTO | CANCEL}

            auto

            ORA-00279: change 1734352 generated at 10/17/2010 12:39:39 needed for thread 1

            ORA-00289: suggestion : ?/flash_recovery_area/ORCL/archivelog/2010_10_17/o1_mf_1_14_%u_.arc

            ORA-00280: change 1734352 for thread 1 is in sequence #14

            ORA-00278: log file '?/flash_recovery_area/ORCL/archivelog/2010_10_17/

                    o1_mf_1_13_6cnzjcgf_.arc' no longer needed for this recovery

 

            Log applied.

            Media recovery complete.

 

            SQL> alter database datafile 7 online;   --將修復的資料檔案聯機

 

            Database altered.

 

            SQL> select * from bk.tb_bk;   --記錄已經被恢復

 

                    ID NAME

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

                     3 Robinson

                     1 Frank

                     2 Henry

                     0 Jackson     

   

    c.資料初始狀態處於關閉狀態下由於硬體故障,且需要在開啟狀態下的恢復(非系統資料檔案)

        啟動到mount狀態

        將受損的資料檔案offline

        開啟資料庫

        還原受損的資料檔案(restore)

        恢復受損的資料檔案(recover)

        將受損的資料檔案online

       

        此場景類似於b場景僅僅是需要先啟動到mount狀態,然後再將受損的資料檔案離線,並開啟資料庫,使之能提供服務.因此該演示省略.

       

    d.資料檔案無備份情況下的恢復

        前提是非系統表空間

        控制檔案未被重新建立或恢復到以前的版本(丟失資料檔案的描述資訊應在資料字典和控制檔案中)

        該資料檔案從檔案開始到丟失期間的所有日誌必須存在

        使用下面的命令重建資料檔案

            alter database create datafile 'filename';

            alter database create datafile 'filename' as 'new file name'; --可以放置到不同目錄

        步驟:--&gt先將丟失資料檔案離線--&gt重建資料檔案--&gt應用歸檔日誌--&gt聯機恢復的資料檔案

 

        SQL> create tablespace bk2 datafile '/u01/app/oracle/oradata/orcl/bk02.dbf'

          2  size 10m extent management local segment space management auto;

 

        SQL> conn bk/bk

 

        SQL> create table tb_bk2(id int,name varchar2(10)) tablespace bk2;

 

        SQL> insert into tb_bk2 select * from tb_bk;

 

        SQL> commit;

 

        SQL> select * from tb_bk2;

 

                ID NAME

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

                 3 Robinson

                 1 Frank

                 2 Henry

                 0 Jackson

 

        SQL> conn / as sysdba

   

        SQL> alter system checkpoint;

 

        SQL> alter system switch logfile;

 

        SQL> ho ls -lht $ORACLE_BASE/flash_recovery_area/ORCL/archivelog/2010_10_17

        total 16M

        -rw-r----- 1 oracle oinstall 2.5K Oct 17 18:45 o1_mf_1_21_6conxt0o_.arc

        -rw-r----- 1 oracle oinstall 2.0K Oct 17 18:45 o1_mf_1_20_6conxq2n_.arc

        -rw-r----- 1 oracle oinstall  16M Oct 17 18:45 o1_mf_1_19_6conxmch_.arc

 

        SQL> ho rm $ORACLE_BASE/oradata/orcl/bk02.dbf

 

        SQL> insert into bk.tb_bk2 select 4,'Danny' from dual;

 

        SQL> commit;

 

        SQL> alter system checkpoint;

 

        SQL> alter database datafile 8 offline;

 

        SQL> select * from v$recover_file;

 

             FILE# ONLINE  ONLINE_ ERROR                 CHANGE# TIME

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

                 8 OFFLINE OFFLINE FILE NOT FOUND              0

                 

        SQL> alter database create datafile 8;

 

        SQL> select * from v$recovery_log;

 

           THREAD#  SEQUENCE# TIME      ARCHIVE_NAME

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

                 1         19 17-OCT-10 /u01/app/oracle/flash_recovery_area/ORCL

                                        /archivelog/2010_10_17/o1_mf_1_19_6conxm

                                        ch_.arc

 

                 1         20 17-OCT-10 /u01/app/oracle/flash_recovery_area/ORCL

                                        /archivelog/2010_10_17/o1_mf_1_20_6conxq

                                        2n_.arc    

 

        SQL> ho ls /u01/app/oracle/oradata/orcl/bk02.dbf

        /u01/app/oracle/oradata/orcl/bk02.dbf                              

 

        SQL> recover datafile 8;

        Log applied.

        Media recovery complete.

 

        SQL> alter database datafile 8 online;

 

        SQL> select count(1) from bk.tb_bk2;

 

          COUNT(1)

        ----------

                 5

 

    3.基於使用者管理控制檔案的備份與恢復,由於控制檔案的重要性是不言而喻的,因此單獨拿出來探討,請參考下面的文章:

        Oracle 控制檔案(CONTROLFILE)

        Oracle 控制檔案的備份與恢復

   

四、基於使用者管理的不完全恢復

    1.不完全恢復的幾種常用方法

        recover database until cancel;                       --SQLPlus使用

        recover database until time '2009-10-09:14:20:45'    --SQLPlusRMAN都支援

        recover database unitl time '2009-10-09:14:20:45' using backup controlfile

        recover database until change 329102      --SQLPlus使用

        recover database until scn 329102         --RMAN使用

        recover database until sequence  10       --RMAN使用

       

    2.演示基於until time的恢復

        SQL> ho cp $ORACLE_BASE/oradata/orcl/*  $ORACLE_BASE/coolbak/  --先做冷備  */

        SQL> ho cp $ORACLE_BASE/oradata/arch/* $ORACLE_BASE/coolbak/   --備份歸檔日誌  */

        --啟動資料庫並使用bk帳戶登陸到資料庫

 

        SQL> select * from tb2;

 

                ID NAME

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

                 1 Robinson

 

        SQL> insert into tb2 select 2,'Henry' from dual;

 

        SQL> commit;

 

        SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

 

        TO_CHAR(SYSDATE,'YY'

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

        2010-10-20 11:51:04

 

        SQL> drop table tb2;

 

        SQL> shutdown abort;

 

        SQL> ho rm $ORACLE_BASE/oradata/orcl/*.dbf           --*/

 

        SQL> ho cp $ORACLE_BASE/coolbak/*.dbf $ORACLE_BASE/oradata/orcl/      --*/

 

        SQL> startup mount;

 

        SQL> select file#,checkpoint_change# from v$datafile;

 

             FILE# CHECKPOINT_CHANGE#

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

                 1            2123966

                 2            2123966

                 3            2123966

                 4            2123966

                 5            2123966

                 6            2123966

         

 

        SQL> select file#,checkpoint_change# from v$datafile_header;

 

             FILE# CHECKPOINT_CHANGE#

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

                 1            2123965

                 2            2123965

                 3            2123965

                 4            2123965

                 5            2123965

                 6            2123965

 

        SQL> recover database until time '2010-10-20:11:51:04';

        Media recovery complete.

        SQL> alter database open resetlogs;

 

        SQL> select * from bk.tb2;

 

                ID NAME

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

                 1 Robinson

                 2 Henry

 

        注意:Until time 恢復的格式是固定的,即格式必須為"CCYY-MM-DD:HH24:MI:SS",與會話的NLS_DATE_FORMAT設定無關

     

    3.基於Until Cancel的不完全恢復

        SQL> ho cp $ORACLE_BASE/oradata/orcl/* $ORACLE_BASE/coolbak           --*/

 

        SQL> ho cp $ORACLE_BASE/oradata/arch/* $ORACLE_BASE/coolbak           --*/

 

        SQL> startup

 

        SQL> conn bk/bk

 

        SQL> select * from tb2;

 

                ID NAME

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

                 1 Robinson

                 2 Henry

                 3 Danny

                 4 Jackson

        SQL> insert into tb2 values(5,'Andy');

 

        SQL> commit;

 

        SQL> alter system switch logfile;

 

        SQL> ho strings $ORACLE_BASE/oradata/arch/log_1_9_732888106.arc | grep Andy  --歸檔日誌中已經存在Andy記錄

        Andy

 

        SQL> ho strings $ORACLE_BASE/oradata/orcl/tbs01.dbf | grep Andy   --未執行檢查點時,資料檔案中不存在Andy記錄

 

        SQL> alte system checkpoint;                                      --執行檢查點程式

 

        SQL> ho strings $ORACLE_BASE/oradata/orcl/tbs01.dbf | grep Andy   --執行後,資料檔案中存在Andy記錄

        Andy   

 

        SQL> insert into tb2 values(6,'Martin');

 

        SQL> commit;

 

        SQL> alter system checkpoint;

 

        SQL> alter database backup controlfile to trace as '/tmp/rectl.sql';    --備份控制檔案

 

        SQL> ho rm -f $ORACLE_BASE/oradata/orcl/*            -- 資料檔案,控制檔案,日誌檔案將全部丟失*/

 

        SQL> shutdown abort                                  --強制關閉資料庫                  

   

        SQL> ho cp $ORACLE_BASE/coolbak/*.dbf /$ORACLE_BASE/oradata/orcl/    --僅對資料檔案進行還原 */

 

        SQL> ho cat /tmp/rectl.sql    --修改前面備份的控制檔案如下,手動來建立控制檔案

        STARTUP NOMOUNT

        CREATE CONTROLFILE REUSE DATABASE "ORCL" RESETLOGS  ARCHIVELOG   

            MAXLOGFILES 16

            MAXLOGMEMBERS 3

            MAXDATAFILES 100

            MAXINSTANCES 8

            MAXLOGHISTORY 292

        LOGFILE

          GROUP 1 '/u01/app/oracle/oradata/orcl/redo01.log'  SIZE 30M,

          GROUP 2 '/u01/app/oracle/oradata/orcl/redo02.log'  SIZE 30M,

          GROUP 3 '/u01/app/oracle/oradata/orcl/redo03.log'  SIZE 30M

        DATAFILE

          '/u01/app/oracle/oradata/orcl/system01.dbf',

          '/u01/app/oracle/oradata/orcl/undotbs01.dbf',

          '/u01/app/oracle/oradata/orcl/sysaux01.dbf',

          '/u01/app/oracle/oradata/orcl/users01.dbf',

          '/u01/app/oracle/oradata/orcl/example01.dbf',

          '/u01/app/oracle/oradata/orcl/tbs01.dbf'

        CHARACTER SET AL32UTF8

        ;

        SQL> start /tmp/rectl.sql   

        ORACLE instance started.

 

        Control file created.

 

        SQL> recover database using backup controlfile until cancel;

        ORA-00279: change 2193406 generated at 10/21/2010 12:00:52 needed for thread 1

        ORA-00289: suggestion : /u01/app/oracle/oradata/arch/log_1_10_732888106.arc

        ORA-00280: change 2193406 for thread 1 is in sequence #10

        ORA-00278: log file '/u01/app/oracle/oradata/arch/log_1_9_732888106.arc' no

        longer needed for this recovery  

 

        Specify log: {<RET>=suggested | filename | AUTO | CANCEL}

        cancel          --log_1_10_732888106.arc不存在,還沒有生成歸檔,而是在聯機日誌檔案中,聯機日誌丟失,輸入cancel

        Media recovery cancelled.

        SQL> alter database open resetlogs;

 

        SQL> alter tablespace temp add tempfile '/u01/app/oracle/oradata/orcl/temp01.dbf'

          2  size 31457280 reuse autoextend on;

 

        SQL> select * from bk.tb2;     --因為聯機日誌全部丟失,因此第六條記錄丟失,無法恢復

 

                ID NAME

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

                 1 Robinson

                 2 Henry

                 3 Danny

                 4 Jackson

                 5 Andy

 

五、總結

    1.可以使用冷備、熱備來進行基於使用者管理方式的備份,生產資料庫強烈建議在歸檔模式下運作。

    2.基於使用者管理方式的備份僅僅是直接copy資料庫的三大檔案,因此不利於I/O,空間擴充套件需求大。

    3.對於系統表空間的恢復,需要將資料庫置於mount狀態下,而非系統表空間資料可以在資料庫處於open階段來完成。

    4.open階段完成的資料還原恢復操作,需要先將表空間離線,然後執行還原操作,恢復操作,當恢復操作成功後需要將表空間置於online.

    5.基於不完全恢復操作支援until time,until cancel,until change等方式,不完全恢復操作將導致部分資料丟失。

    6.注意基於使用者管理的不完全恢復方式與使用RMAN實現不完全恢復方式使用不同的關鍵字,RMAN使用的是until scn,until sequence

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

相關文章