|
17.8 閃回?cái)?shù)據(jù)歸檔(Flashback Data Archive) 在Oracle 11g當(dāng)中,對(duì)閃回技術(shù)再次進(jìn)行了擴(kuò)展,提供了一個(gè)全新的flashback方式,稱之為閃回?cái)?shù)據(jù)歸檔,本節(jié)我們將對(duì)閃回?cái)?shù)據(jù)歸檔進(jìn)行介紹。 17.8.1 閃回?cái)?shù)據(jù)歸檔概念 在這里讓我們從Oracle 9i開始引進(jìn)的Flashback Query說起,這是Oracle第一次引入閃回技術(shù),該技術(shù)使得一些邏輯誤操作不再需要利用歸檔日志和數(shù)據(jù)庫備份進(jìn)行時(shí)間點(diǎn)恢復(fù)。 而在Oracle 10g當(dāng)中,更是引入flashback version query、flashback transaction query、flashback database、flashback table和flashback drop等特性,大大簡(jiǎn)化了Flashback Query的使用。 在上面的諸多閃回技術(shù)當(dāng)中,除了Flashback Database(依賴于閃回日志)之外,其他的閃回技術(shù)都是依賴于Undo撤銷數(shù)據(jù),都與數(shù)據(jù)庫初始化參數(shù)UNDO_RETENTION密切相關(guān)(該參數(shù)決定了撤銷數(shù)據(jù)在數(shù)據(jù)庫中的保存時(shí)間)。它們是從撤銷數(shù)據(jù)中讀取信息來構(gòu)造舊數(shù)據(jù)的。這樣就有一個(gè)限制,就是undo中的信息不能被覆蓋。而undo段是循環(huán)使用的,只要事務(wù)提交,之前的undo信息就可能被覆蓋,雖然可以通過 undo_retention等參數(shù)來延長(zhǎng)undo的存活期,但這個(gè)參數(shù)會(huì)影響所有的事務(wù),設(shè)置過大,可能導(dǎo)致undo tablespace快速膨脹。 Oracle 11g則為flashback家族又帶來一個(gè)新的成員:Flashback Data Archive。該技術(shù)與以上所說的諸多閃回技術(shù)的實(shí)現(xiàn)機(jī)制不同,通過將變化數(shù)據(jù)另外存儲(chǔ)到創(chuàng)建的閃回歸檔區(qū)(Flashback Archive)中,以和undo區(qū)別開來,這樣就可以為閃回歸檔區(qū)單獨(dú)設(shè)置存儲(chǔ)策略,使之可以閃回到指定時(shí)間之前的舊數(shù)據(jù)而不影響undo策略。并且可以根據(jù)需要指定哪些數(shù)據(jù)庫對(duì)象需要保存歷史變化數(shù)據(jù),而不是將數(shù)據(jù)庫中所有對(duì)象的變化數(shù)據(jù)都保存下來,這樣可以極大地減少空間需求。 注意,F(xiàn)lashback Data Archive并不是記錄數(shù)據(jù)庫的所有變化,而只是記錄了指定表的數(shù)據(jù)變化。所以,F(xiàn)lashback Data Archive是針對(duì)對(duì)象的保護(hù),是Flashback Database的有力補(bǔ)充。 通過Flashback Data Archive,可以查詢指定對(duì)象的任何時(shí)間點(diǎn)(只要滿足保護(hù)策略)的數(shù)據(jù),而且不需要用到undo,這在有審計(jì)需要的環(huán)境,或者是安全性特別重要的高可用數(shù)據(jù)庫中,是一個(gè)非常好的特性。缺點(diǎn)就是如果該表變化很頻繁,對(duì)空間的要求可能很高。 17.8.2 閃回?cái)?shù)據(jù)歸檔區(qū) 閃回?cái)?shù)據(jù)歸檔區(qū)是閃回?cái)?shù)據(jù)歸檔的歷史數(shù)據(jù)存儲(chǔ)區(qū)域,在一個(gè)系統(tǒng)中,可以有一個(gè)默認(rèn)的閃回?cái)?shù)據(jù)歸檔區(qū),也可以創(chuàng)建其他許多的閃回?cái)?shù)據(jù)歸檔區(qū)域。 每一個(gè)閃回?cái)?shù)據(jù)歸檔區(qū)都可以有一個(gè)唯一的名稱。同時(shí),每一個(gè)閃回?cái)?shù)據(jù)歸檔區(qū)都對(duì)應(yīng)了一定的數(shù)據(jù)保留策略。例如可以配置歸檔區(qū)FLASHBACK_DATA_ARCHIVE_1中的數(shù)據(jù)保留期為1年,而歸檔區(qū)FLASHBACK_DATA_ARCHIVE_2的數(shù)據(jù)保留期為2天或者更短。以后如果將表放到對(duì)應(yīng)的閃回?cái)?shù)據(jù)歸檔區(qū),則就按照該歸檔區(qū)的保留策略來保存歷史數(shù)據(jù)。 閃回?cái)?shù)據(jù)歸檔區(qū)是一個(gè)邏輯概念,是從一個(gè)或者多個(gè)表空間中拿出一定的空間,來保存表的修改歷史,這樣就擺脫了對(duì)Undo撤銷數(shù)據(jù)的依賴,不利用undo就可以閃回到歸檔策略內(nèi)的任何一個(gè)時(shí)間點(diǎn)上。 創(chuàng)建閃回?cái)?shù)據(jù)歸檔區(qū)可以使用CREATE FLASHBACK ARCHIVE…命令完成。 下面我們通過一些實(shí)例來演示如何來創(chuàng)建閃回?cái)?shù)據(jù)歸檔區(qū)。 1.創(chuàng)建一個(gè)系統(tǒng)默認(rèn)的、磁盤限額為100MB、保留策略為1年的閃回?cái)?shù)據(jù)歸檔區(qū) SQL>create flashback archive default fbar_1 tablespace "USERS" 2 quota 100M retention 1 year; 注意,經(jīng)過筆者自己在Oracle 11g數(shù)據(jù)庫上運(yùn)行該語句發(fā)現(xiàn),必須對(duì)tablespace關(guān)鍵字后面的表空間名稱用" "引起來,否則無法運(yùn)行成功。 2.在TBS_DATA1上創(chuàng)建fbar_2閃回?cái)?shù)據(jù)歸檔區(qū),保留策略為2天 SQL>CREATE FLASHBACK ARCHIVE fbar_2 TABLESPACE "TBS_DATA1" RETENTION 2 DAY; 一個(gè)歸檔區(qū)可以不僅僅對(duì)應(yīng)一個(gè)表空間,可以采用如下的命令增加或者刪除該歸檔區(qū)的表空間的個(gè)數(shù),這樣也達(dá)到了增加或者減少該歸檔區(qū)空間的目的。 3.給數(shù)據(jù)歸檔區(qū)fbar_2增加一個(gè)表空間 SQL>ALTER FLASHBACK ARCHIVE fbar_2 ADD TABLESPACE "TBS_DATA2" QUOTA 100M; 也可以從歸檔區(qū)中刪除表空間。注意:這個(gè)刪除僅僅是表示從數(shù)據(jù)歸檔區(qū)刪除,并不是刪除該表空間。 4.刪除數(shù)據(jù)歸檔區(qū)fbar_2的表空間TBS_DATA2 SYS>ALTER FLASHBACK ARCHIVE fbar_2 REMOVE TABLESPACE "TBS_DATA2"; 對(duì)已經(jīng)分配給閃回?cái)?shù)據(jù)歸檔區(qū)的表空間,可以修改歸檔區(qū)對(duì)應(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; 17.8.3 使用閃回?cái)?shù)據(jù)歸檔 閃回?cái)?shù)據(jù)歸檔區(qū)創(chuàng)建完成以后,就可以指定特定的表,使其對(duì)應(yīng)到特定的數(shù)據(jù)歸檔區(qū)。把表指定到對(duì)應(yīng)的數(shù)據(jù)歸檔區(qū)有兩種方法,一是在創(chuàng)建的時(shí)候直接指定歸檔區(qū),一種是對(duì)現(xiàn)有的表指定一個(gè)歸檔區(qū)。 注意,如果不指定歸檔區(qū)的名稱,則指定到默認(rèn)歸檔區(qū),否則,就屬于指定的數(shù)據(jù)歸檔區(qū)。 以下我們基于上一小節(jié)所創(chuàng)建的兩個(gè)閃回?cái)?shù)據(jù)歸檔區(qū)fbar_1(默認(rèn)的閃回?cái)?shù)據(jù)恢復(fù)區(qū))和fbar_2,創(chuàng)建了3個(gè)表,一個(gè)指定到默認(rèn)歸檔區(qū)fbar_1,一個(gè)指定到數(shù)據(jù)歸檔區(qū)fbar_2,另外一個(gè)為了進(jìn)行對(duì)比,沒有指定到任何數(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分左右寫進(jìn)去的。最新數(shù)據(jù)保留策略應(yīng)當(dāng)是,表test1對(duì)應(yīng)的是默認(rèn)的數(shù)據(jù)歸檔區(qū)fbar_1,數(shù)據(jù)保留策略是一個(gè)月,表test2對(duì)應(yīng)的是數(shù)據(jù)歸檔區(qū)fbar_2,數(shù)據(jù)保留策略是2天,而表test3沒有數(shù)據(jù)保留策略。 然后,對(duì)這3個(gè)表再進(jìn)行一些操作,如刪除現(xiàn)有記錄,并插入一些新記錄。最后,不使用undo數(shù)據(jù),查詢時(shí)間點(diǎn)2007-09-04 09:33:52,看是否能找回原來的數(shù)據(jù)。 (3)對(duì)表進(jìn)行更新操作,查詢顯示結(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 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 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 to_timestamp('2007-09-04 09:33:52', 'yyyy-mm-dd hh24:mi:ss'); C ---------- 7 8 9 (5)為了證明查詢使用的是閃回?cái)?shù)據(jù)歸檔,創(chuàng)建新的undo表空間,切換undo表空間,為了確保生效,可以重新啟動(dòng)數(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 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 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 to_timestamp('2007-09-04 09:33:52', 'yyyy-mm-dd hh24:mi:ss'); B ---------- 4 5 6 可以看到,沒有設(shè)置數(shù)據(jù)歸檔策略的表test3,查詢的時(shí)候會(huì)報(bào)01555錯(cuò)誤。但是,設(shè)置過數(shù)據(jù)歸檔策略的test1與test2,都能正常查詢到數(shù)據(jù),可以看到,數(shù)據(jù)歸檔生效了。 這里是一個(gè)簡(jiǎn)單的實(shí)驗(yàn),時(shí)間可能遠(yuǎn)遠(yuǎn)沒有達(dá)到設(shè)置的策略期,但是,卻可以證明數(shù)據(jù)不是經(jīng)過undo查詢而獲得的。 17.8.4 清除閃回?cái)?shù)據(jù)歸檔區(qū)數(shù)據(jù) 前面為大家介紹過如何給閃回?cái)?shù)據(jù)歸檔區(qū)增加空間,本節(jié)通過一些具體實(shí)例為大家介紹如何清除閃回歸檔區(qū)中的數(shù)據(jù)。 1.清除所有歸檔區(qū)的數(shù)據(jù) SQL>ALTER FLASHBACK ARCHIVE data_test1 PURGE ALL; 2.清除一天以前的數(shù)據(jù) SQL>ALTER FLASHBACK ARCHIVE data_test1 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; 如果將表指定了閃回?cái)?shù)據(jù)歸檔區(qū),則不能對(duì)表進(jìn)行如下操作。 l 刪除,重令名,或者修改列; l 進(jìn)行分區(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 與閃回?cái)?shù)據(jù)歸檔有關(guān)的視圖 可有通過以下視圖來得到與閃回?cái)?shù)據(jù)歸檔有關(guān)的信息。 l DBA_FLASHBACK_ARCHIVE:DBA視圖,閃回歸檔區(qū)信息。 l DBA_FLASHBACK_ARCHIVE_TS:DBA視圖,閃回歸檔有關(guān)表空間。 l DBA_FLASHBACK_ARCHIVE_TABLES:DBA視圖,對(duì)應(yīng)表所對(duì)應(yīng)的閃回歸檔信息。 l USER_FLASHBACK_ARCHIVE:用戶閃回歸檔區(qū)的創(chuàng)建信息。 l USER_FLASHBACK_ARCHIVE_TABLES:用戶表對(duì)應(yīng)的閃回歸檔區(qū)域。 |
|
|