陳偉明
摘要:閃回技術(shù)是Oracle提供的一種強大的備份恢復機制手段,能夠讓用戶及時地恢復由于誤操作而造成的數(shù)據(jù)庫邏輯錯誤,達到損失最小化,避免進行沒有可用邏輯備份而采取的數(shù)據(jù)庫不完全恢復,且多數(shù)都能在聯(lián)機狀態(tài)下完成。本文主要介紹了閃回技術(shù)幾種常用的技術(shù)手段,并利用一些實例展示了該技術(shù)在實際工作中的具體應用。
關(guān)鍵詞:Oracle;數(shù)據(jù)庫;閃回
中圖分類號:G202? ? ? ? ? ? ? ? ? 文獻標識碼:A
在實際工作中,Oracle數(shù)據(jù)庫的人為錯誤操作,比如數(shù)據(jù)誤刪除或者執(zhí)行了錯誤的更新,且提交了數(shù)據(jù),可能會造成系統(tǒng)停機。在沒有邏輯或物理備份的情況下,要想進行數(shù)據(jù)恢復是非常困難的,而利用Oracle數(shù)據(jù)庫提供的閃回技術(shù), 可以讓管理員將數(shù)據(jù)庫回退到過去的某一個狀態(tài),更正邏輯錯誤操作,其簡單易用,效率高,大大提高了數(shù)據(jù)庫的安全性和完整性1。Oracle提供了閃回表、閃回刪除、閃回版本查詢、閃回事務查詢,閃回數(shù)據(jù)庫,閃回數(shù)據(jù)歸檔等閃回技術(shù)。本文就其中幾種閃回技術(shù)做簡單介紹,并對最常用的利用具體實例加以說明。
1? 閃回表操作
閃回表是一個獨立的事務,主要是為了解決用戶對某個表不小心做了不正確操作,需要在線恢復指定表中的數(shù)據(jù)。通過閃回表操作,將指定表中數(shù)據(jù)恢復到指定的時間點或者系統(tǒng)改變號SCN上,并自動恢復索引,約束,觸發(fā)器等,而數(shù)據(jù)庫繼續(xù)保持連接狀態(tài),其它表不受影響同樣保持當前狀態(tài)。Oracle閃回查詢主要是利用了Undo表空間,閃回查詢能恢復的時間點取決于Undo表空間的大小和Undo_Retention參數(shù)有關(guān),且無法對過去版本的數(shù)據(jù)進行DML操作。此外,閃回表利用DML操作恢復數(shù)據(jù)時,其無法保證Rownum號不變,因此我們在進行閃回操作前必須先要啟動行移動功能,否則閃回操作會報錯。
下面用一個實例說明如何將表中的數(shù)據(jù)恢復到指定時間點的操作。
(1)創(chuàng)建一個測試表Com_Employee,包含員工編號、姓名、性別等演示數(shù)據(jù)。
結(jié)果顯示,表中只有張三的基本信息,證明數(shù)據(jù)被恢復到了指定的時間點,閃回成功,閃回表可能會失敗,主要原因是不能保護系統(tǒng)表空間中的表,即不適用于SYS模式下的表,違反了外鍵約束,撤銷數(shù)據(jù)被覆蓋后導致數(shù)據(jù)失效,權(quán)限不足,有其他用戶鎖定了閃回作用的行而不能閃回,對表的DLL操作比如對表做了截斷操作或者刪除了列等,實際應用時應加以判斷。盡量在最短時間內(nèi)發(fā)現(xiàn)錯誤并執(zhí)行閃回操作,如果閃回因為任何原因而失敗,Oracle閃回操作將會被終止,回滾已經(jīng)成功執(zhí)行的任何一部分操作,將表狀態(tài)回到閃回命令發(fā)出之前的樣子。
2? 閃回刪除
恢復已經(jīng)被用戶刪除Drop的數(shù)據(jù)庫對象,相應的索引,數(shù)據(jù)庫約束也會被還原。閃回刪除需要用到Oracle 中的回收站機制。Drop命令僅相當于一個重命名的操作,當用戶刪除一個表的時候,該表的所有相關(guān)對象也將被保存在Oracle 回收站內(nèi),未被真正刪除,此時可以通過閃回刪除操作將用戶被錯誤Drop的表進行閃回操作。閃回被誤刪除的表實例演示如下。
需要注意的是閃回刪除僅針對DROP 操作,對于Truncate操作和回收站被Purge的表將無法恢復,另外依賴該表的位圖索引、引用完整性約束不受回收站保護。
3? 閃回版本查詢和閃回事務查詢
一條行數(shù)據(jù)在使用周期內(nèi)可能會發(fā)生多次改變。閃回版本查詢可用于查看一個行在不同時期內(nèi)所提交的不同版本的數(shù)據(jù),以及相應的DML操作記錄,主要包括該版本數(shù)據(jù)的創(chuàng)建時間和結(jié)束時間,操作者是誰以及每個更改的事務標識符,從而讓我們可以詳細了解某個具體的表在這個時間段內(nèi)的具體變化情況。閃回事務查詢則是閃回版本查詢的擴充,可以實現(xiàn)審計事務或者撤銷一個已經(jīng)提交的事務,Oracle中進行DML操作并提交后,Oracle會自動構(gòu)造SQL語句來反轉(zhuǎn)事務的更改,自動執(zhí)行修復過程,其主要是利用了保存在Flashback_Transaction_Query 表中的Undo_Sql來恢復具體的事務操作,而并不是回滾一個已經(jīng)提交到事務,利用它可以看到受該事務影響的每個行都對應有一行記錄。閃回事務不會造成數(shù)據(jù)丟失,僅僅是撤銷指定的事務,并且數(shù)據(jù)庫依舊能夠保持當前狀態(tài)。
實例演示:新建一個表Test,并做一些DML操作,接著查詢出這些具體的操作,并做指定的撤銷處理。
(1)新建表,插入2條演示數(shù)量,并模擬刪除其中的一條數(shù)據(jù)。
(6)查詢Test表進行結(jié)果檢查,數(shù)據(jù)回到了原來Update前的初始狀態(tài)了,閃回完成。
需要注意的是,閃回版本查詢不能用于外部表、視圖或臨時表,因為這些對象都能不生成撤銷數(shù)據(jù)。當對表做了截斷操作,或者對表欄做了刪除列的操作后,閃回版本查詢信息將丟失,但增加列的DDL操作則不會丟失版本查詢信息。
4? 閃回數(shù)據(jù)歸檔
閃回數(shù)據(jù)歸檔區(qū)本質(zhì)是從一個或多個表空間中劃出來的一部分空間,能夠使表具有退回到過去任何時間點的能力。閃回操作中除了閃回數(shù)據(jù)庫是利用了閃回日志外,其他都依賴撤銷表空間,然而撤銷表空間是循環(huán)使用的,老的數(shù)據(jù)會被新的數(shù)據(jù)替換,且保留時間短,一旦撤銷數(shù)據(jù)被覆蓋重寫,將必然導致閃回失敗,而利用閃回數(shù)據(jù)庫歸檔,將改變的數(shù)據(jù)另外存放到特定的閃回數(shù)據(jù)歸檔區(qū),從而有效避開撤銷數(shù)據(jù)空間大小的限制,提高數(shù)據(jù)保留時間。它只針對Undate和Delete語句,并不保存Intert操作。我們在某個表空間上創(chuàng)建一個數(shù)據(jù)歸檔區(qū),并設置好大小和保留時間,然后為具體的表指定具體的閃回數(shù)據(jù)歸檔區(qū),通過為表指定閃回歸檔區(qū)后,實際上就開啟了對表的跟蹤,這時將不再允許對表執(zhí)行DLL操作,如刪表、增刪列、改名等,這些限制可以通過 alter table test1 no flashback archive進行取消,通過設置以后,表就具有了退回到保留時間內(nèi)某個具體時間點的能力。
5? 結(jié)語
本文主要針對Oracle常用閃回技術(shù)做了簡單介紹并結(jié)合實例演示了閃回技術(shù)給我們提供的一種針對數(shù)據(jù)庫邏輯錯誤快速恢復的機制,多數(shù)能在聯(lián)機狀態(tài)下進行數(shù)據(jù)恢復,快速且有效,閃回的過程中,也有可能失敗,閃回前可能需要取消對某些表完整性和約束檢查,但是,閃回恢復的程度取決于閃回空間的大小以及保留的時間策略設置,但對于磁盤的物理損壞或介質(zhì)丟失,閃回技術(shù)就無法發(fā)揮其作用了,必須借助Oracle其他的備份恢復工具進行備份恢復操作,因此,閃回技術(shù)更適合恢復偶然的操作錯誤,其增強了系統(tǒng)可用性與一致性。
(責任編輯:武多多)
參考文獻:
[1]張曉明.大話Oracle RAC集群、高可用性,備份與恢復[M].北京:人民郵電出版社,2011.
[2]李興華,馬云濤.Oracle開發(fā)實戰(zhàn)經(jīng)典[M].北京:清華大學出版社,2014.
[3]楊建榮.Oracle DBA工作筆記:運維、數(shù)據(jù)遷移與性能調(diào)優(yōu)[M].北京:中國鐵道出版社,2016.