Oracle 閃回特性(FLASHBACK DATABASE)

beatony發表於2011-07-29
Oracle 閃回特性(FLASHBACK DATABASE)
分類: Oracle 閃回特性 237人閱讀 評論(0) 舉報

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

-- Oracle 閃回特性(FLASHBACK DATABASE)

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

 

    閃回技術通常用於快速簡單恢復資料庫中出現的認為誤操作等邏輯錯誤,從閃回的方式可以分為基於資料庫級別閃回、表級別閃回、事務

級別閃回,根據閃回對資料的影響程度又可以分為閃回恢復,閃回查詢。閃回恢復將修改資料,閃回點之後的資料將全部丟失。而閃回查詢則可

以查詢資料被DML的不同版本,也可以在此基礎之上確定是否進行恢復等。本文主要描述flashback database的使用。

   

一、flashback database特性

    flashback data1base閃回到過去的某一時刻

    閃回點之後的工作全部丟失

    使用resetlogs建立新的場景並開啟資料庫(一旦resetlogs之後,將不能再flashbackresetlogs之前的時間點)

   

    常用的場景:truncate table、多表發生意外錯誤等

    使用閃回日誌來實現資料庫閃回,閃回點之後的資料將丟失

   

二、flashback database的組成

    閃回緩衝區:當啟用flashback database,sga中會開闢一塊新區域作為閃回緩衝區,大小由系統分配

    啟用新的rvwr程式:rvwr程式將閃回緩衝區的內容寫入到閃回日誌中,注意閃回日誌不同於聯機重做日誌,閃回日誌在聯機重做日誌基礎之

        上生成,是完整資料塊映像的日誌。聯機日誌則是變化的日誌。閃回日誌不能複用,也不能歸檔。閃回日誌使用迴圈寫方式。

           

三、flashback database的配置

    flashback database要求資料庫必須處於歸檔模式,且閃回之後必須使用resetlogs開啟資料庫

    a.檢視資料庫的歸檔模式及閃回是否啟用

        SQL>  select log_mode,open_mode,flashback_on from v$database;

 

        LOG_MODE     OPEN_MODE  FLASHBACK_ON

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

        ARCHIVELOG   READ WRITE NO             --FLASHBACK_ONNO,則表示閃回特性尚未啟用

   

    b.檢視及設定閃回目錄、閃回目錄空間大小等

        --下面檢視恢復目錄及恢復目路分配的大小

        --可以使用alter system set db_recovery_file_dest 來設定新路徑

        --可以使用alter system set db_recovery_file_dest_size來設定新的大小

        SQL> show parameter db_recovery 

 

        NAME                                 TYPE        VALUE

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

        db_recovery_file_dest                string      /u01/app/oracle/flash_recovery

                                                         _area

        db_recovery_file_dest_size           big integer 2G    

       

    c.設定閃回保留目標生存期

        SQL> show parameter db_flashback      --預設為分鐘,即小時

 

        NAME                                 TYPE        VALUE

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

        db_flashback_retention_target        integer     1440

                   

        SQL> alter system set db_flashback_retention_target=30; --設定保留時間為半小時

       

    d.mount狀態下來啟用flashback,如在open狀態下則出現下列錯誤提示

        SQL> alter database flashback on;

        alter database flashback on

        *

        ERROR at line 1:

        ORA-38759: Database must be mounted by only one instance and not open.

       

        --一致性關閉資料庫後,在mount狀態下設定flashback

        SQL>startup mount exclusive;

       

        SQL> select status from v$instance;

 

        STATUS

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

        MOUNTED        

 

        SQL> alter database flashback on;     --開啟閃回資料庫功能

 

        SQL> ho ps -ef | grep rvw             --可以看到新增了後臺程式rvwr

        oracle    3563     1  0 12:12 ?        00:00:00 ora_rvwr_orcl

 

        --下面檢視閃回區分配的大小為大約M,閃回分鐘以內的資料則需要M左右的空間

        --注意列oldest_flashback_time說明了允許返回的最早的時間點

        SQL> select oldest_flashback_scn old_flhbck_scn,oldest_flashback_time old_flhbck_tim,

          2  retention_target rete_trgt,flashback_size/1024/1024 flhbck_siz,

          3  estimated_flashback_size/1024/1024 est_flhbck_size

          4  from v$flashback_database_log;

 

        OLD_FLHBCK_SCN OLD_FLHBC  RETE_TRGT FLHBCK_SIZ EST_FLHBCK_SIZE

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

                915137 24-OCT-10         30     7.8125      11.2519531

 

        SQL> select * from v$flashback_database_stat;   --檢視閃回

 

        BEGIN_TIM END_TIME  FLASHBACK_DATA    DB_DATA  REDO_DATA ESTIMATED_FLASHBACK_SIZE

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

        24-OCT-10 24-OCT-10        7905280   86802432   96329728                        0

 

        SQL> select * from v$sgastat where name like 'flashback%';       --檢視sga中分配的閃回空間大小

 

        POOL         NAME                            BYTES

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

        shared pool  flashback generation buff     3981204

        shared pool  flashback_marker_cache_si        9196

                       

        SQL> ho ls -hlt $ORACLE_BASE/flash_recovery_area/ORCL/flashback  --檢視生成的閃回日誌

        total 7.9M

        -rw-r----- 1 oracle oinstall 7.9M Oct 24 12:37 o1_mf_6d7dkogw_.flb

       

四、使用flashback database閃回資料庫

    步驟(前提歸檔日誌可用)

        關閉資料庫

        啟動資料庫到mount狀態(exclusive模式)

        閃回至某個時間點,SCNlog sequence number

        使用resetlogs開啟資料庫

    1.使用sqlplus實現閃回

        可以接受一個時間標記或一個系統改變號實參

        sqlplus幾種常用的閃回資料庫方法

            FLASHBACK [STANDBY] DATABASE []  TO [BEFORE] SCN    --基於SCN閃回

            FLASHBACK [STANDBY] DATABASE []  TO [BEFORE] TIMESTMP --基於時間戳閃回

            FLASHBACK [STANDBY] DATABASE []  TO [BEFORE] RESTORE POINT --基於時點閃回

        如下面的示例:

            SQL> flashback database to timestamp('2010-10-24 13:04:30','yyyy-mm-dd hh24:mi:ss');

            SQL> flashback database to scn 918987;

            SQL> flashback database ro restore point b1_load;

       

        a.基於時間戳閃回

            SQL> select count(1) from usr1.tb1;   --查詢使用者usr1下表tb1中的記錄數

 

              COUNT(1)

            ----------

                404944

           

            SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') tm from dual;  --獲得系統當前的時間

 

            TM

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

            2010-10-24 13:04:30

 

            SQL> drop user usr1 cascade;     --刪除帳戶usr1,同時帳戶usr1下的所有物件將被刪除

 

            SQL> conn scott/tiger;           --使用scott 帳戶登陸

 

            SQL> create table tb_emp as select * from emp;  --新建立表tb_emp

 

            SQL> shutdown immediate;        --關係系統

 

            SQL> startup mount ;             --重新到mount狀態

 

            SQL> flashback database to timestamp  --實施閃回

              2  to_timestamp('2010-10-24 13:04:30','yyyy-mm-dd hh24:mi:ss') ;         

           

            SQL> alter database open resetlogs;

           

            SQL> select count(1) from usr1.tb1;    --帳戶usr1及其物件tb1被成功閃回

 

              COUNT(1)

            ----------

                404944

 

            SQL> select count(1) from scott.tb_emp;   --閃回成功後,在閃回點之後修改的資料全部丟失

            select count(1) from scott.tb_emp

                                       *

            ERROR at line 1:

            ORA-00942: table or view does not exist        

           

        b.基於SCN號閃回        

            SQL> select current_scn from v$database;   --獲得當前的SCN

 

            CURRENT_SCN

            -----------

                918987

 

            SQL> drop table usr1.tb1;   --刪除使用者usr1下的表tb1

       

            SQL> alter system checkpoint;    --手動執行檢查點

 

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

 

                 FILE# CHECKPOINT_CHANGE#

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

                     5             921478

 

            SQL> shutdown abort;   

           

            SQL> startup mount;

 

            SQL> flashback database to scn 918987;

 

            SQL> select count(1) from usr1.tb1;

 

              COUNT(1)

            ----------

                404944

 

        c.基於時點閃回

            SQL> create table t(id int,col varchar2(20));   --建立表t

 

            SQL> insert into t values(1,'ABC');

 

            SQL> insert into t values(2,'DEF');

 

            SQL> commit;

 

            SQL> create restore point bef_damage;    --建立閃回點

 

            SQL> insert into t values(3,'GHI');

 

            SQL> select ora_rowscn,id,col from t;   --檢視錶t的記錄

 

            ORA_ROWSCN         ID COL

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

               1874406          1 ABC

               1874406          2 DEF

               1874406          3 GHI          

       

            SQL> shutdown immediate;

           

            SQL> startup mount exclusive;

           

            SQL> flashback database to restore point bef_damage;  --實施時點閃回

           

            SQL> alter database open resetlogs;

           

            SQL> select * from t;   --閃回成功後,閃回點之後的資料丟失

 

                    ID COL

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

                     1 ABC

                     2 DEF

                     

    2.使用RMAN進行flashback database

        使用RMAN進行閃回資料庫的幾種常用辦法

            RMAN> flashback database to scn=918987;

            RMAN> flashback database to sequence=85  thread=1;

        SQL> create table scott.tb_emp as select * from scott.emp;

 

        SQL> select count(1) from scott.tb_emp;

 

          COUNT(1)

        ----------

                14

 

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

 

        TM

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

        2010-10-24 13:59:38

 

        SQL> drop table scott.tb_emp;

 

        SQL> shutdown abort;

   

        SQL> startup mount;

 

        RMAN>  flashback database

        2> to time="to_date('2010-10-24 13:59:00','yyyy-mm-dd hh24:mi:ss')";

 

        SQL> select count(1) from scott.tb_emp;

 

          COUNT(1)

        ----------

                14

 

        查詢檢視:v$recovery_file_dest將顯示閃回區的使用情況

        SQL> select name,space_limit/1024/1024 sp_limt

          2   ,space_used/1024/1024 sp_usd,space_reclaimable/1024/1024 sp_recl,

          3  number_of_files num_fils from v$recovery_file_dest;

 

        NAME                                             SP_LIMT     SP_USD    SP_RECL   NUM_FILS

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

        /u01/app/oracle/flash_recovery_area                 2048 472.070313 380.671875         18

 

        可以將某些表空間排除在閃回之外

 

        SQL> alter tablespace users flashback off;

 

        SQL> select name,flashback_on from v$tablespace where ts#=4;

 

        NAME            FLA

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

        USERS           NO

 

        如果需要對上述表空間啟用閃回功能,則需要在mount模式下對該表空間進行開啟該功能。

 

五、總結

閃回策略是針對Oracle撤銷功能的增強,為快速恢復資料庫提供了更多的便利。資料庫的閃回恢復的速度要快於RMAN以及基於使用者管理的備份與恢復,其主要原因是因為資料庫閃回使用的是閃回日誌,而閃回日誌中儲存的是資料塊的完整映象。其次閃回能夠恢復的程度取決於閃回空間的大小以及閃回的保留策略,閃回空間大小會被迴圈使用,而閃回的保留策略則決定了閃回日誌保留的時間長度。總之,合理的平衡恢復速度與可用空間依賴於具體服務要求。

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

相關文章