標籤:href com hba 損壞 沒有 外鍵約束 for 重新整理 自動
1. 概述
閃回技術是oralce強大備份機制的一部分,在資料庫發生邏輯錯誤的時候,閃回技術能提供快速且小損失的恢複(多數閃回功能都能在資料庫的聯機狀態下完成)。需要注意的是,閃回技術旨在快速恢複邏輯錯誤,對於物理損壞或者是介質丟失的錯誤,閃回技術就回天回天乏術了,還得藉助於Oracle的一些進階的備份恢複工具如rman去完成。
2. 撤銷段(undo segment)
撤銷段,oralce中的一個邏輯結構。大部分閃回資料都要依賴撤銷段中的撤銷資料。撤銷語句是反轉DML語句所需要的資訊,只要某個語句修改了資料,那麼更新前的語句就會被寫入一個撤銷段。(交易回復也需要用到撤銷段中的資料),事務啟動時,資料庫會為其分配一個撤銷段,事務和撤銷段存在一對多的關係,即一個事務只能對應一個撤銷段,多個事務可以共用一個撤銷段(資料庫正常運行時一般不會發生這種情況)。
3. 閃回技術
Oracle提供了四種可供使用的閃回技術:閃回查詢、閃回刪除、閃迴歸檔、閃回資料庫。每種都有不同的底層體繫結構支撐。旦其中這四種不同的閃回技術功能是有重疊的,使用時也要根據實際情境選擇最合適的閃回功能。
測試資料準備
insert into student (stu_id, stu_name, sex, credit) values (‘0001‘, ‘大王‘, ‘2‘, ‘83‘);
insert into student (stu_id, stu_name, sex, credit) values (‘0002‘, ‘劉一‘, ‘1‘, ‘85‘);
commit;
3.1 閃回查詢
? 閃回基本查詢
功能描述:可以查詢過去某個時間段的資料庫狀態。
工作原理:oralce會提取所需要的撤銷資料(前提是撤銷是可用的,即撤銷資料可以被覆蓋)進行復原,但這種復原是臨時的,僅針對當前的session可見。
select * from student as of timestamp to_timestamp(‘2016-08-31 13:37:00‘,‘yyyy-mm-dd hh24:mi:ss‘);
? 閃回表
功能描述:將某個表回退到過去的某個時間點。
工作原理:同樣,Oracle會先去查詢撤銷段,提取過去某個時間點的所有變更。構造反轉這些變更的SQL語句進行回退。閃回操作是一個單獨的事務,所以由於撤銷事務到期之類的原因導致無法閃回,整個操作會復原,不會存在操作不一致的情況。
① 啟用表閃回首先要在表上支援行移動(在資料字典中設定標識來標識此操作可能會改變行ID,即同一條資料閃回後主鍵ID都一樣,但行ID已經發生變化了)
alter table student enable row movement;
② 閃回表操作
flashback table student to timestamp to_timestamp(‘2018-08-31 11:00:00‘,‘yyyy-mm-dd hh24:mi:ss‘);
如果沒有①操作,會報錯
閃回表可能會失敗,有可能是以下幾種情況:
? 違反了資料庫約束,比如使用者不小心刪除了子表中的資料,現在想利用閃回表技術進行回退,恰好這中間,父表中與改記錄對應的那條記錄也被刪除了,由於違反了外鍵約束,導致閃回表失敗;
? 撤銷資料失效,用於支撐閃回操作的撤銷資料被覆蓋了,導致閃回表操作失敗;
? 閃回不能跨越DDL,即在閃回點和當前點之間,表結構有過變更,閃回操作也會失敗。
3.2 閃回刪除
功能描述:閃回刪除可以輕鬆的將一個已經被drop掉的表還原回來。相應的索引,資料庫約束也會被還原(除了外鍵約束)
工作原理:drop命令其實是rename命令,早期的Oracle版本,閃回刪除意味著從資料字典中刪除了該表的所有引用,雖然表中的資料可能還存在,但是已經成了孤魂野鬼,沒有辦法進行恢複了,10G版本以後,drop命令僅僅是一個rename操作,所以恢複就很容易了,
閃回刪除操作命令很簡單
flashback table student to before;
如果要還原的表名在當前系統中已被佔用,也可以在閃回刪除的時候對錶進行重新命名
flashback table student to before drop rename to student_new;
也可以通過資源回收筒查看目前使用者的哪些表被刪除了,每個使用者都有一個資源回收筒,這個資源回收筒是個邏輯結構,它不是一塊獨立的儲存空間,他存在於當前表中間內,如果有別的操作需要空間,比如現在需要建立一張表,沒有足夠空間可用,那資源回收筒中的資料就會被清理,這也是導致閃回失敗的原因
show recyclebin;--pl/sql執行此命令不成功
徹底刪除表,閃回刪除也無能無力
drop table student purge;
清空資源回收筒
purge recyclebin;
閃回刪除只針對drop命令,truncate操作為表截斷,會清空表中資料(調節oralce高水位線實現),表結構不受影響,速度很快,弊端是此過程不會產生任何撤銷資料或是重做日誌,如果誤刪,恢複異常麻煩。而drop操作則會刪除資料+表結構,閃回刪除僅針對drop操作。
3.3 閃回資料歸檔(flashback dada archive)
功能描述:閃回資料歸檔可使表具有回退到過去任何時間點的能力,前面提到的閃回查詢,閃回表都會受限於撤銷資料是否失效,如果撤銷資料被覆蓋重寫了,閃回操作自然會失敗,閃回刪除則受限於是否有足夠可用空間,而閃回資料歸檔,則沒有這些限制。
建立閃迴歸檔
① 建立一個使用者閃回資料歸檔的資料表空間(也可以使用已存在的資料表空間)
create tablespace test_space datafile ‘test_space.dbf‘ size 20m;
② 建立一個儲存期為2年的閃迴歸檔
create flashback archive test_fa tablespace test_space retention 2 year;
③ 賦予使用者歸檔的許可權
grant flashback archive on test_fa to kdjl;
④ 為student表啟用閃迴歸檔
alter table student flashback archive test_fa;
至此,student表接擁有了可以查詢或者可以回退到過去兩年任意時間點的能力。
3.4 閃回資料庫
功能描述:閃回資料庫可以將整個資料庫回退到過去的某個時間點,閃回表是某張表的時空穿梭,閃回資料庫則是整個資料庫的時空穿梭。當然,閃回點之後的所有工作就丟失了,其實就相當於資料庫的不完整恢複。所以只能以resetlogs模式開啟資料庫。閃回資料庫會造成停機時間,但是相比於傳統的備份恢複機制,恢複過程會快很多。
工作原理:閃回資料庫不使用撤銷資料,使用另外一種機制來保留回退所需要的恢複資料,當啟用閃回資料庫,發生變化的資料區塊會不斷的從資料庫緩衝區緩衝中複製到閃回緩衝區,然後,稱為恢複寫入器(recovery writer)的後台進程會將這些資料重新整理到磁碟中的閃回記錄檔中。閃回的過程,則是一個提取閃回日誌->將塊印象複製回資料檔案的過程。
配置閃回資料庫(閃回資料庫要求資料庫為歸檔模式)
① 指定閃回恢複區,也就是存放閃回日誌的位置,但閃回恢複區不僅僅是為了存放閃回日誌,oralce的很多備份恢複技術都用到這個地區,比如控制檔案的自動備份等都會存放到此地區。
alter system set db_recovery_file_dest =‘/flash_recovery_area‘;
② 指定恢複區大小
alter system set db_recovery_file_dest_size=4G;
③ 指定閃回日誌保留時間為2小時,即通過閃回操作,可以將資料庫回退到2個小時內的任意時間點,
alter system set db_flashback_retention_target=120;
④ 有序關閉資料庫,mount模式下啟用閃回資料庫,開啟資料庫
shutdown immediate;
startup mount;
alter database flashback on;
alter database open;
⑤ 使用閃回資料庫
shutdown immediate;
startup mount;
flashback database to timestamp sysdate-60/1440;
alter database open resetlogs;
4. 總結
本文列舉了四類閃回技術,其中閃回查詢,包括基本閃回查詢,閃回表等技術都依賴於撤銷資料(還有一類技術為閃回事務,可以對事務進行閃回操作,原理類似,藉助於撤銷資料來構建用於反轉事務的SQL語句),依賴於撤銷資料,則依賴於撤銷資料的保留時間,可能由於撤銷事務被覆蓋而導致閃回失敗。閃回刪除,則是由於10G版本後對錶的刪除僅表現為一個rename的操作,引入資源回收筒的概念,但此資源回收筒僅是當前資料表空間的邏輯劃分,所以受限於當前可用資料表空間的限制。閃迴歸檔可提供查詢或者回退到過去任意時間點的功能。閃回資料庫則是一種更極端的資料恢複功能,相當於不完整恢複,依賴於閃回日誌。
閃回技術詳解:https://www.cnblogs.com/chengxiao/p/5860823.html
ORACLE 閃回