SQL> create user flashtest identified by flashtest;
SQL> grant connect, resource to flashtest;
SQL> grant execute on dbms_flashback to flashtest;
SQL> connect flashtest/flashtest;
(2)創(chuàng)建測(cè)試表,插入測(cè)試記錄
以下是代碼片段: SQL> create table test(id number(3)); SQL> insert into test values (1); SQL> insert into test values(2); SQL> commit; SQL> create table rec_date(date_scn); |
注意:在執(zhí)行步驟3或者步驟4之前,等待5分鐘。
(3)刪除記錄
以下是代碼片段: SQL> execute dbms_flashback.disable; SQL> insert into rec_date select sysdate from dual; SQL> commit; SQL> delete from test where id=1; SQL> commit; |
通過(guò)以上的操作,我們插入了兩條記錄,并刪除了其中一條記錄。在以下的操作中,我們將通過(guò)flashback query找到刪除的記錄
(4)閃回查詢
以下是代碼片段: SQL> DECLARE Restore_scn date; BEGIN Select date_scn into restore_scn from rec_date; Dbms_flashback.enable_at_time (restore_scn); END; SQL> select * from test; ID 1 2 |
可以看出,雖然刪除記錄并提交,但是通過(guò)閃回操作,仍能查詢到刪除前的兩條記錄。需要注意Oracle每5分鐘記錄一次SCN,并將SCN和對(duì)應(yīng)時(shí)間的映射進(jìn)行紀(jì)錄。如果原來(lái)插入的記錄到做閃回操作的時(shí)間在5分鐘之內(nèi),用基于時(shí)間的閃回查詢可能得不到記錄,因?yàn)榛跁r(shí)間點(diǎn)的查詢實(shí)際上是轉(zhuǎn)化為最近的一次SCN,然后從這個(gè)SCN開(kāi)始進(jìn)行恢復(fù)。因此,如果需要精確的查詢可以采用基于SCN的閃回查詢,可精確閃回到需要恢復(fù)的時(shí)間??梢酝ㄟ^(guò)DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER語(yǔ)句獲取SCN。
Oracle 10g的閃回查詢概述
與Oracle 9i相比Oracle 10g的Flashback有了非常大的改進(jìn),從普通的Flashback Query發(fā)展到了多種形式,主要表現(xiàn)在如下幾方面新特性:
1、Flashback Database
Oracle Flashback Database特性允許通過(guò)SQL語(yǔ)句Flashback Database語(yǔ)句,讓數(shù)據(jù)庫(kù)前滾到當(dāng)前的前一個(gè)時(shí)間點(diǎn)或者SCN,而不需要做時(shí)間點(diǎn)的恢復(fù)。閃回?cái)?shù)據(jù)庫(kù)可以迅速將數(shù)據(jù)庫(kù)回到誤操作或人為錯(cuò)誤的前一個(gè)時(shí)間點(diǎn),如Word中的"撤消"操作,可以不利用備份就快速的實(shí)現(xiàn)基于時(shí)間點(diǎn)的恢復(fù)。Oracle通過(guò)創(chuàng)建新的Flashback Logs(閃回日志),記錄數(shù)據(jù)庫(kù)的閃回操作。如果希望能閃回?cái)?shù)據(jù)庫(kù),需要設(shè)置如下參數(shù):DB_RECOVER_FILE_DEST日志的存放位置,DB_RECOVER_FILE_DEST_SIZE恢復(fù)區(qū)的大小。在創(chuàng)建數(shù)據(jù)庫(kù)的時(shí)候,Oracle將自動(dòng)創(chuàng)建恢復(fù)區(qū),但默認(rèn)是關(guān)閉的,需要執(zhí)行alter database flashback on命令。
例:執(zhí)行Flashback Database命令格式。
以下是代碼片段: SQL>flashback database to time to_timestamp(xxx); SQL>flashback database to scn xxx |
2、Flashback Table
Oracle Flashback Table特性允許利用Flashback Table語(yǔ)句,確保閃回到表的前一個(gè)時(shí)間點(diǎn)。與Oracle 9i中的Flashback Query相似,利用回滾段信息來(lái)恢復(fù)一個(gè)或一些表到以前的一個(gè)時(shí)間點(diǎn)(一個(gè)快照)。要注意的是,F(xiàn)lashback Table不等于Flashback Query,F(xiàn)lashback Query僅僅是查詢以前的一個(gè)快照點(diǎn)而已,并不改變當(dāng)前表的狀態(tài),而Flashback Table將改變當(dāng)前表及附屬對(duì)象一起回到以前的時(shí)間點(diǎn)。
語(yǔ)法:
flashback table tablename to timestamp xxx或
flashback table tablename to scn xxx
注意:如果需要閃回一個(gè)表,需要以下條件:
·需要有flashback any table的系統(tǒng)權(quán)限或者是該表的flashback對(duì)象權(quán)限;
·需要有該表的select,insert,delete,alter權(quán)限;
·必須保證該表row movement。
例:執(zhí)行將test表閃回到2005年5月7日下午3點(diǎn)。
以下是代碼片段: SQL>flashback table test to timestamp to_timestamp(’2005-05-07 15:00:00’,’yyyy-mm-dd hh24:mi:ss’); |
3、Flashback Drop
Oracle Flashback Drop特性提供一個(gè)類似回收站的功能,用來(lái)恢復(fù)不小心被刪除的表。當(dāng)刪除表時(shí),Oracle 10g并不立刻釋放被刪除的表所占用的空間,而是將這個(gè)被刪除的表進(jìn)行自動(dòng)重命名(為了避免同類對(duì)象名稱的重復(fù))并放進(jìn)回收站中。所謂的回收站類似于Windows系統(tǒng)中的回收站,是一個(gè)虛擬的容器,用于存放所有被刪除的對(duì)象,在回收站中被刪除的對(duì)象將占用創(chuàng)建時(shí)的同樣的空間。如果這個(gè)被刪除的表需要進(jìn)行恢復(fù),就可利用Flashback Drop功能。
例:進(jìn)行一個(gè)刪除表后恢復(fù)的簡(jiǎn)單測(cè)試。
(1)顯示回收站信息
以下是代碼片段: SQL>show recyclebin; |
可以看到,回收站中是沒(méi)有任何結(jié)果的,表示沒(méi)有任何表在回收站中。
(2)創(chuàng)建一個(gè)表,并刪除,再次顯示回收站信息
以下是代碼片段: SQL>create table test_drop(name varchar2(10)); SQL>drop table test_drop; SQL>show recyclebin; ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME TEST_DROP BIN$b+XkkO1RS5K10uKo9BfmuA==$0 TABLE 2005-05-07:14:30:47 |
(3)對(duì)被刪除的表進(jìn)行恢復(fù)
以下是代碼片段: SQL>flashback table test_drop to before drop;或 SQL>flashback table "BIN$b+XkkO1RS5K10uKo9BfmuA==$0" to before drop; |
(4)管理回收站
清除回收站中的單個(gè)表:purge table test_drop
清除整個(gè)回收站:purge recyclebin
清除不同的對(duì)象回收站:purge user_recyclebin或purge dba_recyclebin
(5)確認(rèn)刪除一個(gè)表
以下是代碼片段: SQL>drop table test_drop purge; |
如果刪除一個(gè)表且不放到回收站中不能進(jìn)行恢復(fù),在drop語(yǔ)句中可以利用purge選項(xiàng)。
4、Flash Version Query
Oracle Flashback Version Query特性,利用保存的回滾信息,可以看到特定的表在時(shí)間段內(nèi)的任何修改,如電影的回放一樣,可以了解表在該期間的任何變化。Flashback version query一樣依賴于AUM,提供了一個(gè)查看行改變的功能,能找到所有已經(jīng)提交了的行的記錄,分析出過(guò)去時(shí)間都執(zhí)行了什么操作。Flashback version query采用VERSIONS BETWEEN語(yǔ)句來(lái)進(jìn)行查詢,常用的方法:
·VERSIONS_SCN – 系統(tǒng)改變號(hào)
·VERSIONS_TIMESTAMP – 時(shí)間
例如:在test表中,時(shí)間1插入一條記錄,時(shí)間2刪除了這條記錄,對(duì)于時(shí)間3執(zhí)行select * from test當(dāng)然查詢不到這條記錄,只能看到該表最后的提交記錄。這時(shí)如果利用Flash Table或者是Flash Query,只能看到過(guò)去的某一時(shí)間點(diǎn)的一個(gè)快照,而利用Flashback Version Query,能夠把時(shí)間1、時(shí)間2的操作給記錄下來(lái),并詳細(xì)的查詢出對(duì)表進(jìn)行的任何操作。
以下是代碼片段: SQL>select versions_starttime,versions_endtime, versions_xid,versions_operation,id from test versions between timestamp minvalue and maxvalue order by versions_starttime; |
在上述查詢中,列 versions_starttime、versions_endtime、versions_xid、versions_operation是偽列,還有一些偽列,如versions_startscn和versions_endscn顯示了該時(shí)刻的系統(tǒng)更改號(hào)。列versions_xid顯示了更改該行的事務(wù)標(biāo)識(shí)符。
當(dāng)然,除了分析以上所有的變更之外,可以根據(jù)需要指定時(shí)間段,如顯示在2005-05-07時(shí)間在15:30到16:30之間test表的所有變更。
以下是代碼片段: SQL>select id from test versions between timestamp to_date(’2005-05-07 15:30:00’,’yyyy-mm-dd hh24:mi:ss’) and to_date(’2005-05-07 16:30:00’,’yyyy-mm-dd hh24:mi:ss’) |
5、Flashback Transaction Query
Oracle Flashback Transaction Query特性確保檢查數(shù)據(jù)庫(kù)的任何改變?cè)谝粋€(gè)事務(wù)級(jí)別,可以利用此功能進(jìn)行診斷問(wèn)題、性能分析和審計(jì)事務(wù)。它其實(shí)是Flashback Version Query查詢的一個(gè)擴(kuò)充,F(xiàn)lashback Version Query說(shuō)明了可以審計(jì)一段時(shí)間內(nèi)表的所有改變,但是也僅僅是能發(fā)現(xiàn)問(wèn)題,對(duì)于錯(cuò)誤的事務(wù),沒(méi)有好的處理辦法。而Flashback Transaction Query提供了從FLASHBACK_TRANSACTION_QUERY視圖中獲得事務(wù)的歷史以及Undo_sql(回滾事務(wù)對(duì)應(yīng)的sql語(yǔ)句),也就是說(shuō)審計(jì)一個(gè)事務(wù)到底做了什么,甚至可以回滾一個(gè)已經(jīng)提交的事務(wù)。
例:Flashback Transaction Query的操作實(shí)例。
(1)在test表中刪除記錄,獲得事務(wù)的標(biāo)識(shí)XID,然后提交。
以下是代碼片段: SQL>delete from test where id=2; SQL>select xid from v$transaction; XID —————- 04001200AE010000 SQL>commit; |
在測(cè)試中方便起見(jiàn),在事務(wù)沒(méi)有提交的時(shí)候,獲得事務(wù)的XID為04001F0035000000。實(shí)際情況下,不可能去跟蹤每個(gè)事務(wù),想要獲得已提交事務(wù)的XID,就必須通過(guò)上面的Flashback Version Query。
(2)進(jìn)行Flashback Transaction Query
以下是代碼片段: SQL>select * from FLASHBACK_TRANSACTION_QUERY where xid=’04001F0035000000’; UNDO_SQL insert into "FLASHTEST"."TEST"("ID") values (’2’); |
注意:這個(gè)刪除語(yǔ)句對(duì)應(yīng)的是1個(gè)Insert語(yǔ)句,如果想回滾這個(gè)事務(wù),執(zhí)行這個(gè)Insert語(yǔ)句即可。
可以看到,F(xiàn)lashback Transaction Query主要用于審計(jì)一個(gè)事務(wù),并可以回滾一個(gè)已經(jīng)提交的事務(wù)。如果確定出錯(cuò)的事務(wù)是最后一個(gè)事務(wù),我們利用Flashback Table或者Flashback Query就可以解決問(wèn)題。但是,如果執(zhí)行了一個(gè)錯(cuò)誤的事務(wù)之后,又執(zhí)行了一系列正確的事務(wù),那么上面的方法就無(wú)能為力,利用Flashback Transaction Query可以查看或回滾這個(gè)錯(cuò)誤的事務(wù)。
結(jié)束語(yǔ)
通過(guò)上面的描述,可以看出閃回功能使用戶恢復(fù)偶然的錯(cuò)誤刪除更加容易,增強(qiáng)了系統(tǒng)的可用性與讀一致性。