Oracle數(shù)據(jù)庫備份、恢復與遷移 第五章 數(shù)據(jù)庫的FLASHBACK技術

在數(shù)據(jù)庫服務器正常運行過程中,用戶可能在數(shù)據(jù)庫中執(zhí)行了一些誤操作,比如刪除了一個重要的表,或者對某個表執(zhí)行了TRUNCATE操作,也可能向數(shù)據(jù)庫中寫入了錯誤的數(shù)據(jù)。為了讓這些重要的表或者數(shù)據(jù)重新回到數(shù)據(jù)庫中,或者讓表中錯誤的數(shù)據(jù)消失,管理員希望把數(shù)據(jù)庫恢復到過去的某個時刻,在這些情況下,F(xiàn)LASHBACK是一種非常好的選擇。具體來說,利用FLASHBACK可以完成一下任務:
查詢一個表在過去某個時刻的數(shù)據(jù)
查詢一個表在過去一段時間內(nèi)數(shù)據(jù)的變化
從回收站中恢復一個被刪除的表
把一個表恢復到過去的某個時刻或者某個SCN
把整個數(shù)據(jù)庫恢復到過去某個時刻或者某個SCN
利用FLASHBACK,可以知道一行數(shù)據(jù)在過去某個時刻的樣子,還可以把這行數(shù)據(jù)恢復到過去的某個時刻,也可以針對一個表,或者整個數(shù)據(jù)庫進行相同的操作??傊肍LASHBACK可以找回過去的數(shù)據(jù),同時把由此對數(shù)據(jù)庫帶來的影響減到最小。
????????由此可見,F(xiàn)LASHBACK最主要的功能,是對數(shù)據(jù)庫進行“基于時間點”的恢復,或者“基于SCN”的恢復。為此,F(xiàn)LASHBACK需要讀UNDO表空間、歸檔日志文件和重做日志文件、位于快速恢復區(qū)的FLASHBACK日志等數(shù)據(jù)。
5.1快速恢復區(qū)的設置
????????快速恢復區(qū)是硬盤設備上的一段存儲空間,它可能是一個目錄,或者一個文件系統(tǒng),或者一個ASM磁盤組。Oracle數(shù)據(jù)庫服務器在這段存儲空間中存放一些與數(shù)據(jù)庫的備份和恢復有關的文件。具體來說,快速恢復區(qū)有以下用途:
多元化控制文件的一個默認存儲路徑
多元化重做日志文件的一個默認存儲路徑
控制文件和參數(shù)文件的自動備份結果的默認存儲路徑
對數(shù)據(jù)庫所做任何備份所產(chǎn)生的備份結果的默認存儲路徑
歸檔日志文件的默認存儲路徑
數(shù)據(jù)庫的FLASHBACK日志文件的唯一存儲路徑
????????快速恢復區(qū)中的文件要么是永久性的,要么是臨時性的。永久性意味著數(shù)據(jù)庫實例在正常運行時,需要讀寫這種文件。臨時性意味著這種文件具有有效期,只要過了有效期,文件就可以被手工或自動刪除。如果其中一個控制文件,或者某個重做日志組中的其中一個重做日志文件存儲在快速恢復區(qū)中,那么一旦這樣的文件不可用,數(shù)據(jù)庫服務器將無法正常運行。實際上,快速恢復區(qū)中的永久性文件只有這樣的控制文件和重做日志文件,其他文件都是臨時性的,Oracle數(shù)據(jù)庫服務器或者RMAN工具將自動對這些文件進行維護。
????????在RAC環(huán)境中,快速恢復區(qū)必須是一個集群文件系統(tǒng),或者一個ASM磁盤組,或者是通過NFS設置的共享目錄,而且在所有的數(shù)據(jù)庫實例中,與快速恢復區(qū)有關的初始化參數(shù)的設置必須是相同的。也就是說,在RAC環(huán)境中,所有的數(shù)據(jù)庫實例使用相同的快速恢復區(qū)。
????????與快速恢復區(qū)有關的兩個初始化參數(shù)是:
DB_RECOVERY_FILE_DEST_SIZE
DB_RECOVERY_FILE_DEST
????????其中第一個初始化參數(shù)用于指定快速恢復區(qū)的大小,以MB為單位,第二個參數(shù)用于指定快速恢復區(qū)的路徑。在創(chuàng)建數(shù)據(jù)庫的同時,可以對快速恢復區(qū)進行設置。如果當時沒有設置,在數(shù)據(jù)庫服務器正常運行時,可以通過上述兩個初始化參數(shù)對快速恢復區(qū)進行設置。需要注意:首先通過第一個初始化參數(shù)指定快速恢復區(qū)的大小,然后通過第二個參數(shù)指定快速恢復區(qū)的路徑。例如:
????????隨著數(shù)據(jù)庫服務器的運行,在快速恢復區(qū)中不斷產(chǎn)生新的文件,而有些文件由于過期而被刪除。一旦快速恢復區(qū)被寫滿,數(shù)據(jù)庫中的所有事務將無法繼續(xù)執(zhí)行,對用戶來說,事務表現(xiàn)為掛起現(xiàn)象。實際上,只有數(shù)據(jù)庫的FLASHBACK日志文件必須存放在快速恢復區(qū),其他文件都可以存放在快速恢復區(qū)以外的其他地方。例如,通過初始化參數(shù)為歸檔日志文件指定其他的存儲路徑:在備份數(shù)據(jù)庫時,在BACKUP命令為備份結果指定其他的存儲路徑。
????????故障案例:某市機要局的密鑰管理系統(tǒng)承擔著為市委辦公網(wǎng)產(chǎn)生密鑰的重要任務,這個系統(tǒng)的數(shù)據(jù)庫曾經(jīng)發(fā)生一個故障,導致市委辦公網(wǎng)癱瘓。經(jīng)過排查發(fā)現(xiàn),數(shù)據(jù)庫中的事務全部被掛起,數(shù)據(jù)無法寫入數(shù)據(jù)庫。當進一步查看數(shù)據(jù)庫服務器的狀態(tài)時發(fā)現(xiàn),數(shù)據(jù)文件、控制文件和重做日志文件的狀態(tài)以及各個后臺進程的狀態(tài)都正常,但在查看各個后臺進程的跟蹤文件時發(fā)現(xiàn),ARCH進程無法對重做日志文件進行歸檔。通過查看初始化參數(shù)發(fā)現(xiàn),歸檔日志文件的存儲路徑為快速恢復區(qū),而當時的數(shù)據(jù)庫版本對這個存儲區(qū)域的大小默認限制為2GB,而且?guī)缀跻呀?jīng)被寫滿了。于是數(shù)據(jù)庫出現(xiàn)故障的原因確定為:因為快速恢復區(qū)被寫滿,歸檔日志文件無法產(chǎn)生,從而導致數(shù)據(jù)庫中的事務被掛起,解決這個故障的方法是:為歸檔日志文件指定另外一個存儲路徑,同時吧快速恢復區(qū)的空間擴展到20GB,以防止它被再次寫滿而導致其他問題的產(chǎn)生。
5.2回收站在防止誤刪除方面的作用
????????如果你不小心對一個重要的表執(zhí)行了DROP操作,或者一個非法用戶惡意地刪除了一個重要的表,你一定會感到非常痛心。在過去的Oracle數(shù)據(jù)庫中,為了解決這類問題,需要對數(shù)據(jù)庫進行“基于時間點”的恢復,也就是說,利用數(shù)據(jù)庫的備份,把數(shù)據(jù)庫恢復到DROP操作執(zhí)行之前的時刻,通過這種辦法雖然能夠找回重要的表,但由此帶來的負面影響可能不是管理員能夠承受的,因此整個數(shù)據(jù)庫都回到過去,而且這樣的恢復需要用到整個數(shù)據(jù)庫的備份,如果沒有這樣的備份,這樣的恢復不可能進行。
????????目前的Oracle版本提供了回收站的功能。當用戶刪除一個表時,這個表并沒有被真正刪除,而是放到了回收站中,回收站實際上是一些系統(tǒng)表,當一個表被刪除時,表的相關信息被移到這些系統(tǒng)表中,而表中的數(shù)據(jù)并沒有被真正刪除,只是用戶無法對其進行訪問而已。通過查詢相關的數(shù)據(jù)字典視圖,可以確定回收站中有哪些表。
如果數(shù)據(jù)庫沒有開啟回收站功能,那么當一個表被刪除是,這個表占用的存儲空間將立即被釋放,它就真正不存在了。如果數(shù)據(jù)庫開啟了回收站功能,被刪除的表所占用的存儲空間并沒有立即釋放,而是保留盡量長的時間,知道空間緊張時,這樣就為表的恢復提供了最大的可能性。
回收站功能是通過初始化參數(shù)RECYCLEBIN來實現(xiàn)的,如果這個參數(shù)的值是ON,說明當前數(shù)據(jù)庫開啟了回收站功能,如果是OFF,則說明當前數(shù)據(jù)庫關閉了回收站功能,為了能夠使用回收站,一方面,作為SYS用戶,可以修改初始化參數(shù)RECYCLEBIN的值為ON,然后重新啟動數(shù)據(jù)庫服務器,這樣數(shù)據(jù)庫中的所有用戶都可以使用回收站,例如:
另一方面,普通用戶可以選擇在當前會話中開啟或關閉回收站功能。例如:
在SQL*Plus中,用戶可以通過執(zhí)行下面的命令來查看回收站中所有的表:
另外,SYS用戶可以從數(shù)據(jù)字典視圖DBA_RECYCLEBIN中查詢數(shù)據(jù)庫中所有被刪除的、且位于回收站中的表和索引,而普通用戶可以從數(shù)據(jù)字典視圖USER_RECYCLEBIN中查詢當前模式中被刪除的且位于回收站中的表和索引。例如:
從上述查詢結果可以看出,當一個表被刪除時,這個表以及表上的索引將一起被放到回收站中,而且被重新指定新的名稱。重新命名的目的是為了防止同名的表或索引在回收站中引起名稱沖突。
通過上述方法可以了解回收站中的表或索引在被刪除之前的名稱、在回收站中的名稱、數(shù)據(jù)庫對象類型、被刪除時間等信息。
如果管理員關閉了數(shù)據(jù)庫的回收站,那么當用戶刪除一個表時,這個表連同表上的索引等數(shù)據(jù)庫對象將一起被刪除,表和索引所占用的存儲空間將被立即釋放。如果開啟了回收站功能,被刪除的表連同這個表上的索引將被放到回收站中,它們所占用的空間并沒有釋放,也就是說,它們所對應的段并沒有被刪除。當管理員從相關的數(shù)據(jù)字典視圖中查詢這些段的信息時,將發(fā)現(xiàn)段的名稱被改為和回收站中的名稱一致。例如,當用戶刪除表STU時,這個表以及表上的索引STU_ID_PK被放入回收站。如果從數(shù)據(jù)字典視圖USER_SEGMENTS中查詢它們對應的段的信息,將得到類似以下的結果:
既然表被刪除時它所占用的存儲空間并沒有立即釋放,那么表中的數(shù)據(jù)還是可以查詢的,只不過在SELECT語句中需要指定這個表在回收站中的名稱。例如:
既然表和索引對應的段并沒有被真正刪除,那么利用FLASHBACK命令,管理員就可以從回收站中恢復一個表,在命令中需要指定這個表在回收站中的名稱。例如:
????????如果上述FLASHBACK命令執(zhí)行成功,那么這個表連同表上的索引可以再次正常使用,它們的名稱還是被刪除之前的名稱。
????????在FLASHBACK命令中也可以指定一個表的被刪除之前的名稱。如果這個名稱在回收站中也是唯一的,那么這個表也可以被正常恢復。例如:
????????如果用戶將一個表刪除之后,又創(chuàng)建一個同名的表,那么當用戶希望從回收站中恢復這個表時,將遇到名稱沖突的問題,為了解決這個問題,在從回收站中恢復一個表時,可以同時修改這個表的名稱。例如:
????????現(xiàn)在考慮到一種特殊情況,用戶多次創(chuàng)建一個同名的表,又多次刪除這樣的表,雖然這些表被放入回收站時都被重新命名,但它們被刪除之前的名稱在回收站中是重復的。例如:
????????這樣在回收站中將有三個DEPT表,它們被刪除之前的名稱在回收站中是相同的。如果通過下面的命令恢復表DEPT:
????????那么最后被刪除的那個DEPT表將被恢復。
????????如果再次執(zhí)行上面的FLASHBACK命令,那么回收站中稍晚被刪除的那個DEPT表將被恢復,但命令的執(zhí)行將產(chǎn)生錯誤。為避免名稱沖突,在恢復另外兩個DEPT表時,需要為它們指定其他名稱。例如:
????????如果確定一個表不再需要,可以通過PURGE命令把它從回收站中刪除,這個表以及表上的索引所占用的空間將被釋放,這時表以及索引將被真正刪除。PURGE命令可用于刪除回收站中所有的表,也可以刪除一個指定的表,例如:
?????????由于一個表在回收站中的名稱是唯一的,所以在PURGE命令中指定這個名稱時,將刪除一個確定的表。在PURGE命令中也可以指定一個表刪除之前的名稱。如果回收站中有多個表,它們在刪除之前的名稱時相同的,那么PURGE命令中指定這樣的名稱時,將按照時間順序,刪除最早被放入回收站的那個表。
????????當用戶刪除一個表時,可以同時指定是否將這個表放入回收站。如果在DROP語句中指定了PURGE關鍵字,那么這個表將被徹底刪除,而不是放入回收站。例如:
5.3表的FLASHBACK查詢
????????在數(shù)據(jù)庫服務器正常運行時,表中的數(shù)據(jù)不斷被更新。在一般情況下,用戶通過SELECT語句只能看到表中目前的數(shù)據(jù)。利用FLASHBACK技術,可以查詢一個表在過去某個時刻的數(shù)據(jù),或者在某個SCN的數(shù)據(jù)。例如:
????????或者:
????????SELECT語句中的時間是以時間戳的形式指定的。為此需要通過函數(shù)TO_TIMESTAMP將指定的時間轉(zhuǎn)換為時間戳。
????????如果通過WHERE子句限定了一行特定的數(shù)據(jù),那么利用SELECT語句可以查詢這行數(shù)據(jù)在過去某個時刻的樣子。例如:
????????在一般情況下,管理員對表中數(shù)據(jù)的修改是很難跟蹤的。在某個時刻,用戶可能向表中寫入了錯誤的數(shù)據(jù),即使用戶后來能夠發(fā)現(xiàn)數(shù)據(jù)錯誤,也無法判斷這樣的數(shù)據(jù)是什么時候出現(xiàn)錯誤的。比如,公司財務人員本來應該為員工增加100元工資,但由于疏忽,為員工增加了1000元工資,在此基礎上,財務人員又對這樣的數(shù)據(jù)進行了數(shù)次其他修改,這種情況將導致表中最終的數(shù)據(jù)是錯誤的。利用FLASHBACK查詢,可以從目前的時刻向過去的時間進行跟蹤,以確定表中數(shù)據(jù)的變化,一直跟蹤到準確的數(shù)據(jù),以及當時的時間。假設表EMP中員工7788的工資和獎金在2015年12月1日12點時的數(shù)據(jù)是準確的,而此后的數(shù)據(jù)是錯誤的,那么利用類似下面的UPDATE語句,可以把這樣的數(shù)據(jù)恢復為最后的準確的樣子:
????????至此,這行數(shù)據(jù)被恢復為它最后一次準確的狀態(tài),在此基礎之上,管理員再對這行數(shù)據(jù)執(zhí)行后續(xù)的其他修改,直到把數(shù)據(jù)修改為現(xiàn)在應該呈現(xiàn)的狀態(tài)。
????????除此之外,利用FLASHBACK查詢可以了解表中的某行數(shù)據(jù)在過去一段時間內(nèi)的變化,以及引起這些變化的事務的情況。例如:
????????從上面的查詢結果可以看出,在指定的5min這段時間內(nèi),在DEPT表中發(fā)生過一個事務,他把表中這行數(shù)據(jù)中的LOC列的值從"BOSTON"修改為"BEIJING"。VERSION_XID列是一個偽列,它代表的是對這樣數(shù)據(jù)進行了這樣修改的事務的ID。
5.4表的FLASHBACK
????????如果用戶發(fā)現(xiàn)從某個時刻起,表中的許多行數(shù)據(jù)都被錯誤地修改,那么利用剛才提到的UPDATE語句一行一行地把數(shù)據(jù)改為那個時刻的樣子,這種方法雖然是可行的,但效率太低。利用表的FLASHBACK技術,可以把整個表恢復到過去的某個時刻,在此基礎之上,對表中的數(shù)據(jù)再執(zhí)行后續(xù)的其他修改,直到把數(shù)據(jù)修改為目前應該呈現(xiàn)的樣子。
????????為了能夠利用FLASHBACK技術將表恢復到過去某個時刻,需要對表執(zhí)行下面的操作,其中DEPT是表的名稱。
????????下面的FLASHBACK語句用于將表DEPT恢復到過去的某個時刻:
????????需要強調(diào)的是,F(xiàn)LASHBACK技術的使用是有條件的。無論用FLASHBACK查詢一個表在過去某個時刻的數(shù)據(jù),還是把表恢復到過去某個時刻,都有以下限制:
不能針對外部表、視圖和臨時表進行FLASHBACK
FLASHBACK需要讀UNDO表空間中的數(shù)據(jù)
????????表上的FLASHBACK查詢和恢復是利用UNDO表空間中的數(shù)據(jù)完成的。當用戶執(zhí)行一個事務時,表中與該事務有關的最初的數(shù)據(jù)將被拷貝到UNDO表空間中,當用戶提交事務時,UNDO表空間中的相關數(shù)據(jù)就可以被刪除了,但不是立即刪除,而是要保留一段時間,保留時間通過初始化參數(shù)UNDO_RETENTION來指定。
????????如果表的FLASHBACK查詢和恢復所涉及的時刻在相關UNDO數(shù)據(jù)的保留期內(nèi),那么這次FLASHBACK操作可能順利完成。比如,初始化參數(shù)UNDO_RETENTION的值為900(單位為秒,即15min),而管理員需要查詢一個表在14min之前那個時刻的數(shù)據(jù),那么有可能得到查詢結果。如果要查詢16min之前的數(shù)據(jù),那么可能得到一條錯誤信息。
????????在剛才的描述中,多次用到“可能”一詞,這是因為,F(xiàn)LASHBACK操作能否成功,并不嚴格受到UNDO數(shù)據(jù)保留期的限制。如果數(shù)據(jù)庫中的事務很少,數(shù)據(jù)庫對UNDO表空間的需求并不大,那么以前的事務所產(chǎn)生的UNDO數(shù)據(jù)在UNDO表空間中可以保留更長時間,超出初始化參數(shù)UNDO_RETENTION指定的時間,這時用戶利用FLASHBACK技術可以查詢一個表在過去更遠時刻的數(shù)據(jù),或者把表恢復到過去更遠的時刻。相反,如果數(shù)據(jù)庫中的事務很多,UNDO數(shù)據(jù)產(chǎn)生的速度很快,那么以前已提交的事務所產(chǎn)生的UNDO數(shù)據(jù)可能很快被覆蓋,無法保留管理員期望的時間,也就是通過初始化參數(shù)UNDO_RETENTION指定的那么長時間,這時FLASHBACK操作只能達到更近的某個時刻。
????????為了保證FLASHBACK操作的順利執(zhí)行,一方面,需要通過初始化參數(shù)UNDO_RETENTION為UNDO數(shù)據(jù)設置適當?shù)谋A羝冢硪环矫?,還要保證UNDO數(shù)據(jù)在保留期內(nèi)不會被覆蓋。例如,下面的語句將UNDO數(shù)據(jù)的保留期設置為30min:
????????此外,利用FLASHBACK對表進行恢復的操作不能跨越DDL操作,也就是說,如果希望把一個表恢復到過去某個時刻,但從那個時刻開始到目前時刻這段時間內(nèi),用戶對表執(zhí)行DDL操作,比如通過ALTER命令修改了表的結構,或者通過TRUNCATE命令清空了表中的數(shù)據(jù),那么最多只能把表恢復到DDL命令執(zhí)行之后的某個時刻。
5.5更久遠的FLASHBACK——Total Recall
????????為了使用戶能夠查詢一個表在過去更遠一個時刻的數(shù)據(jù),或者把表恢復到過去更遠的一個時刻,同時為了使表的FLASHBACK查詢或恢復不受DDL語句的影響,Oracle引入了一項技術——Total Recall。
????????Total Recall也叫FLASHBACK數(shù)據(jù)歸檔(FLASHBACK Data Archive,簡稱FDA),用于跟蹤用戶對表中數(shù)據(jù)所做的修改。如圖5-1所示,當用戶執(zhí)行事務時,服務器進程在數(shù)據(jù)庫緩沖區(qū)緩存中將產(chǎn)生臟緩沖區(qū),而且將修改之前的數(shù)據(jù)拷貝到UNDO表空間中。實例中的FBDA后臺進程在一定的時機下將這些被跟蹤的數(shù)據(jù)從UNDO表空間拷貝到FDA中。簡單地說,F(xiàn)DA中的數(shù)據(jù)是這樣產(chǎn)生的:只要用戶修改表中的數(shù)據(jù),修改之前的數(shù)據(jù)將被拷貝到FDA中,保留指定的時間,而且用戶對表中數(shù)據(jù)的每次修改都被記錄在FDA中。也就是說,表中一行數(shù)據(jù)的連續(xù)變化,都將被記錄在FDA中。例如,假設表中有一行數(shù)據(jù)100,在T1時刻,用戶把這行數(shù)據(jù)改為200,在T2時刻把它改為300,在T3時刻把它改為400,此后在沒有對這行數(shù)據(jù)進行過修改,那么表中目前這行數(shù)據(jù)就是400,而過去的100、200和300這樣的歷史數(shù)據(jù)就被記錄在FDA中。此后通過查詢FDA可知,這行數(shù)據(jù)在T1時刻之前是100,在T1和T2時刻之間是200,等等。
????????FDA中的數(shù)據(jù)將被保留指定的時間,這樣的時間遠遠大于UNDO數(shù)據(jù)在UNDO表空間中的保留時間。利用FDA中的數(shù)據(jù),通過FLASHBACK技術可以查詢一個表在保留期內(nèi)任何一個時刻的數(shù)據(jù)。利用FDA中的數(shù)據(jù),通過FLASHBACK技術可以查詢一個表在保留期內(nèi)任何一個時刻的數(shù)據(jù)。也可以把表恢復到保留期內(nèi)任何一個時刻,而且這樣的恢復不會受到表上DDL操作的影響。

????????FDA實際上也是一些表,他位于指定的表空間中。每個FDA都有一個保留期,表中的數(shù)據(jù)保留內(nèi)都存儲在FDA中,一旦超出保留期,F(xiàn)DA中的數(shù)據(jù)將被刪除。在一般情況下,F(xiàn)DA位于單獨創(chuàng)建的一個表空間中。管理員在創(chuàng)建FDA時,需要指定它在表空間中的空間配額,以及數(shù)據(jù)的保留期。不同數(shù)據(jù)如果需要不同的保留期,就要創(chuàng)建多個FDA,并為每個FDA指定不同的保留期。保留期的單位是DAY、MONTH或者YEAR。例如,下面的兩條CREATE語句用于創(chuàng)建一個表空間和一個FDA。
????????下面的DROP語句用于刪除一個FDA:
????????在一般情況下,創(chuàng)建和刪除FDA的任務是由SYS用戶完成的。如果一個普通用戶具有系統(tǒng)權限“FLASHBACK ARCHIVE ADMINISTER”,那么他也可以執(zhí)行這樣的任務。以下幾條語句分別用于為用戶SCOTT指定這樣的權限,以及從這個用戶回收這個權限。
????????當數(shù)據(jù)庫中至少有一個FDA存在時,用戶就可以使用這些FDA來存儲自己的表中的歷史數(shù)據(jù)了。為此,用戶還需要具有使用FDA的權限,這樣的權限是由SYS用戶,或者具有“FLASHBACK ARCHIVE ADMINISTER”系統(tǒng)權限的用戶指定的。例如,下面的語句用于為用戶SMITH和KING指定對某個FDA的使用權限:
????????下面的語句用于從用戶SMITH和KING回收對某個FDA的使用權限:
????????當用戶獲得了對某個FDA的使用權限之后,就可以指定自己的表來使用這個FDA的空間了。例如:
????????此后,DEPT表中數(shù)據(jù)的任何變化都會被記錄在這個FDA中。如果數(shù)據(jù)被多次修改,那么每次修改都會被記錄在FDA中。如果用戶要查詢一個表在過去某個時刻的數(shù)據(jù),或者把表恢復到過去某個時刻,那么這樣的操作可以達到數(shù)據(jù)在FDA中的保留期內(nèi)的任何一個時刻,而且這樣的操作不會受到過去在表上執(zhí)行的DDL的影響。也就是說,用戶在表上的下列操作都可以引用FDA中的數(shù)據(jù):
????????如果對一個表取消了跟蹤,那么用戶以后在對這個表執(zhí)行上述操作時,只能依靠UNDO表空間了。例如,下面的ALTER語句執(zhí)行成功之后,表DEPT不再使用任何FDA。
????????管理員在一個數(shù)據(jù)庫中可以創(chuàng)建多個FDA,它們可以位于相同或者不同的表空間中,管理員可以選擇其中一個作為數(shù)據(jù)庫默認的FDA。例如,下列語句通過“DEFAULT”關鍵字將創(chuàng)建的FDA指定為當前數(shù)據(jù)庫默認的FDA。
????????如果在創(chuàng)建FDA時沒有指定“DEFAULT”關鍵字,那么在FDA創(chuàng)建成功之后,管理員可以通過下面的語句將它指定為數(shù)據(jù)庫默認的FDA;
????????指定默認FDA的好處在于,當一個用戶在使用FDA時,不用關心數(shù)據(jù)庫到底有哪些FDA,只要使用默認FDA就可以了。例如,用戶可以通過下面的方式指定自己的表使用默認的FDA:
????????當用戶指定自己的表使用某個FDA之后,只要表中的數(shù)據(jù)被修改,之前的數(shù)據(jù)就會被拷貝到指定的FDA中。根據(jù)FDA保留期的規(guī)定,數(shù)據(jù)將在FDA中保留一段時間,到達保留期的數(shù)據(jù)將從FDA中被刪除。隨著用戶對表的訪問的進行,新的數(shù)據(jù)不斷進入FDA,超出保留期的數(shù)據(jù)不斷地從FDA中被刪除。
????????通過上面的描述可以知道,任何一個FDA都位于一個或多個確定的表空間中,它們需要使用表空間的存儲。一般來說,F(xiàn)DA的保留期越長,用戶在表上執(zhí)行的DML語句越多,F(xiàn)DA對存儲空間的需求越大。一旦FDA在表空間上的存儲配額用完,數(shù)據(jù)將無法被寫入這個FDA中,隨之帶來的影響是,用戶在表上的事務將被阻塞。
????????無論是FDA的保留期,還是他在表空間上的存儲配額,都是可以改動的。例如,下面的SQL語句用于修改FDA在表空間上的空間配額(可以增加,也可以減少);
????????下面的SQL語句用于在另外一個表空間上為FDA指定空間配額:
????????下面的SQL語句用于修改FDA的保留期(可以延長,也可以縮短):
????????FDA中的數(shù)據(jù)將根據(jù)保留期的規(guī)定被自動刪除。另外,通過下面的SQL語句,可以把FDA中某個時間點之前產(chǎn)生的數(shù)據(jù)手工刪除。
????????需要強調(diào)的是,對FDA保留期的修改、空間配額的修改,以及數(shù)據(jù)的手工刪除,都是以SYS用戶,或者具有“FLASHBACK ARCHIVE ADMINISTER”系統(tǒng)權限的用戶身份完成的。
5.6數(shù)據(jù)庫的FLASHBACK
????????利用FLASHBACK技術,還可以把整個數(shù)據(jù)庫恢復到過去某個時刻,這種恢復不是利用數(shù)據(jù)庫所做的備份,而是利用FLASHBACK日志。數(shù)據(jù)庫的FLASHBACK主要用于取消最近一段時間內(nèi)用戶對數(shù)據(jù)庫中的數(shù)據(jù)所進行的錯誤修改,或者恢復一個被誤刪除的表,或者恢復一個表被TRUNCATE命令刪除的數(shù)據(jù)。
????????為了對數(shù)據(jù)庫進行FLASHBACK,數(shù)據(jù)庫需要滿足以下三個條件:
數(shù)據(jù)庫的日志模式必須是歸檔模式
必須配置了快速恢復區(qū)
開啟了FLASHBACK日志
????????其中前兩個條件在這里不再贅述,想必讀者已經(jīng)熟練掌握了兩種結構的配置方法。FLASHBACK日志是一種特殊的文件,用于跟蹤用戶對數(shù)據(jù)庫中數(shù)據(jù)所做得修改,這種文件位于快速恢復區(qū)中,而且不能位于其他存儲路徑中。
????????開啟數(shù)據(jù)庫的FLASHBACK日志的方法是,在數(shù)據(jù)庫服務器處于MOUNT或者OPEN狀態(tài)時,在SQL*Plus中執(zhí)行下面的命令:
????????當這條命令執(zhí)行成功時,在數(shù)據(jù)庫的快速恢復區(qū)中將產(chǎn)生FLASHBACK日志文件。關閉數(shù)據(jù)庫的FLASHBACK日志的方法是執(zhí)行下面的命令:
????????如果希望了解數(shù)據(jù)庫是否開啟了FLASHBACK日志,可以執(zhí)行下面的SQL語句,查詢的結果是YES或NO。
????????FLASHBACK日志用于跟蹤用戶對表中數(shù)據(jù)的修改。當啟用FLASHBACK日志時,在數(shù)據(jù)庫的快速恢復區(qū)中將產(chǎn)生FLASHBACK日志文件。從這一時刻起,數(shù)據(jù)庫中數(shù)據(jù)的變化將被記錄在這些日志文件中。當關閉FLASHBACK日志,這些日志文件將被自動刪除。
????????FLASHBACK日志產(chǎn)生的過程如圖5-2所示。當數(shù)據(jù)庫中有事務發(fā)生是,在SGA的重做日志緩存區(qū)中將產(chǎn)生重做日志,然后在數(shù)據(jù)庫緩沖區(qū)緩存中將產(chǎn)生臟緩沖區(qū)。當事務修改數(shù)據(jù)庫高速緩存中的緩沖區(qū)時,這個緩沖區(qū)中的內(nèi)容將首先被拷貝到FLASHBACK緩沖區(qū)中。這樣在數(shù)據(jù)庫緩沖區(qū)緩存中將保留事務修改之后的數(shù)據(jù),而在FLASHBACK緩沖區(qū)中則保留修改之前的數(shù)據(jù)。FLASHBACK緩沖區(qū)是共享池的一部分,它的大小可以通過查詢動態(tài)性能視圖V$SGASTAT獲得。實例中的RVWR后臺進程將把FLASHBACK緩沖區(qū)中的數(shù)據(jù)寫入FLASHBACK日志文件。通過這樣的方法,就可以把數(shù)據(jù)庫中任何一行數(shù)據(jù)的連續(xù)變化保存在FLASHBACK日志文件中,利用數(shù)據(jù)庫的FLASHBACK,就能夠得到一行數(shù)據(jù)在過去某個時刻的樣子。

????????由此可見,在FLASHBACK日志中記錄的是數(shù)據(jù)塊被修改之前的內(nèi)容。當一個數(shù)據(jù)塊中的數(shù)據(jù)不斷地被修改時,在FLASHBACK日志中分別記錄這個數(shù)據(jù)塊在過去不同時刻的內(nèi)容。如果希望把數(shù)據(jù)庫恢復到過去某個時刻,那么那個時刻的數(shù)據(jù)塊將從FLASHBACK日志被拷貝到原來的數(shù)據(jù)文件中。當然了,如果一個數(shù)據(jù)塊沒有被修改過,那么這個數(shù)據(jù)塊在FLASHBACK日志中就不存在,也不需要進行恢復。數(shù)據(jù)庫可以被恢復到過去的哪個時刻,取決于初始化參數(shù)DB_FLASHBACK_RETENTION_TARGET的設置。這個初始化參數(shù)的值以分鐘為單位,用于指定數(shù)據(jù)塊在FLASHBACK日志中保留的時間,超出保留期的數(shù)據(jù)塊將從FLASHBACK日志中刪除。這個參數(shù)的默認值是1440,即24小時。也就是說,利用FLASHBACK技術,默認可以把數(shù)據(jù)庫從目前時刻恢復到過去的最近一天內(nèi)的任何一個時刻。如果希望把數(shù)據(jù)庫能夠恢復到過去更遠的某個時刻,那么需要把這個初始化參數(shù)的值設置的足夠大。例如,下面的SQL語句用于把FLASHBACK日志的保留時間設置為3天:
????????如果數(shù)據(jù)庫真的出現(xiàn)了需要恢復到過去某個時刻的情況,管理員最關心的情況往往是:數(shù)據(jù)庫最遠能夠恢復到過去哪個時刻,或者哪個SCN。通過執(zhí)行下面的查詢語句,管理員可以知道數(shù)據(jù)庫能夠恢復到哪個SCN,以及哪個時間點。
????????數(shù)據(jù)庫的FLASHBACK需要在數(shù)據(jù)庫服務器處于MOUNT狀態(tài)時進行。例如:
????????數(shù)據(jù)庫的這種恢復往往不是一次就能完成的。在對數(shù)據(jù)庫進行一次FLASHBACK恢復之后,可以把數(shù)據(jù)庫以只讀方式打開,然后查詢數(shù)據(jù)庫中的數(shù)據(jù),確定數(shù)據(jù)庫的恢復是否打到目標,如果沒有,再把數(shù)據(jù)庫服務器切換到MOUNT狀態(tài),再次執(zhí)行FLASHBACK命令,把數(shù)據(jù)庫恢復到過去更遠的一個時刻,如此反復,直到數(shù)據(jù)庫的恢復達到管理員設想的目標。以只讀方式打開數(shù)據(jù)庫的命令是:
????????如此經(jīng)過多次FLASHBACK,如果確定數(shù)據(jù)庫的恢復已經(jīng)達到目標,那么吧數(shù)據(jù)庫服務器切換到MOUNT狀態(tài),然后以下面的方式打開數(shù)據(jù)庫:
????????需要注意的是,在下列情況下,數(shù)據(jù)庫的FLASHBACK會遇到問題:
當控制文件被恢復或重新創(chuàng)建時
當表空間或數(shù)據(jù)文件被刪除時
當數(shù)據(jù)文件的大小被減小時
????????當控制文件被恢復或重新創(chuàng)建時,F(xiàn)LASHBACK日志被關閉。如果某個表空間或者數(shù)據(jù)文件被刪除,那么在對數(shù)據(jù)庫進行FLASHBACK之后,雖然從數(shù)據(jù)字典視圖中能夠查詢到這些表空間或數(shù)據(jù)文件的信息,但是數(shù)據(jù)文件并不真正存在,也就是說,利用FLASHBACK技術并不能重新創(chuàng)建被刪除的數(shù)據(jù)文件。如果數(shù)據(jù)庫中的某個數(shù)據(jù)文件被減小大小,則不能利用FLASHBACK吧數(shù)據(jù)庫恢復到此前的時刻。