Decode360's Blog

          業精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 ::  :: 管理 ::
            302 隨筆 :: 26 文章 :: 82 評論 :: 0 Trackbacks

          9i Flashback 簡介

          ?
          1
          ?
          ??? 數據UPDATEDELETE時,原來的數據會保存在UNDO表空間,保存的最少時間是UNDO_RETENTION。實際的保存時間與UNDO表空間的大小和數據更改的繁忙程度相關。UNDO_RETENTION的參數(位為秒)指定Oracle保存用于FlashBack查詢的UNDO時間。一般你可以將這個值設為一整天(864000秒),這樣你就能看到前一天全天的映像。然,你的在線UNDO日志必須足夠大,大到足以能保存一整天的UNDO日志數據,對于繁忙 的Oracle系統,這個數值可以達到很大。
          ?
          2、 些限制
          ?
          ??? * 服務器必須配置成使用自動 undo管理。
          ??? * 在使用FlashBack查詢時不能使用DDL或者DML
          ??? * FlashBack取消DDL操作,例如DROP命令。
          ?
          ??? 據庫管理員做一些必要的設置之后,一般用戶才能使用Flashback查詢功能
          ??? SQL> ALTER SYSTEM SET UNDO_MANAGEMENT=AUTO
          ??? SQL> ALTER SYSTEM SET UNDO_RETENTION=86400
          ??? SQL> GRANT EXECUTE ON DBMS_FLASHBACK TO USERNAME;
          ?
          3、 S CN 或時間點
          ?
          ??? 在FlashBack時,可以嘗試多個SCN,獲取最佳值。
          ??? 果能得知具體時間,那么可以獲得準確的數據閃回。
          ??? SQL> alter session set nls_date_format='YYYY-MM-DD HH24:MI:SS';
          ??? SQL> select sysdate from v$database;
          ?
          ??? 可通過以下方法獲取SCN,但是不知為什么,兩種方法獲得的 SCN不一樣
          ??? SQL> select dbms_flashback.get_system_change_number scn from dual;
          ??? SQL> select max(ktuxescnw * power(2,32) + ktuxescnb) SCN from x$ktuxe;
          ?
          4 用或禁用 f lashback
          ?
          使用系統改變數(SCN)或者真實時間來指定FlashBack時間點來獲取數據映象。
          ?
          法一
          SQL> select * from [TABLE] as of scn 129292;
          SQL> select * from [TABLE] as of timestamp to_timestamp('','時間格式');
          SQL>?select?*?from [TABLE]?as?of?timestamp?to_timestamp('2007-12-18?08:40:00','YYYY-MM-DD HH24:MI:SS');
          ?
          法二
          啟用:
          SQL> exec dbms_flashback.enable_at_system_change_number(112112);
          SQL> exec dbms_Flashback.enable_at_time('28-AUG-02 11:00:00');
          啟用后看到的只是閃回的結果,實際上并未恢復數據。且閃回狀態下不能做 DML操作。可以先恢復到一個臨時表中。見示例。
          ?
          禁用:
          SQL> exec dbms_flashback.disable();
          ?
          5、 示例:
          ?
          declare
          ? cursor c1 is
          ??? select * from scott.emp_temp;
          ? r_c1 scott.e%rowt ype;
          begin
          ? loop
          ??? dbms_flashback.enable_at_system_change_number(49570);
          ??? if c1%isopen = false then
          ????? open c1;
          ??? end if;
          ??? fetch c1
          ????? into r_c1;
          ??? dbms_flashback.disable();
          ??? exit when c1%notfound;
          ??? update scott.emp_temp set sal = r_c1.sal where empno = r_c1.empno;
          ??? commit;
          ? end loop;
          ? exec dbms_flashback.disable();
          ? close c1;
          end;
          /
          ?
          ?
          ?
          轉一篇的yangtingkun文章:
          ====================================================================================================
          ?
          Oracle9i使用閃回操作
          ===========================================================
          作者: yangtingkun(http://yangtingkun.itpub.net/)
          發表于: 2005.01.24 23:23
          分類: ORACLE
          出處: http://yangtingkun.itpub.net/post/468/15464
          ---------------------------------------------------------------
          ?
          ??? 從9i開始,Oracle提供了閃回(FLASHBACK)功能。即查找當前時間之前的某個時間點系統或表的狀態。
          ??? 可以閃回的最大時間和回滾空間有關。如果使用了自動管理回滾表空間,那么UNDO_RETENTION給出了閃回支持的最小時間。也就是說,FLASHBACK最少可以支持UNDO_RETENTION給出的時間,如果系統比較閑,則可以閃回更長的時間。(當然,如果回滾表空間的空間分配不足,當系統處于忙時,有可能重用還沒有達到UNDO_RETENTION時間限制的數據的空間)
          ??? 使用閃回的一個前提是表不能進行DDL操作。不但不能對DDL操作進行回閃,而且,也無法閃回到DDL操作以前的數據了。
          ?
          ??? Oracle提供兩種方法支持閃回:
          ?
          ??? 一種是使用DBMS_FLASHBACK包,這是SESSION級的回閃。執行DBMS_FLASHBACK包的ENABLE_AT_TIME或者ENABLE_AT_SYSTEM_CHANGE_NUMBER過程后,當前session處于閃回狀態,此時任何的查詢返回的是ENABLE_AT_TIME指定的時間點或ENABLE_AT_SYSTEM_CHANGE_NUMBER指定的SCN的時刻對應的狀態。當執行DISABLE過程后,系統恢復到當前狀態。
          ??? 這種方法是SESSION級別,此后對任何表的任意的查詢語句都返回以前某個時間點的結果。不過缺點是閃回狀態下,不支持DML語句。如果用以前的某個時間點的數據恢復當前數據,則必須ENABLE_AT_TIME后,打開一個游標,然后DIABLE閃回狀態,然后從游標中讀取數據并插入到當前表中。
          ?
          ??? 第二種方式是采用AS OF語句,這是語句級的回閃。AS OF后面可以跟TIMESTAMP或SCN。通過在查詢表后面直接加AS OF時間點的方式,可以查詢到那一時刻的數據。這種方法直觀方便,使用于恢復個別表,或對某個表提供基于時間點的訪問。

          ??? 下面給出一個例子:

          SQL> alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';

          會話已更改。

          SQL> create table t (id number, name varchar2(30));

          表已創建。

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

          已創建 1 行。

          SQL> commit;

          提交完成。

          SQL> select sysdate from dual;

          SYSDATE
          -------------------
          2005-01-24 23:21:23

          SQL> commit;

          提交完成。

          SQL> select sysdate from dual;

          SYSDATE
          -------------------
          2005-01-24 23:26:05

          SQL> delete t;

          已刪除 1 行。

          SQL> commit;

          提交完成。

          SQL> exec dbms_flashback.enable_at_time(to_timestamp('2005-1-24 23:26:5', 'yyyy-mm-dd hh24:mi:ss'))

          PL/SQL 過程已成功完成。

          SQL> select * from t;

          ??????? ID NAME
          ---------- ------------------------------
          ???????? 1 yangtingkun

          SQL> exec dbms_flashback.disable

          PL/SQL 過程已成功完成。

          SQL> select * from t;

          未選定行

          SQL> select * from t as of timestamp to_timestamp('2005-1-24 23:26:5', 'yyyy-mm-dd hh24:mi:ss');

          ??????? ID NAME
          ---------- ------------------------------
          ???????? 1 yangtingkun
          ?

          ??? 上面給出了通過兩種方法實現回閃查詢的方法。在上面的例子中,我在執行insert命令和delete命令直接間隔了5分鐘左右,且提交了一些空事務。這樣做的原因是由于Oracle把時間點映射到SCN上,大約每5分鐘左右映射依次。因此兩個操作間隔5分鐘,且保證兩個操作間SCN發生了變化,從而使Oracle可以將timestamp正確的映射到不同的SCN上。
          ?
          ??? 下面給出兩種不同方法是如何實現數據恢復的。

          SQL> select * from t;

          未選定行

          SQL> declare
          ? 2?? cursor c is select * from t;
          ? 3?? v_record c%rowtype;
          ? 4? begin
          ? 5?? dbms_flashback.enable_at_time(to_timestamp('2005-1-24 23:26:5', 'yyyy-mm-dd hh24:mi:ss'));
          ? 6?? open c;
          ? 7?? dbms_flashback.disable;
          ? 8?? loop
          ? 9??? fetch c into v_record;
          ?10??? exit when c%NOTFOUND;
          ?11??? insert into t values (v_record.id, v_record.name);
          ?12?? end loop;
          ?13?? close c;
          ?14? end;
          ?15? /

          PL/SQL 過程已成功完成。

          SQL> select * from t;

          ??????? ID NAME
          ---------- ------------------------------
          ???????? 1 yangtingkun

          SQL> rollback;

          回退已完成。

          SQL> select * from t;

          未選定行

          SQL> insert into t
          ? 2? select * from t as of timestamp to_timestamp('2005-1-24 23:26:5', 'yyyy-mm-dd hh24:mi:ss');

          已創建 1 行。

          SQL> select * from t;

          ??????? ID NAME
          ---------- ------------------------------
          ???????? 1 yangtingkun
          ?




          -The End-

          posted on 2009-02-10 22:47 decode360-3 閱讀(279) 評論(0)  編輯  收藏 所屬分類: DBA
          主站蜘蛛池模板: 谢通门县| 上饶市| 南陵县| 澜沧| 云浮市| 南溪县| 喀喇| 余江县| 门头沟区| 岳阳市| 凤庆县| 扎赉特旗| 开封县| 竹溪县| 广东省| 新化县| 武夷山市| 清远市| 思茅市| 湘潭县| 铜鼓县| 依安县| 卓尼县| 若尔盖县| 宁阳县| 兴安盟| 手机| 洛隆县| 宁海县| 安西县| 攀枝花市| 安义县| 石渠县| 阳泉市| 广汉市| 万荣县| 兰考县| 北碚区| 万全县| 抚顺市| 依安县|