天天看點

Oracle 閃回特性(FLASHBACK DATABASE)

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

-- Oracle 閃回特性(FLASHBACK DATABASE)

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

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

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

一、flashback database特性

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

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

    使用resetlogs建立新的場景并打開資料庫(一旦resetlogs之後,将不能再flashback至resetlogs之前的時間點)

    常用的場景: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_ON為NO,則表示閃回特性尚未啟用

    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      --預設為分鐘,即小時

        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模式)

        閃回至某個時間點,SCN或log sequence number

        使用resetlogs打開資料庫

    1.使用sqlplus實作閃回

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

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

            FLASHBACK [STANDBY] DATABASE [<database_name>]  TO [BEFORE] SCN <system_change_number>   --基于SCN閃回

            FLASHBACK [STANDBY] DATABASE [<database_name>]  TO [BEFORE] TIMESTMP <system_timestamp_value>--基于時間戳閃回

            FLASHBACK [STANDBY] DATABASE [<database_name>]  TO [BEFORE] RESTORE POINT <restore_point_name>--基于時點閃回

        如下面的示例:

            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被成功閃回

            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> select count(1) from usr1.tb1;

        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> 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')";

        查詢視圖: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以及基于使用者管理的備份與恢複,其主要原因是因為資料庫閃回使用的是閃回日志,而閃回日志中儲存的是資料塊的完整鏡像。其次閃回能夠恢複的程度取決于閃回空間的大小以及閃回的保留政策,閃回空間大小會被循環使用,而閃回的保留政策則決定了閃回日志保留的時間長度。總之,合理的平衡恢複速度與可用空間依賴于具體服務要求。

六、更多參考   

有關基于使用者管理的備份和備份恢複的概念請參考:

    有關RMAN的恢複與管理請參考:

    有關Oracle體系結構請參考:

<a href="http://blog.csdn.net/robinson_0612/archive/2010/04/29/5542983.aspx">Oracle 資料庫執行個體啟動關閉過程</a>