曾傳軍,傅秀芬,彭小玲,許 金
(廣東工業大學 計算機學院,廣東 廣州510006)
Oracle數據庫是世界上最流行的關系數據庫之一。由于它的系統可移植性好、使用方便、功能強,在國內外企事業單位中應用廣泛。本文介紹了Oracle閃回技術,它最大的特點是能實現自動備份,有效減少管理開銷。數據庫發生故障具有隨機性,大多數情況下沒有事先人為備份,這時就可以利用閃回技術快捷方便地恢復數據。從Oracle 9i推出閃回查詢(Flashback Query)特性,到Oracle 10g閃回技術得到了進一步的發展。隨著閃回功能不斷擴充和加強,新的應用也大量出現在系統管理中。
在Oracle 9i中,閃回技術確切地說是閃回查詢(Flashback Query)。閃回查詢可以按照時間戳或SCN向前查詢,獲取回滾段(undo)中的數據鏡像。自動回滾段管理(AUM)是Oracle 9i引入的新特性,閃回查詢必須依賴于它。之前的Oracle數據庫版本,在事務提交后,段中的數據鏡像是可以被覆蓋的。而現在可以在自動回滾段管理模式下調整參數UNDO_RETENTION設置數據庫UNDO信息的最大可以閃回查詢的時間段,只要在這個時間范圍內數據鏡像沒有被覆蓋,數據被恢復的可能性是比較大的,就算不能完全恢復,也至少可以恢復到某個時間點比較好的狀態[1-3]。同時,UNDO信息被覆蓋也跟UNDO表空間的存儲空間大小有關。
閃回查詢在使用前,數據庫要處于Automatic Undo Management狀態。

最大可以閃回查詢的時間段可以在UNDO_RETENTION參數(單位為秒)中設置。

Oracle 9i是基于時間點的閃回,需要查詢SCN或時間戳。若要獲得當前的SCN必須確保用戶對DBMS_FLASHBACK包有執行的權限:grant execute on dbms_flashback to User[4-6]。除了查詢SCN估算向前進行查詢,還可以根據事務提交時間估算向前推移查詢。由于一個數據庫系統表SMON_SCN_TIME構建了SCN→TIME的跟蹤關系,而且不同實例只能維護一個SCN→TIME的映射關系。數據庫通過后臺監控進程SMON每隔5分鐘更新一次表,記錄一次時間戳和當前的SCN。此表總共能記錄保存1 440條記錄,相當于5天的信息。
下面從一個誤操作實例看Oracle 9i閃回技術是如何恢復數據的。在用戶GERENZHULI下復制一張表:create table test as select*from relation。初始時 test表有9個用戶記錄,由于疏忽刪除幾條數據記錄,現將其還原。
(1)誤操作之后,查詢當前的數據記錄為5條。
(2)查詢獲得當前的SCN。

(3)為數據恢復創建一張表 test_for_recov,供數據閃回時插入記錄。

表已創建。
(4)選擇一個比當前小的SCN,向前恢復數據,多次嘗試SCN值,以獲得滿足自己需要的數據狀態。

(5)從上面SCN的嘗試,利用閃回技術恢復數據,將數據插入到表test_for_recov。

至此,將數據恢復到了誤操作之前的狀態。
Oracle 10g閃回技術主要包括閃回數據庫﹑閃回表﹑閃回刪除﹑閃回查詢﹑閃回版本查詢和閃回事務查詢[2,5]。使用閃回技術前,首先設置閃回恢復區的位置參數db_recovery_file_dest;其次設置閃回的最大時間限制參數db_flashback_retention_target;再把數據庫設置為歸檔模式:alter database archivelog。如沒有這個設置,在將數據庫打開為Flashback模式時會出現ORA-38706錯誤。在以上所有的設置完成之后,關閉數據庫后又重啟到Mount狀態下,使用命令alter database flashback on改變數據庫模式為閃回狀態。

(1)閃回數據庫
閃回數據庫(Flashback Database)是 Oracle 10g新增的功能。Oracle 10g閃回數據庫功能啟用后,數據庫會定期將發生變化的數據塊的前鏡像寫入閃回日志的日志文件中,這些日志文件并不是傳統的LGWR進程寫入的,而是由一個新進程RVWR寫入。

下面看一下閃回數據庫功能恢復數據庫實例。
①查詢數據庫的閃回狀態。

②連接到用戶scott下,新建一張表customer并插入12條數據,之后把數據從表中截斷,截斷前的時間查詢到(2010-03-27 20:59:16)為 止,查 詢 截 斷 后 的 表 數 據 信息和當前的時間

表中數據已被截斷,查詢信息被刪除后的時間:

③關閉數據庫并重啟到Mount狀態,用flashback database將數據庫閃回到時間點(2010-03-27 20:59:16)SQL>flashback database to timestamp to_timestamp('2010-03-27 20:59:16','yyyy-mm-dd hh24:mi:ss');
Flashback complete
④閃回恢復后,再打開數據庫實例時,需要使用參數 resetlogs或 noresetlogs:

經查詢,表的數據已恢復。
(2)閃回表
閃回數據庫可以將整個數據庫恢復到指定的時間點。但用戶只希望對指定的表進行恢復,Oracle 10g提供了閃回表(Flashback Table)功能,可以將指定表中的數據﹑索引﹑觸發器等恢復到指定的SCN或時間點。由于flashback table技術使用DML操作恢復數據,不能保證Rownum不變,所以在閃回之前先執行alter table Tablename enable row movement,后 flashback table Tablename to timestamp|scn<timestamp|scn>。
(3)閃回刪除
Oracle 10g閃回刪除(Flashback Drop)功能可以從數據庫中恢復一個被刪除的對象。在執行刪除(Drop)操作時,并不是真刪除,而是將該對象放入回收站(RecycleBin)中,并將對象重命名。這個回收站是虛擬出來的,被刪除的對象在其上也占用刪除前的存儲空間,甚至可以查詢被刪除的對象,也可以用Flashback Drop恢復[7-8]。其原理如圖1所示。

下面分析閃回刪除的使用。

要清除回收站所有的對象,可以使用purge recyclebin;要徹底刪除表,不想將它放入回收站可以這樣刪除表:drop table Tablename purge。
(4)閃回版本查詢(Flashback Version Query)和閃回事務查詢(Flashback Transaction Query)。
Oracle 9i閃回查詢只能得到過去某個時間點的數據版本,由于當前時間與過去某個時間之間,一個表中的數據可能被更新多次,一個時間點的數據版本可能無法滿足恢復需要。Oracle 10g通過閃回版本查詢可以查詢不同時間點的不同版本數據。它只能查詢提交后的數據。建立表 test11,并在其上進行數據 insert﹑delete﹑update操作并提交,而后查詢數據的版本信息。

在閃回版本查詢的基礎上,就可以進行閃回事務查詢(Flashback Transaction Query)恢復。閃回事務的歷史信息以及Undo_SQL保存在FLASHBACK_TRANSATION_QUERY表中。查詢該表的Undo_SQL,使用UNDO語句就可以撤消事務。
本文分別介紹了數據庫Oracle 9i和10g閃回技術在恢復數據的應用。根據上面的應用分析,Oracle 9i與Oracle 10g閃回技術對比如表1所示。

表1 Oracle 9i與Oracle 10g閃回技術對照表
從對比中可以看到,閃回處理手段Oracle 10g比Oracle 9i靈活﹑快捷﹑實用、安全。這一技術在數據恢復上具有諸多優點,在以后的學習研究領域中還有待擴展。
[1]蓋國強.Oracle數據庫管理﹑優化與備份恢復[M].北京:人民郵電出版社,2007:226-365.
[2]THOMAS K.Expert Oracle database architecture 9i and 10g programming techniques and solutions[M].USA:Apress Expert.2005.
[3]QUN Li,HONG Lin Xu.Research on the backup bechanism of oracle database[J].IEEE Computer Soc:2009(2):423-426.
[4]王晨,胡艷,宣海榮.Oracle10g新特性 Flashback探究[J].計算機時代:2007,25(7):58-59.
[5]MATTBEW H,SCOTT J.Oracle database 10g高可用性實現方案-運用 RAC、Flashback和 Data Guard技術[M].劉永健,孔令梅,譯.北京:清華大學出版社,2005.
[6]JOHNSON J.Ready to recover[J].Oracle Magazine:2003,17(5):85-88
[7]Oracle 官方網.Oracle flashback technology[EB/OL].http://www.oracle.com/technology/deploy/availability/htdocs/Flashback_Overview.htm.
[8]KUNDERSMA R.Feature enthusiasm:Oracle flashback database[EB/OL].http://blogs.oracle.com/XPSONHA/2009/07/feature_enthusiasm_oracle_flas.html:2009/7/31.