隨筆-314  評論-209  文章-0  trackbacks-0

          Flashback query(閃回查詢)原理

            Oracle根據(jù)undo信息,利用undo數(shù)據(jù),類似一致性讀取方法,可以把表置于一個刪除前的時間點(SCN),從而將數(shù)據(jù)找回。

          Flashback query(閃回查詢)前提:

          SQL> show parameter undo;

          NAME                                TYPE       VALUE

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

          undo_management                     string     AUTO

          undo_retention                        integer    900

          undo_tablespace                       string     UNDOTBS1

          其中undo_management = auto,設(shè)置自動undo管理AUM),該參數(shù)默認設(shè)置為:auto

          Undo_retention = n(),設(shè)置決定undo最多的保存時間,其值越大,就需要越多的undo表空間的支持。修改undo_retention的命令如下:

          SQL> alter system set undo_retention = 3600;

          System altered

          閃回實現(xiàn)方式

          1.      獲取數(shù)據(jù)刪除前的一個時間點或scn,如下:

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

          TIME               SCN

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

          2010-06-29 23:03:14 1060499

          2.      查詢該時間點(或scn)的數(shù)據(jù),如下:

          SQL> select * from t as of timestamp to_timestamp('2010-06-29 22:57:47', 'yyyy-mm-dd hh24:mi:ss');

          SQL> select * from t as of scn 1060174;

          3.      將查詢到的數(shù)據(jù),新增到表中。也可用更直接的方法,如:

          SQL>create table tab_test as select * from t of timestamp to_timestamp('2010-06-29 22:57:47', 'yyyy-mm-dd hh24:mi:ss');
          SQL>insert into tab_test select * from1060174;

          示例:

          Create table t(id number);

          insertinto t values(1);
          insert into t values(2);
          insert into t values(3);
          insert into t values(4);
          insert into t values(5);

          1.查看t表中的原始數(shù)據(jù)

          SQL> select * from t;

                 ID

          ---------

                  1

                  2

                  3

                  4

                  5

          2.獲取數(shù)據(jù)刪除前的一個時間點或scn

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

          TIME               SCN

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

          2010-06-29 23:23:33  1061279

          3.刪除t表中的數(shù)據(jù),并提交事物

          SQL> delete from t;

          5 rows deleted

          SQL> commit;

          Commit complete

          4.在查看t表,此時t表中數(shù)據(jù)以刪除

          SQL> select * from t;

                 ID

          ----------

          5.查看t表中scn1061279(或時間點為2010-06-29 23:23:33)時的數(shù)據(jù)

          SQL> select * from t as of scn 1061279;

                 ID

          ----------

                  1

                  2

                  3

                  4

                  5

          6.確認要恢復(fù)后,將t表中的數(shù)據(jù)還原到scn1061279(或時間點為2010-06-29 23:23:33)時的數(shù)據(jù),并提交事物

          SQL> insert into t select * from t as of scn 1061279;

          5 rows inserted

          SQL> commit;

          Commit complete

          7.確認t表數(shù)據(jù)的還原情況

          SQL> select * from t;

                 ID

          ----------

                  1

                  2

                  3

                  4

                  5

          注:推薦使用scn,由于oracle9i中,因為scn與時間點的同步需要5分鐘,如果最近5分鐘之內(nèi)的數(shù)據(jù)需要Falshback query查詢,可能會查詢丟失,而scn則不存在這個問題。Oracle10g中這個問題已修正(scn與時間點的大致關(guān)系,可以通過logmnr分析歸檔日志獲得)。

          Falshback query查詢的局限:

          1. 不能Falshback5天以前的數(shù)據(jù)。

          2. 閃回查詢無法恢復(fù)到表結(jié)構(gòu)改變之前,因為閃回查詢使用的是當前的數(shù)據(jù)字典。

          3. 受到undo_retention參數(shù)的影響,對于undo_retention之前的數(shù)據(jù),Flashback不保證能Flashback成功。

          4. drop,truncate等不記錄回滾的操作,不能恢復(fù)。

          5. 普通用戶使用dbms_flashback包,必須通過管理員授權(quán)。命令如下:

          SQL>grant execute on dbms_flashback to scott;

          posted on 2010-08-04 20:39 xzc 閱讀(27812) 評論(0)  編輯  收藏 所屬分類: Oracle
          主站蜘蛛池模板: 宜都市| 滦南县| 井陉县| 庄浪县| 方正县| 绍兴县| 唐河县| 宿州市| 承德县| 绵阳市| 吕梁市| 南雄市| 咸阳市| 镇赉县| 通城县| 汾阳市| 丽水市| 施甸县| 西贡区| 南投县| 阿尔山市| 惠安县| 贵溪市| 永丰县| 梨树县| 武平县| 阿尔山市| 娄烦县| 伽师县| 凭祥市| 贵阳市| 绍兴市| 洮南市| 嘉峪关市| 凯里市| 河津市| 定襄县| 仪陇县| 兴隆县| 长兴县| 大厂|