Flashback Data Archive(转)
自己一直希望找到一篇關(guān)于將一個表的一列不小心刪除了,怎么來修復(fù),可是一直找不到,自己最近看到一篇在oracle11的一篇文章,特意在這里轉(zhuǎn)一下,沒有試過,因為自己的是10,如果那個網(wǎng)友有在10下實現(xiàn)的方法,希望給個鏈接。
?
? 閃回數(shù)據(jù)歸檔(Flashback Data Archive)
在Oracle 11g當(dāng)中,對閃回技術(shù)再次進行了擴展,提供了一個全新的flashback方式,稱之為閃回數(shù)據(jù)歸檔,本節(jié)我們將對閃回數(shù)據(jù)歸檔進行介紹。
一? 閃回數(shù)據(jù)歸檔概念
在這里讓我們從Oracle 9i開始引進的Flashback Query說起,這是Oracle第一次引入閃回技術(shù),該技術(shù)使得一些邏輯誤操作不再需要利用歸檔日志和數(shù)據(jù)庫備份進行時間點恢復(fù)。
而在Oracle 10g當(dāng)中,更是引入flashback version query、flashback transaction query、flashback database、flashback table和flashback drop等特性,大大簡化了Flashback Query的使用。
在上面的諸多閃回技術(shù)當(dāng)中,除了Flashback Database(依賴于閃回日志)之外,其他的閃回技術(shù)都是依賴于Undo撤銷數(shù)據(jù),都與數(shù)據(jù)庫初始化參數(shù)UNDO_RETENTION密切相關(guān)(該參數(shù)決定了撤銷數(shù)據(jù)在數(shù)據(jù)庫中的保存時間)。它們是從撤銷數(shù)據(jù)中讀取信息來構(gòu)造舊數(shù)據(jù)的。這樣就有一個限制,就是undo中的信息不能被覆蓋。而undo段是循環(huán)使用的,只要事務(wù)提交,之前的undo信息就可能被覆蓋,雖然可以通過 undo_retention等參數(shù)來延長undo的存活期,但這個參數(shù)會影響所有的事務(wù),設(shè)置過大,可能導(dǎo)致undo tablespace快速膨脹。
Oracle 11g則為flashback家族又帶來一個新的成員:Flashback Data Archive。該技術(shù)與以上所說的諸多閃回技術(shù)的實現(xiàn)機制不同,通過將變化數(shù)據(jù)另外存儲到創(chuàng)建的閃回歸檔區(qū)(Flashback Archive)中,以和undo區(qū)別開來,這樣就可以為閃回歸檔區(qū)單獨設(shè)置存儲策略,使之可以閃回到指定時間之前的舊數(shù)據(jù)而不影響undo策略。并且可以根據(jù)需要指定哪些數(shù)據(jù)庫對象需要保存歷史變化數(shù)據(jù),而不是將數(shù)據(jù)庫中所有對象的變化數(shù)據(jù)都保存下來,這樣可以極大地減少空間需求。
注意,Flashback Data Archive并不是記錄數(shù)據(jù)庫的所有變化,而只是記錄了指定表的數(shù)據(jù)變化。所以,Flashback Data Archive是針對對象的保護,是Flashback Database的有力補充。
通過Flashback Data Archive,可以查詢指定對象的任何時間點(只要滿足保護策略)的數(shù)據(jù),而且不需要用到undo,這在有審計需要的環(huán)境,或者是安全性特別重要的高可用數(shù)據(jù)庫中,是一個非常好的特性。缺點就是如果該表變化很頻繁,對空間的要求可能很高。
二? 閃回數(shù)據(jù)歸檔區(qū)
閃回數(shù)據(jù)歸檔區(qū)是閃回數(shù)據(jù)歸檔的歷史數(shù)據(jù)存儲區(qū)域,在一個系統(tǒng)中,可以有一個默認(rèn)的閃回數(shù)據(jù)歸檔區(qū),也可以創(chuàng)建其他許多的閃回數(shù)據(jù)歸檔區(qū)域。
每一個閃回數(shù)據(jù)歸檔區(qū)都可以有一個唯一的名稱。同時,每一個閃回數(shù)據(jù)歸檔區(qū)都對應(yīng)了一定的數(shù)據(jù)保留策略。例如可以配置歸檔區(qū)FLASHBACK_DATA_ARCHIVE_1中的數(shù)據(jù)保留期為1年,而歸檔區(qū)FLASHBACK_DATA_ARCHIVE_2的數(shù)據(jù)保留期為2天或者更短。以后如果將表放到對應(yīng)的閃回數(shù)據(jù)歸檔區(qū),則就按照該歸檔區(qū)的保留策略來保存歷史數(shù)據(jù)。
閃回數(shù)據(jù)歸檔區(qū)是一個邏輯概念,是從一個或者多個表空間中拿出一定的空間,來保存表的修改歷史,這樣就擺脫了對Undo撤銷數(shù)據(jù)的依賴,不利用undo就可以閃回到歸檔策略內(nèi)的任何一個時間點上。
創(chuàng)建閃回數(shù)據(jù)歸檔區(qū)可以使用CREATE FLASHBACK ARCHIVE…命令完成。
下面我們通過一些實例來演示如何來創(chuàng)建閃回數(shù)據(jù)歸檔區(qū)。
1.創(chuàng)建一個系統(tǒng)默認(rèn)的、磁盤限額為100MB、保留策略為1年的閃回數(shù)據(jù)歸檔區(qū)
SQL>create flashback archive default fbar_1 tablespace "USERS" 2 quota 100M
2?? retention ?1 ?year;
注意,經(jīng)過筆者自己在Oracle 11g數(shù)據(jù)庫上運行該語句發(fā)現(xiàn),必須對tablespace關(guān)鍵字后面的表空間名稱用" "引起來,否則無法運行成功。
2.在TBS_DATA1上創(chuàng)建fbar_2閃回數(shù)據(jù)歸檔區(qū),保留策略為2天
SQL>CREATE FLASHBACK ARCHIVE fbar_2 TABLESPACE "TBS_DATA1"
2?? RETENTION 2 DAY;
一個歸檔區(qū)可以不僅僅對應(yīng)一個表空間,可以采用如下的命令增加或者刪除該歸檔區(qū)的表空間的個數(shù),這樣也達到了增加或者減少該歸檔區(qū)空間的目的。
3.給數(shù)據(jù)歸檔區(qū)fbar_2增加一個表空間
SQL>ALTER FLASHBACK ARCHIVE fbar_2 ADD TABLESPACE "TBS_DATA2"
2 ??QUOTA 100M;
也可以從歸檔區(qū)中刪除表空間。注意:這個刪除僅僅是表示從數(shù)據(jù)歸檔區(qū)刪除,并不是刪除該表空間。
4.刪除數(shù)據(jù)歸檔區(qū)fbar_2的表空間TBS_DATA2
SYS>ALTER FLASHBACK ARCHIVE fbar_2 REMOVE TABLESPACE "TBS_DATA2";
對已經(jīng)分配給閃回數(shù)據(jù)歸檔區(qū)的表空間,可以修改歸檔區(qū)對應(yīng)的磁盤限額。
5.修改歸檔區(qū)的磁盤限額
SYS>ALTER FLASHBACK ARCHIVE fbar_2 MODIFY TABLESPACE "TBS_DATA2"
2?? QUOTA 200M;
6.修改歸檔區(qū)的保留策略
SYS>ALTER FLASHBACK ARCHIVE fbar_1 MODIFY RETENTION 1 month;
三? 使用閃回數(shù)據(jù)歸檔
閃回數(shù)據(jù)歸檔區(qū)創(chuàng)建完成以后,就可以指定特定的表,使其對應(yīng)到特定的數(shù)據(jù)歸檔區(qū)。把表指定到對應(yīng)的數(shù)據(jù)歸檔區(qū)有兩種方法,一是在創(chuàng)建的時候直接指定歸檔區(qū),一種是對現(xiàn)有的表指定一個歸檔區(qū)。
注意,如果不指定歸檔區(qū)的名稱,則指定到默認(rèn)歸檔區(qū),否則,就屬于指定的數(shù)據(jù)歸檔區(qū)。
以下我們基于上一小節(jié)所創(chuàng)建的兩個閃回數(shù)據(jù)歸檔區(qū)fbar_1(默認(rèn)的閃回數(shù)據(jù)恢復(fù)區(qū))和fbar_2,創(chuàng)建了3個表,一個指定到默認(rèn)歸檔區(qū)fbar_1,一個指定到數(shù)據(jù)歸檔區(qū)fbar_2,另外一個為了進行對比,沒有指定到任何數(shù)據(jù)歸檔區(qū)。
(1)創(chuàng)建表:
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)在表中插入數(shù)據(jù),完成以后,做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
可以看到,這些數(shù)據(jù)是在9:33分左右寫進去的。最新數(shù)據(jù)保留策略應(yīng)當(dāng)是,表test1對應(yīng)的是默認(rèn)的數(shù)據(jù)歸檔區(qū)fbar_1,數(shù)據(jù)保留策略是一個月,表test2對應(yīng)的是數(shù)據(jù)歸檔區(qū)fbar_2,數(shù)據(jù)保留策略是2天,而表test3沒有數(shù)據(jù)保留策略。
然后,對這3個表再進行一些操作,如刪除現(xiàn)有記錄,并插入一些新記錄。最后,不使用undo數(shù)據(jù),查詢時間點2007-09-04 09:33:52,看是否能找回原來的數(shù)據(jù)。
(3)對表進行更新操作,查詢顯示結(jié)果:
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功能去查詢數(shù)據(jù),發(fā)現(xiàn)可以獲得正確的數(shù)據(jù),但是,不能確認(rèn)的是,這些數(shù)據(jù)的獲得到底是經(jīng)過undo獲得的還是數(shù)據(jù)歸檔區(qū)獲得的。
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)為了證明查詢使用的是閃回數(shù)據(jù)歸檔,創(chuàng)建新的undo表空間,切換undo表空間,為了確保生效,可以重新啟動數(shù)據(jù)庫例程。
切換到新的undo表空間,如果沒有,需要重新創(chuàng)建:
SYS@11gR1>ALTER SYSTEM SET undo_tablespace=TBS_UNDO2;
System altered.
刪除原來的undo表空間:
SYS@11gR1>drop tablespace UNDOTBS1;
Tablespace dropped.
(6)排除了undo查詢的可能,再次執(zhí)行查詢:
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
可以看到,沒有設(shè)置數(shù)據(jù)歸檔策略的表test3,查詢的時候會報01555錯誤。但是,設(shè)置過數(shù)據(jù)歸檔策略的test1與test2,都能正常查詢到數(shù)據(jù),可以看到,數(shù)據(jù)歸檔生效了。
這里是一個簡單的實驗,時間可能遠遠沒有達到設(shè)置的策略期,但是,卻可以證明數(shù)據(jù)不是經(jīng)過undo查詢而獲得的。
四? 清除閃回數(shù)據(jù)歸檔區(qū)數(shù)據(jù)
前面為大家介紹過如何給閃回數(shù)據(jù)歸檔區(qū)增加空間,本節(jié)通過一些具體實例為大家介紹如何清除閃回歸檔區(qū)中的數(shù)據(jù)。
1.清除所有歸檔區(qū)的數(shù)據(jù)
SQL>ALTER FLASHBACK ARCHIVE data_test1 PURGE ALL;
2.清除一天以前的數(shù)據(jù)
SQL>ALTER FLASHBACK ARCHIVE data_test1
2?? PURGE BEFORE TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' DAY);
3.清除特定SCN之前的數(shù)據(jù)
SQL>ALTER FLASHBACK ARCHIVE data_test1 PURGE BEFORE SCN 728969;
4.將指定的表不再設(shè)置數(shù)據(jù)歸檔
SQL>ALTER TABLE test1 NO FLASHBACK ARCHIVE;
5.刪除數(shù)據(jù)歸檔區(qū)
SQL>DROP FLASHBACK ARCHIVE data_test2;
| ? | ? 如果將表指定了閃回數(shù)據(jù)歸檔區(qū),則不能對表進行如下操作。 |
l????????? 刪除,重令名,或者修改列;
l????????? 進行分區(qū)或者子分區(qū)操作;
l????????? 轉(zhuǎn)換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? 與閃回數(shù)據(jù)歸檔有關(guān)的視圖
可有通過以下視圖來得到與閃回數(shù)據(jù)歸檔有關(guān)的信息。
l????????? DBA_FLASHBACK_ARCHIVE:DBA視圖,閃回歸檔區(qū)信息。
l????????? DBA_FLASHBACK_ARCHIVE_TS:DBA視圖,閃回歸檔有關(guān)表空間。
l????????? DBA_FLASHBACK_ARCHIVE_TABLES:DBA視圖,對應(yīng)表所對應(yīng)的閃回歸檔信息。
l????????? USER_FLASHBACK_ARCHIVE:用戶閃回歸檔區(qū)的創(chuàng)建信息。
l????????? USER_FLASHBACK_ARCHIVE_TABLES:用戶表對應(yīng)的閃回歸檔區(qū)域。
小結(jié)
本章主要講述了數(shù)據(jù)庫的閃回技術(shù)。閃回是數(shù)據(jù)庫進行邏輯恢復(fù)的一個快捷工具。對于Oracle 11g在閃回方面的最新技術(shù)——閃回數(shù)據(jù)歸檔——也進行了詳細(xì)的介紹。
總結(jié)
以上是生活随笔為你收集整理的Flashback Data Archive(转)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【字符集UTF8】处理Toad显示乱码及
- 下一篇: Oracle 11g新特性:Result