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

          Flashback query(閃回查詢)原理

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

          Flashback query(閃回查詢)前提:

          SQL> show parameter undo;

          NAME                                TYPE       VALUE

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

          undo_management                     string     AUTO

          undo_retention                        integer    900

          undo_tablespace                       string     UNDOTBS1

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

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

          SQL> alter system set undo_retention = 3600;

          System altered

          閃回實現方式

          1.      獲取數據刪除前的一個時間點或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)的數據,如下:

          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.      將查詢到的數據,新增到表中。也可用更直接的方法,如:

          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表中的原始數據

          SQL> select * from t;

                 ID

          ---------

                  1

                  2

                  3

                  4

                  5

          2.獲取數據刪除前的一個時間點或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表中的數據,并提交事物

          SQL> delete from t;

          5 rows deleted

          SQL> commit;

          Commit complete

          4.在查看t表,此時t表中數據以刪除

          SQL> select * from t;

                 ID

          ----------

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

          SQL> select * from t as of scn 1061279;

                 ID

          ----------

                  1

                  2

                  3

                  4

                  5

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

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

          5 rows inserted

          SQL> commit;

          Commit complete

          7.確認t表數據的還原情況

          SQL> select * from t;

                 ID

          ----------

                  1

                  2

                  3

                  4

                  5

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

          Falshback query查詢的局限:

          1. 不能Falshback5天以前的數據。

          2. 閃回查詢無法恢復到表結構改變之前,因為閃回查詢使用的是當前的數據字典。

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

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

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

          SQL>grant execute on dbms_flashback to scott;

          posted on 2010-08-04 20:39 xzc 閱讀(27804) 評論(0)  編輯  收藏 所屬分類: Oracle
          主站蜘蛛池模板: 新民市| 金川县| 万安县| 淳化县| 商丘市| 工布江达县| 泊头市| 玉屏| 津市市| 巴彦淖尔市| 华蓥市| 卢龙县| 绥棱县| 柘城县| 西平县| 镇江市| 车险| 织金县| 汝阳县| 长海县| 尤溪县| 焉耆| 晋宁县| 福鼎市| 平安县| 原阳县| 前郭尔| 兰考县| 阜南县| 同心县| 古交市| 甘南县| 揭东县| 隆德县| 观塘区| 文化| 瓦房店市| 遂平县| 海伦市| 锦州市| 武清区|