oracle 中的閃回

2022-09-20 00:09:15 字數 4656 閱讀 1636

概述:

閃回技術是oracle強大資料庫備份恢復機制的一部分,在資料庫發生邏輯錯誤的時候,閃回技術能提供快速且最小損失的恢復(多數閃回功能都能在資料庫聯機狀態下完成)。需要注意的是,閃回技術旨在快速恢復邏輯錯誤,對於物理損壞或是介質丟失的錯誤,閃回技術就回天乏術了,還是得借助於oracle一些高階的備份恢復工具如ramn去完成(這才是oracle強大備份恢復機制的精髓所在啊)

撤銷段(undo segment)

在講閃回技術前,需要先了解oracle中乙個邏輯結構--撤銷段。因為大部分閃回技術都需要依賴撤銷段中的撤銷資料。撤銷資料是反轉dml語句結果所需的資訊,只要某個事務修改了資料,那麼更新前的原有資料就會被寫入乙個撤銷段。(事務回滾也會用到撤銷段中的資料)。事務啟動時,oracle 會為其分配乙個撤銷段,事務和撤銷段存在多對一的關係,即乙個事務只能對應乙個撤銷段,多個事務可以共享乙個撤銷段(不過在資料庫正常執行時一般不會發生這種情況)。

閃回技術

oracle提供了四種可供使用的閃回技術(閃回查詢,閃回刪除,閃回歸檔,閃回資料庫),每種都有不同的底層體系結構支撐,但其實這四種不同的閃回技術部分功能是有重疊的,使用時也需要根據實際場景合理選擇最合適的閃回功能。

閃回查詢(flashback query)

a.基本閃回查詢

功能描述:可以查詢過去某個時間段的資料庫狀態。

工作原理:oracle 會提取所需要的撤銷資料(前提是撤銷是可用的,即撤銷資料還沒被覆蓋)進行回滾,但這種回滾是臨時的,僅針對當前session可見。

sql> select * from dept as of timestamp to_timestamp('2016-09-10 11:00:00','yyyy-mm-dd hh24:mi:ss');

b.閃回表

功能描述:可將某個表回退到過去某個時間點

工作原理:同樣,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不會被重寫),所以,在需要使用這幾種閃回功能去恢復資料的時候(確切地說,是需要使用基於撤銷資料的閃回功能時),最短時間發現錯誤,第一時間執行閃回操作,才能最大程度地保證閃回功能的成功。

閃回刪除(flashback drop)

功能描述:閃回刪除可以輕鬆將乙個已經被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操作。

閃回資料歸檔(flashback data archive )

功能描述:閃回資料歸檔可使表具有回退到過去任何時間點的能力,前面提到的閃回查詢,閃回表都會受限於撤銷資料是否失效,如果撤銷資料被覆蓋重寫了,閃回操作自然會失敗,閃回刪除則受限於表空間是否有足夠可用空間,而閃回資料歸檔,則沒有這些限制。

建立閃回歸檔

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年任意時間點的能力!

閃回資料庫(flashback database)

功能描述:閃回資料庫可將整個資料庫回退到過去某個時間點,閃回表是某張表的時空穿梭,閃回資料庫則是整個資料庫的時空穿梭。當然,閃回點之後的所有工作就丟失了,其實就相當於資料庫的不完整恢復,所以只能以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操作,引入**站的概念,但此**站僅是當前表空間的一塊邏輯劃分,所以會受限於當前表空間的可用空間的限制;閃回歸檔可提供查詢或回退到過去任意時間點的功能,閃回資料庫則是一中更極端的資料庫恢復功能,相當於不完整恢復,依賴於閃回日誌。 

oracle 資料閃回

select from scott.dept insert into scott.dept values 50,錯誤資料 china select from scott.dept as of timestamp to timestamp 2011 12 09 10 00 00 yyyy mm dd ...

oracle閃回技術

1,閃回資料庫到之前某時間點 在安裝時需要開放閃回功能 不支援表空間刪除 select name from v database 看是否開啟閃回功能 select flashback on,name from v database select name from v bgprocess where...

oracle閃回技術

查詢某一時刻資料庫中資料狀態語句 select from abc as of timestamp to timestamp 2015 08 24 10 31 00 yyyy mm dd hh24 mi ss 閃回dml語句 flashback table abc to timestamp to ti...