瘋狂

          STANDING ON THE SHOULDERS OF GIANTS
          posts - 481, comments - 486, trackbacks - 0, articles - 1
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          日歷

          <2011年9月>
          28293031123
          45678910
          11121314151617
          18192021222324
          2526272829301
          2345678

          公告

          公眾號:
          QQjava交流群:51374316



          相冊

          搜索

          •  

          積分與排名

          • 積分 - 2844381
          • 排名 - 2

          最新隨筆

          oracle 閃回

          Posted on 2011-09-07 16:11 瘋狂 閱讀(457) 評論(0)  編輯  收藏 所屬分類: database
          flashback table與9i的flashback query相似,利用undo信息來恢復一個或者一些表到現在以前的一個時間點(一個快照)。Undo相關參數如下,需要確保AUM與足夠的retention值。

            SQL> show parameter undo
            NAME TYPE VALUE
            ------------------------------------
            undo_management string AUTO
            undo_retention integer 900
            undo_tablespace string UNDOTBS1
            首先要說明的是,flashback table不等于flashback query,所謂query,僅僅是查詢以前的一個快照點而已,并不改變當前表的狀態,而flashback table不一樣,將改變當前表及附屬對象一起回到以前的時間點。
            其實9i的flashback query在10g中也有了新的變化,10g中可以簡單的利用以下語句實現flashback query,而不再需要象9i那樣需要調用DBMS_FLASHBACK包。
            SELECT * FROM TABLENAME AS OF TIMESTAMP
            TO_TIMESTAMP('2003-04-04 09:30:00', 'YYYY-MM-DD HH:MI:SS')
            WHERE ……;

            10g的flashback table有如下特性
            · 在線操作
            · 恢復到指定時間點或者SCN的任何數據.
            · 自動恢復相關屬性,如索引,觸發器等
            · 滿足分布式的一致性
            · 滿足數據一致性,所有相關對象將自動一致
            語法為:
            FLASHBACK TABLE tablename TO TIMESTAMP (JUL-07-2003, 02:33:00)
            FLASHBACK TABLE employee TO SCN 123456;
            FLASHBACK TABLE t1 TO TIMESTAMP '2003-03-03 12:05:00' ENABLE TRIGGERS;
            其中ENABLE TRIGGERS表示觸發器恢復之后為enable狀態,而默認為disable狀態。

            注意:如果需要flashback一個表,需要保證
            需要有flashback any table的系統權限或者是該表的flashback對象權限。
            需要有該表的SELECT, INSERT, DELETE, ALTER權限
            必須保證該表ROW MOVEMENT

            下面,我們用一個詳細的例子來說明這個過程:
            16:16:51 SQL> create user flash identified by flash;
            User created.
            16:17:04 SQL> grant connect,resource to flash;
            Grant succeeded.
            16:17:19 SQL> connect flash/flash;
            Connected.
            16:26:35 SQL> create table t1 as select * from all_objects;
            Table created.
            16:37:24 SQL> create table t2 as select * from t1;
            Table created.

            16:37:35 SQL> select count(*) from t1;
            COUNT(*)
            ----------
            38949
            16:37:43 SQL> select count(*) from t2;
            COUNT(*)
            ----------
            38949
            16:38:06 SQL> create index inx_test1 on T1 (object_name);
            Index created.
            16:39:55 SQL> create index inx_test2 on T1 (object_id);
            Index created.
            16:40:47 SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
            TO_CHAR(SYSDATE,'YY
            -------------------
            2004-04-06 16:41:18
            以上獲得一個時間戳,假定我們要恢復該表到這個時間,那么以下對該表的操作都將被前滾。
            16:41:18 SQL> drop index inx_test1;
            Index dropped.
            16:41:33 SQL> delete from t1;
            38949 rows deleted.
            16:41:46 SQL> commit;
            Commit complete.
            16:41:49 SQL> truncate table t2;
            Table truncated.

            在以上的操作中,我們delete一個表,然后truncate一個表,下面,我們將來看看flashback table的效果,能恢復到什么程度
            16:37:55 SQL> ALTER TABLE t1 ENABLE ROW MOVEMENT;
            Table altered.
            16:38:03 SQL> ALTER TABLE t2 ENABLE ROW MOVEMENT;
            Table altered.

            16:43:10 SQL> flashback table t1 TO TIMESTAMP to_timestamp('2004-04-06 16:41:18','yyyy-mm-dd hh24:mi:ss');
            Flashback complete.
            16:43:49 SQL> flashback table t2 TO TIMESTAMP to_timestamp('2004-04-06 16:41:18','yyyy-mm-dd hh24:mi:ss');
            flashback table t2 TO TIMESTAMP to_timestamp('2004-04-06 16:41:18','yyyy-mm-dd hh24:mi:ss')
            *
            ERROR at line 1:
            ORA-01466: unable to read data - table definition has changed

            我們可以發現,執行delete操作的表是可以恢復的,而執行truncate操作的表是不可以恢復的,這正好也說明了flashback table利用undo的結論。
            看看我們的結果:
            SQL> select count(*) from t1;
            COUNT(*)
            ----------
            38949
            SQL> select count(*) from t2;
            COUNT(*)
            ----------
            0

            SQL> select t.index_name from user_indexes t where t.table_name='T1';
            INDEX_NAME
            ------------------------------
            INX_TEST2
            還可以看到,對于drop的索引,也是沒有辦法恢復的,因為drop并不記錄undo,所以所謂索引的恢復,僅僅是相關索引樹的改變而不能找回刪除掉的索引。

          -----------------------其他
          閃回某個字段的修改:首先我們在pl/sql里面郵件查看表最后的LAST_DDL_TIME,然后可以閃回到這個時間之前的每一個值。
          update tablename t set t.columname=(select columname  from
          tablename   as of  timestamp to_date('2011-9-7 10:05:07','yyyy-mm-dd hh24:mi:ss') where id=t.id)

          有的閃回需要啟動表的移動功能才能閃回
          alter table tablename  enable row movement;
          flashback table tablename TO TIMESTAMP to_timestamp('2011-11-14 16:30:18','yyyy-mm-dd hh24:mi:ss');
          主站蜘蛛池模板: 香港 | 屯留县| 东乌| 岚皋县| 龙南县| 柳江县| 怀来县| 陵水| 平顺县| 衡阳市| 九龙坡区| 尚义县| 密云县| 沁源县| 高碑店市| 阿尔山市| 河间市| 海晏县| 宁强县| 咸阳市| 类乌齐县| 蓬溪县| 南丹县| 泰来县| 图木舒克市| 淮阳县| 长春市| 都匀市| 龙山县| 阜新市| 赞皇县| 南乐县| 合作市| 汝州市| 黔西| 南安市| 于田县| 普陀区| 临邑县| 常宁市| 宁陵县|