隨筆-314  評(píng)論-209  文章-0  trackbacks-0

          上一回演示了運(yùn)用閃回表查詢恢復(fù)delete刪除的數(shù)據(jù)以及其原理,今天了解下閃回表。

          原理:

            閃回表(Flashback table)與閃回查詢(Flashback query)的原理大致相同,也是利用undo信息來恢復(fù)表對(duì)象到以前的某一個(gè)時(shí)間點(diǎn)(一個(gè)快照),因此也要確保AUM有足夠的Retention值。但閃回表不等于閃回查詢,其區(qū)別如下:

          閃回查詢只是查詢以前的一個(gè)快照而已,并不改變當(dāng)前表的狀態(tài)。

          閃回表則是將恢復(fù)當(dāng)前表及附屬對(duì)象一起回到以前的時(shí)間點(diǎn)。

          特性:

          1.  在線操作

          2.  恢復(fù)到指定的時(shí)間點(diǎn)(或者SCN)的任何數(shù)據(jù)

          3.  自動(dòng)恢復(fù)相關(guān)屬性

          4.  滿足分布式的一致性

          5.  數(shù)據(jù)的一致性,所有相關(guān)對(duì)象將自動(dòng)一致。

          語法:

           SQL> flashback table tab_test to timestamp to_timestamp('2010-06-30 22:43:07', 'yyyy-mm-dd hh24:mi:ss');

           SQL> flashback table tab_test to scn 1154953;

           SQL> flashback table tab_test to timestamp to_timestamp('2010-06-30 22:43:07', 'yyyy-mm-dd hh24:mi:ss') enable triggers;

          運(yùn)用閃回表前提

            1.普通用戶中需要有Flashback any table的系統(tǒng)權(quán)限。命令如:

            SQL>grant flashback any table to scott;

            2.有該表的select、insert、delete、alter權(quán)限。

            3.必須保證該表有row movement(行移動(dòng))。

          示例:

           1.創(chuàng)建tab_test表

          SQL> create table tab_test as select * from all_objects;

          Table created

          2.查詢tab_test表中數(shù)據(jù)量

          SQL> select count(*) from tab_test;

           COUNT(*)

          ----------

              40699

          3.為tab_test表創(chuàng)建索引和觸發(fā)器(觸發(fā)器為null,不做任何操作)

          SQL> create index ind_test on tab_test(object_name);

          Index created

          SQL> create or replace trigger tr_test

           2 after update on tab_test

           3 for each row

           4 begin

           5     null;

           6 

           7 end tr_test;

           8 /

          Trigger created

          4.記錄當(dāng)時(shí)的時(shí)間點(diǎn),試圖恢復(fù)到該時(shí)間點(diǎn)

          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-30 23:02:37 1160764

          5.刪除tab_test表中數(shù)據(jù)

          SQL> delete from tab_test;

          40699 rows deleted

          SQL> commit;

          Commit complete

          6.查詢刪除數(shù)據(jù)后的tab_test,確定其表中已沒有數(shù)據(jù)

          SQL> select count(*) from tab_test;

           COUNT(*)

          ----------

          7.刪除tab_test表中索引ind_test

          SQL> drop index ind_test;

          Index dropped

          8.更改tr_test觸發(fā)器

          SQL> create or replace trigger tr_test

           2 after insert on tab_test

           3 for each row

           4 begin

           5     null;

           6 

           7 end tr_test;

           8 /

          Trigger created

          9.確保該表中的行遷移(row movement)功能

          SQL> alter table tab_test enable row movement;

          Table altered

          10.恢復(fù)tab_test表到剛記錄的時(shí)間點(diǎn)(或scn),由于表中存在觸發(fā)器,因此使用了關(guān)鍵字enable triggers;

          SQL> flashback table tab_test to timestamp to_timestamp('2010-06-30 23:02:37', 'yyyy-mm-dd hh24:mi:ss') enable triggers;

          Done

          11.查看恢復(fù)結(jié)果如下:

          SQL> select count(*) from tab_test;

           COUNT(*)

          ----------

              40699

          SQL> select index_name from user_indexes where table_name = 'TAB_TEST';

          INDEX_NAME

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

          SQL> select object_name, status from user_objects where object_name in('TR_TEST', 'IND_TEST');

          OBJECT_NAME                                                                     STATUS

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

          TR_TEST            VALID

          SQL> set pages 0

          SQL> set lines 1000

          Cannot SET LINES

          SQL> set long 2000

          SQL> select text from user_source t where t.name = 'TR_TEST' order by line;

          trigger tr_test

          after insert on tab_test

          for each row

          begin

             null;

          end tr_test;

          總結(jié):

          1. Flashback table在真正的高可用環(huán)境中,使用意義不大,受限比較多,要必須確保行遷移功能

          2. Flashback table過程中,阻止寫操作

          3. 表中數(shù)據(jù)能恢復(fù),而表中索引確不能正常恢復(fù)

          4. 恢復(fù)的觸發(fā)器本身還是修改后的,并不隨表flashback到修改以前的時(shí)間點(diǎn)。說明關(guān)鍵字enable triggers只能保證觸發(fā)器的狀態(tài)正常,而不是內(nèi)容回滾.

          5. 由于原理利用其undo信息,來恢復(fù)其對(duì)象,因此也是不能恢復(fù)truncate數(shù)據(jù)

          6. 恢復(fù)數(shù)據(jù)用flashback query實(shí)現(xiàn)比較好

          posted on 2010-08-04 20:39 xzc 閱讀(3086) 評(píng)論(0)  編輯  收藏 所屬分類: Oracle
          主站蜘蛛池模板: 云霄县| 济阳县| 黔西县| 万山特区| 营山县| 纳雍县| 准格尔旗| 苗栗县| 年辖:市辖区| 平邑县| 防城港市| 定西市| 萨嘎县| 新建县| 黑山县| 绩溪县| 武陟县| 肥城市| 开化县| 侯马市| 沧州市| 三江| 若尔盖县| 巴里| 娄烦县| 平罗县| 开江县| 洛阳市| 肃宁县| 阆中市| 太仆寺旗| 梧州市| 股票| 清流县| 资中县| 太和县| 彭泽县| 简阳市| 西和县| 屯门区| 三江|