Oracle 基於用戶管理恢復的處理


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

-- 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 recovery,TSPITR)

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

            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 '<dir>' | fileno

        --open狀態下執行恢復

            SQL> recover tablespace users

            SQL> recover datafile '<dir>' | fileno

 

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

        在介質恢復前通過設置set autorecovery on來自動應用歸檔日志實現恢復

        也可以在輸入歸檔日志路徑、文件名時輸入auto

        使用recover automatic命令

   

    恢復文件到新路徑

        使用操作系統命令恢復文件到新位置

        使用alter database rename file '<dir>' to '<dir>'

 

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

 

    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    --等陸后,假定該session為session1

       

        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 表空間、整個數據庫

            步驟:-->關閉實例-->還原數據文件-->使用歸檔日志更新到最新-->打開數據庫

           

            [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'; --可以放置到不同目錄

        步驟:-->先將丟失數據文件脫機-->重建數據文件-->應用歸檔日志-->聯機恢復的數據文件

 

        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'    --SQLPlus與RMAN都支持

        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

 轉:http://blog.csdn.net/leshami/article/details/6041217


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM