Flashback Data Archive(转)
自己一直希望找到一篇關于將一個表的一列不小心刪除了,怎么來修復,可是一直找不到,自己最近看到一篇在oracle11的一篇文章,特意在這里轉一下,沒有試過,因為自己的是10,如果那個網友有在10下實現的方法,希望給個鏈接。
?
? 閃回數據歸檔(Flashback Data Archive)
在Oracle 11g當中,對閃回技術再次進行了擴展,提供了一個全新的flashback方式,稱之為閃回數據歸檔,本節我們將對閃回數據歸檔進行介紹。
一? 閃回數據歸檔概念
在這里讓我們從Oracle 9i開始引進的Flashback Query說起,這是Oracle第一次引入閃回技術,該技術使得一些邏輯誤操作不再需要利用歸檔日志和數據庫備份進行時間點恢復。
而在Oracle 10g當中,更是引入flashback version query、flashback transaction query、flashback database、flashback table和flashback drop等特性,大大簡化了Flashback Query的使用。
在上面的諸多閃回技術當中,除了Flashback Database(依賴于閃回日志)之外,其他的閃回技術都是依賴于Undo撤銷數據,都與數據庫初始化參數UNDO_RETENTION密切相關(該參數決定了撤銷數據在數據庫中的保存時間)。它們是從撤銷數據中讀取信息來構造舊數據的。這樣就有一個限制,就是undo中的信息不能被覆蓋。而undo段是循環使用的,只要事務提交,之前的undo信息就可能被覆蓋,雖然可以通過 undo_retention等參數來延長undo的存活期,但這個參數會影響所有的事務,設置過大,可能導致undo tablespace快速膨脹。
Oracle 11g則為flashback家族又帶來一個新的成員:Flashback Data Archive。該技術與以上所說的諸多閃回技術的實現機制不同,通過將變化數據另外存儲到創建的閃回歸檔區(Flashback Archive)中,以和undo區別開來,這樣就可以為閃回歸檔區單獨設置存儲策略,使之可以閃回到指定時間之前的舊數據而不影響undo策略。并且可以根據需要指定哪些數據庫對象需要保存歷史變化數據,而不是將數據庫中所有對象的變化數據都保存下來,這樣可以極大地減少空間需求。
注意,Flashback Data Archive并不是記錄數據庫的所有變化,而只是記錄了指定表的數據變化。所以,Flashback Data Archive是針對對象的保護,是Flashback Database的有力補充。
通過Flashback Data Archive,可以查詢指定對象的任何時間點(只要滿足保護策略)的數據,而且不需要用到undo,這在有審計需要的環境,或者是安全性特別重要的高可用數據庫中,是一個非常好的特性。缺點就是如果該表變化很頻繁,對空間的要求可能很高。
二? 閃回數據歸檔區
閃回數據歸檔區是閃回數據歸檔的歷史數據存儲區域,在一個系統中,可以有一個默認的閃回數據歸檔區,也可以創建其他許多的閃回數據歸檔區域。
每一個閃回數據歸檔區都可以有一個唯一的名稱。同時,每一個閃回數據歸檔區都對應了一定的數據保留策略。例如可以配置歸檔區FLASHBACK_DATA_ARCHIVE_1中的數據保留期為1年,而歸檔區FLASHBACK_DATA_ARCHIVE_2的數據保留期為2天或者更短。以后如果將表放到對應的閃回數據歸檔區,則就按照該歸檔區的保留策略來保存歷史數據。
閃回數據歸檔區是一個邏輯概念,是從一個或者多個表空間中拿出一定的空間,來保存表的修改歷史,這樣就擺脫了對Undo撤銷數據的依賴,不利用undo就可以閃回到歸檔策略內的任何一個時間點上。
創建閃回數據歸檔區可以使用CREATE FLASHBACK ARCHIVE…命令完成。
下面我們通過一些實例來演示如何來創建閃回數據歸檔區。
1.創建一個系統默認的、磁盤限額為100MB、保留策略為1年的閃回數據歸檔區
SQL>create flashback archive default fbar_1 tablespace "USERS" 2 quota 100M
2?? retention ?1 ?year;
注意,經過筆者自己在Oracle 11g數據庫上運行該語句發現,必須對tablespace關鍵字后面的表空間名稱用" "引起來,否則無法運行成功。
2.在TBS_DATA1上創建fbar_2閃回數據歸檔區,保留策略為2天
SQL>CREATE FLASHBACK ARCHIVE fbar_2 TABLESPACE "TBS_DATA1"
2?? RETENTION 2 DAY;
一個歸檔區可以不僅僅對應一個表空間,可以采用如下的命令增加或者刪除該歸檔區的表空間的個數,這樣也達到了增加或者減少該歸檔區空間的目的。
3.給數據歸檔區fbar_2增加一個表空間
SQL>ALTER FLASHBACK ARCHIVE fbar_2 ADD TABLESPACE "TBS_DATA2"
2 ??QUOTA 100M;
也可以從歸檔區中刪除表空間。注意:這個刪除僅僅是表示從數據歸檔區刪除,并不是刪除該表空間。
4.刪除數據歸檔區fbar_2的表空間TBS_DATA2
SYS>ALTER FLASHBACK ARCHIVE fbar_2 REMOVE TABLESPACE "TBS_DATA2";
對已經分配給閃回數據歸檔區的表空間,可以修改歸檔區對應的磁盤限額。
5.修改歸檔區的磁盤限額
SYS>ALTER FLASHBACK ARCHIVE fbar_2 MODIFY TABLESPACE "TBS_DATA2"
2?? QUOTA 200M;
6.修改歸檔區的保留策略
SYS>ALTER FLASHBACK ARCHIVE fbar_1 MODIFY RETENTION 1 month;
三? 使用閃回數據歸檔
閃回數據歸檔區創建完成以后,就可以指定特定的表,使其對應到特定的數據歸檔區。把表指定到對應的數據歸檔區有兩種方法,一是在創建的時候直接指定歸檔區,一種是對現有的表指定一個歸檔區。
注意,如果不指定歸檔區的名稱,則指定到默認歸檔區,否則,就屬于指定的數據歸檔區。
以下我們基于上一小節所創建的兩個閃回數據歸檔區fbar_1(默認的閃回數據恢復區)和fbar_2,創建了3個表,一個指定到默認歸檔區fbar_1,一個指定到數據歸檔區fbar_2,另外一個為了進行對比,沒有指定到任何數據歸檔區。
(1)創建表:
SYS@11gR1>connect scott/tiger
Connected.
scott@11gR1>create table test1(a int) flashback archive;
Table created.
scott@11gR1>create table test2(b int);
Table created.
scott@11gR1>alter table test2 flashback archive data_test2;
Table altered.
scott@11gR1>create table test3(c int);
Table created.
(2)在表中插入數據,完成以后,做select查詢顯示如下:
09:33:38 scott@11gR1>select * from test2;
???????? B
----------
???????? 4
???????? 5
???????? 6
??????????
09:33:43 scott@11gR1>select * from test3;
???????? C
----------
???????? 7
???????? 8
???????? 9
09:33:46 scott@11gR1>select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') time from dual;
????
TIME
----
2007-09-04 09:33:52
可以看到,這些數據是在9:33分左右寫進去的。最新數據保留策略應當是,表test1對應的是默認的數據歸檔區fbar_1,數據保留策略是一個月,表test2對應的是數據歸檔區fbar_2,數據保留策略是2天,而表test3沒有數據保留策略。
然后,對這3個表再進行一些操作,如刪除現有記錄,并插入一些新記錄。最后,不使用undo數據,查詢時間點2007-09-04 09:33:52,看是否能找回原來的數據。
(3)對表進行更新操作,查詢顯示結果:
09:34:19 Piner@11gR1>delete from test1;
3 rows deleted.
09:34:23 Piner@11gR1>delete from test2;
3 rows deleted.
09:34:30 Piner@11gR1>delete from test3;
3 rows deleted.
09:34:35 Piner@11gR1>insert into test1 values(10);
1 row created.
09:34:47 Piner@11gR1>insert into test2 values(20);
1 row created.
09:34:53 Piner@11gR1>insert into test3 values(30);
1 row created.
09:34:58 Piner@11gR1>commit;
Commit complete.
09:36:32 Piner@11gR1>select * from test1;
???????? A
----------
??????? 10
09:36:51 Piner@11gR1>select * from test2;
???????? B
----------
??? ????20
09:36:56 Piner@11gR1>select * from test3;
???????? C
----------
??????? 30
(4)利用Flashback功能去查詢數據,發現可以獲得正確的數據,但是,不能確認的是,這些數據的獲得到底是經過undo獲得的還是數據歸檔區獲得的。
09:43:17 Piner@11gR1>select * from test1 as of timestamp
09:43:17?? 2? to_timestamp('2007-09-04 09:33:52', 'yyyy-mm-dd hh24:mi:ss');
???????? A
----------
???????? 1
???????? 2
???????? 3
09:43:17 Piner@11gR1>select * from test2 as of timestamp
09:43:24?? 2? to_timestamp('2007-09-04 09:33:52', 'yyyy-mm-dd hh24:mi:ss');
???????? B
----------
???????? 4
???????? 5
???????? 6
09:43:25 Piner@11gR1>select * from test3 as of timestamp
09:43:30?? 2? to_timestamp('2007-09-04 09:33:52', 'yyyy-mm-dd hh24:mi:ss');
???????? C
----------
???????? 7
???????? 8
???????? 9
(5)為了證明查詢使用的是閃回數據歸檔,創建新的undo表空間,切換undo表空間,為了確保生效,可以重新啟動數據庫例程。
切換到新的undo表空間,如果沒有,需要重新創建:
SYS@11gR1>ALTER SYSTEM SET undo_tablespace=TBS_UNDO2;
System altered.
刪除原來的undo表空間:
SYS@11gR1>drop tablespace UNDOTBS1;
Tablespace dropped.
(6)排除了undo查詢的可能,再次執行查詢:
scott@11gR1> select * from test3 as of timestamp
? 2? to_timestamp('2007-09-04 09:33:52', 'yyyy-mm-dd hh24:mi:ss');
select * from test3 as of timestamp
????????????? *
ERROR at line 1:
ORA-01555: snapshot too old: rollback segment number? with name "" too small??
??????
scott@11gR1> select * from test1 as of timestamp
? 2? to_timestamp('2007-09-04 09:33:52', 'yyyy-mm-dd hh24:mi:ss');
???????? A
----------
???????? 1
???????? 2
???????? 3
scott@11gR1> select * from test2 as of timestamp
? 2? to_timestamp('2007-09-04 09:33:52', 'yyyy-mm-dd hh24:mi:ss');
???????? B
----------
???????? 4
???????? 5
???????? 6
可以看到,沒有設置數據歸檔策略的表test3,查詢的時候會報01555錯誤。但是,設置過數據歸檔策略的test1與test2,都能正常查詢到數據,可以看到,數據歸檔生效了。
這里是一個簡單的實驗,時間可能遠遠沒有達到設置的策略期,但是,卻可以證明數據不是經過undo查詢而獲得的。
四? 清除閃回數據歸檔區數據
前面為大家介紹過如何給閃回數據歸檔區增加空間,本節通過一些具體實例為大家介紹如何清除閃回歸檔區中的數據。
1.清除所有歸檔區的數據
SQL>ALTER FLASHBACK ARCHIVE data_test1 PURGE ALL;
2.清除一天以前的數據
SQL>ALTER FLASHBACK ARCHIVE data_test1
2?? PURGE BEFORE TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' DAY);
3.清除特定SCN之前的數據
SQL>ALTER FLASHBACK ARCHIVE data_test1 PURGE BEFORE SCN 728969;
4.將指定的表不再設置數據歸檔
SQL>ALTER TABLE test1 NO FLASHBACK ARCHIVE;
5.刪除數據歸檔區
SQL>DROP FLASHBACK ARCHIVE data_test2;
| ? | ? 如果將表指定了閃回數據歸檔區,則不能對表進行如下操作。 |
l????????? 刪除,重令名,或者修改列;
l????????? 進行分區或者子分區操作;
l????????? 轉換long到lob類型;
l????????? ALTER TABLE… UPGRADE TABLE 操作;
l????????? drop、rename、trunacte表。
例如:
scott@11gR1> drop table test1;
drop table test1
?????????? *
ERROR at line 1:
ORA-55610: Invalid DDL statement on history-tracked table
17.8.5? 與閃回數據歸檔有關的視圖
可有通過以下視圖來得到與閃回數據歸檔有關的信息。
l????????? DBA_FLASHBACK_ARCHIVE:DBA視圖,閃回歸檔區信息。
l????????? DBA_FLASHBACK_ARCHIVE_TS:DBA視圖,閃回歸檔有關表空間。
l????????? DBA_FLASHBACK_ARCHIVE_TABLES:DBA視圖,對應表所對應的閃回歸檔信息。
l????????? USER_FLASHBACK_ARCHIVE:用戶閃回歸檔區的創建信息。
l????????? USER_FLASHBACK_ARCHIVE_TABLES:用戶表對應的閃回歸檔區域。
小結
本章主要講述了數據庫的閃回技術。閃回是數據庫進行邏輯恢復的一個快捷工具。對于Oracle 11g在閃回方面的最新技術——閃回數據歸檔——也進行了詳細的介紹。
總結
以上是生活随笔為你收集整理的Flashback Data Archive(转)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【字符集UTF8】处理Toad显示乱码及
- 下一篇: Oracle 11g新特性:Result