閃回技術是Oracle強大數據庫備份恢復機制的一部分,在數據庫發生邏輯錯誤的時候,閃回技術能提供快速且最小損失的恢復(多數閃回功能都能在數據庫聯機狀態下完成)。須要注意的是,閃回技術旨在快速恢復邏輯錯誤,對於物理損壞或是介質丟失的錯誤,閃回技術就回天乏術了,仍是得藉助於Oracle一些高級的備份恢復工具如RAMN去完成(這纔是Oracle強大備份恢復機制的精髓所在啊)html
在講閃回技術前,須要先了解Oracle中一個邏輯結構--撤銷段。由於大部分閃回技術都須要依賴撤銷段中的撤銷數據。撤銷數據是反轉DML語句結果所需的信息,只要某個事務修改了數據,那麼更新前的原有數據就會被寫入一個撤銷段。(事務回滾也會用到撤銷段中的數據)。事務啓動時,Oracle 會爲其分配一個撤銷段,事務和撤銷段存在多對一的關係,即一個事務只能對應一個撤銷段,多個事務能夠共享一個撤銷段(不過在數據庫正常運行時通常不會發生這種狀況)。數據庫
Oracle提供了四種可供使用的閃回技術(閃回查詢,閃回刪除,閃迴歸檔,閃回數據庫),每種都有不一樣的底層體系結構支撐,但其實這四種不一樣的閃回技術部分功能是有重疊的,使用時也須要根據實際場景合理選擇最合適的閃回功能。緩存
閃回查詢(Flashback Query)session
a.基本閃回查詢工具
功能描述:能夠查詢過去某個時間段的數據庫狀態。post
工做原理:Oracle 會提取所須要的撤銷數據(前提是撤銷是可用的,即撤銷數據還沒被覆蓋)進行回滾,但這種回滾是臨時的,僅針對當前session可見。大數據
SQL> select * from dept as of timestamp to_timestamp('2016-09-10 11:00:00','yyyy-mm-dd hh24:mi:ss');
b.閃回表url
功能描述:可將某個表回退到過去某個時間點spa
工做原理:一樣,Oracle會先去查詢撤銷段,提取過去某個時間點以後的全部變動,構造反轉這些變動的SQL語句進行回退,閃回操做是一個單獨的事務,因此若因爲撤銷數據過時之類的緣由致使沒法閃回,整個操做會回滾,不會存在不一致的狀態。日誌
步驟:
1.啓用表閃回首先要在表上支持行移動(在數據字典中設置標識來標識該操做可能會改變行ID,即同一條數據閃回成功後主鍵都同樣,但行ID其實已經發生變化了)
SQL> alter table emp enable row movement;
2.閃回表操做
SQL> flashback table dept to timestamp to_timestamp('2016-09-10 11:00:00','yyyy-mm-dd hh24:mi:ss');
閃回表可能會失敗,有可能有如下幾種狀況:
違反了數據庫約束,好比用戶不當心刪除了子表中的數據,如今想利用閃回表技術進行回退,剛好在這中間,父表中與該數據對應的那條記錄也被刪除了,在這種狀況下,因爲違反了外鍵約束,致使閃回表操做失敗了;
撤銷數據失效,好比用於支撐閃回操做的撤銷數據被覆蓋了,這種狀況閃回表操做天然會失敗;
閃回不能跨越DDL,即在閃回點和當前點之間,表結構有過變動,這種狀況閃回操做也會失敗。
注意:上述閃回功能都是基於撤銷數據的,而撤銷數據是會被重寫的(Expired會被重寫,Active不會被重寫),因此,在須要使用這幾種閃回功能去恢復數據的時候(確切地說,是須要使用基於撤銷數據的閃回功能時),最短期發現錯誤,第一時間執行閃回操做,才能最大程度地保證閃回功能的成功。
功能描述:閃回刪除能夠輕鬆將一個已經被Drop的表還原回來。相應的索引,數據庫約束也會被還原(除了外鍵約束)
原理描述:Drop命令實際上是Rename命令,早期的Oracle版本(10g以前),閃回刪除意味着從數據字典中刪除了該表的全部引用,雖然表中數據可能還存在,但已成了孤魂野鬼,無法進行恢復了,10g版本以後,Drop命令則僅僅是一個Rename操做,因此恢復就很容易了。
閃回刪除操做執行命令很簡單
SQL> flashback table emp to before
若是要還原的表名在當前系統中已經被佔用,也能夠在閃回刪除的時候對錶重命名
SQL> flashback table emp to before drop rename to emp_new
也能夠經過回收站查看當前用戶那些表被刪除了,每一個用戶都有一個回收站,這個回收站是個邏輯結構,它不是一塊獨立的存儲空間,它存在在當前表空間內,因此若是有別的操做須要空間,好比如今須要建立一張表,沒有足夠空間可用,回收站中的數據就會被清理,這也是致使閃回刪除失敗的緣由。
SQL> SHOW RECYCLEBIN;
完全刪除表,閃回刪除也無能爲力
SQL> DROP TABLE EMP PURGE;
清空回收站
SQL> PURGE RECYCLEBIN;
注意:閃回刪除只針對Drop命令,注意區分truncate操做和drop操做,truncate稱爲表截斷,會清空表中數據(調節Oracle高水位線實現),表結構不受影響,速度很快,弊端是此過程不會產生任何撤銷數據或是重作日誌,若是誤刪,恢復異常麻煩,要慎重使用。而Drop則會刪除數據+表結構,閃回刪除僅針對Drop操做。
功能描述:閃回數據歸檔可以使表具備回退到過去任什麼時候間點的能力,前面提到的閃回查詢,閃回表都會受限於撤銷數據是否失效,若是撤銷數據被覆蓋重寫了,閃回操做天然會失敗,閃回刪除則受限於表空間是否有足夠可用空間,而閃回數據歸檔,則沒有這些限制。
建立閃迴歸檔
1.建立一個用戶閃回數據歸檔的表空間,固然,也可使用已經存在的表空間。
SQL> create tablespace test_tb datafile 'test.dbf' size 20m;
2.建立一個保留時間爲2年的閃迴歸檔
SQL> create flashback archive test_fa tablespace test_tb retention 2 year;
爲scott用戶下的emp表啓用閃迴歸檔
1.賦予用戶歸檔的權限
SQL> grant flashback archive on test_fa to scott;
2.鏈接用戶
SQL> conn scott/tiger;
3.爲emp表啓用閃迴歸檔
SQL> alter table emp flashback archive test_fa;
至此,emp表就擁有了能夠查詢或回退到過去2年任意時間點的能力!
功能描述:閃回數據庫可將整個數據庫回退到過去某個時間點,閃回表是某張表的時空穿梭,閃回數據庫則是整個數據庫的時空穿梭。固然,閃回點以後的全部工做就丟失了,其實就至關於數據庫的不完整恢復,因此只能以resetlogs模式打開數據庫。閃回數據庫會形成停機時間,固然相比於傳統備份恢復機制,恢復過程會快不少。
工做原理:閃回數據庫不使用撤銷數據,使用另一種機制來保留回退所須要的恢復數據,當啓用閃回數據庫,發生變化的數據塊會不斷從數據庫緩衝區緩存中複製到閃回緩衝區,而後,稱爲恢復寫入器(Recovery Writer)的後臺進程會將這些數據刷新到磁盤中的閃回日誌文件中。閃回的過程,則是一個 提取閃回日誌-->將塊映像複製回數據文件 的過程。
配置閃回數據庫(閃回數據庫要求數據庫爲歸檔模式)
1.指定閃回恢復區,也就是存放閃回日誌的位置,但閃回恢復區不只僅是爲了存放閃回日誌,Oracle的不少備份恢復技術都用到這個區域,好比控制文件的自動備份等都會存放到此區域。
SQL> alter system set db_recovery_file_dest ='/flash_recovery_area';
2.指定恢復區大小
SQL> alter system set db_recovery_file_dest_size=4G;
3.指定閃回日誌保留時間爲2小時,即經過閃回操做,能夠將數據庫回退到前兩小時內的任意時間點
SQL> alter system set db_flashback_retention_target=120;
4.有序關閉數據庫--mount模式下啓用閃回數據庫--打開數據庫
SQL> shutdown immediate;
SQL> startup mount; SQL> alter database flashback on; SQL> alter database open;
至此,閃回數據庫配置完成!
使用閃回數據庫功能
SQL> shutdown immediate; SQL> startup mount; SQL> flashback database to timestamp sysdate-60/1440; SQL> alter database open resetlogs;
本文列舉了四類閃回技術,其中,閃回查詢,包括基本閃回查詢,閃回表等技術都依賴於撤銷數據(還有一類閃回技術爲閃回事務,能夠對指定事務進行閃回操做,原理相似,藉助於撤銷數據來構建用於反轉事務的SQL語句),依賴於撤銷數據,則天然受限於撤銷數據的保留時間,可能會因爲撤銷數據被覆寫而致使閃回失敗。閃回刪除,則是因爲10g版本後對錶的刪除僅表現爲一個rename操做,引入回收站的概念,但此回收站僅是當前表空間的一塊邏輯劃分,因此會受限於當前表空間的可用空間的限制;閃迴歸檔可提供查詢或回退到過去任意時間點的功能,閃回數據庫則是一中更極端的數據庫恢復功能,至關於不完整恢復,依賴於閃回日誌。
做者: dreamcatcher-cx
出處: <http://www.cnblogs.com/chengxiao/>
本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在頁面明顯位置給出原文連接。