閃回技術(shù)是Oracle強大數(shù)據(jù)庫備份恢復(fù)機制的一部分,在數(shù)據(jù)庫發(fā)生邏輯錯誤的時候,閃回技術(shù)能提供快速且最小損失的恢復(fù)(多數(shù)閃回功能都能在數(shù)據(jù)庫聯(lián)機狀態(tài)下完成)。需要注意的是,閃回技術(shù)旨在快速恢復(fù)邏輯錯誤,對于物理損壞或是介質(zhì)丟失的錯誤,閃回技術(shù)就回天乏術(shù)了,還是得借助于Oracle一些高級的備份恢復(fù)工具如RAMN去完成(這才是Oracle強大備份恢復(fù)機制的精髓所在?。?/p>
創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站建設(shè)、網(wǎng)站制作、貴州網(wǎng)絡(luò)推廣、小程序定制開發(fā)、貴州網(wǎng)絡(luò)營銷、貴州企業(yè)策劃、貴州品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們大的嘉獎;創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供貴州建站搭建服務(wù),24小時服務(wù)熱線:18982081108,官方網(wǎng)址:www.cdcxhl.com在講閃回技術(shù)前,需要先了解Oracle中一個邏輯結(jié)構(gòu)--撤銷段。因為大部分閃回技術(shù)都需要依賴撤銷段中的撤銷數(shù)據(jù)。撤銷數(shù)據(jù)是反轉(zhuǎn)DML語句結(jié)果所需的信息,只要某個事務(wù)修改了數(shù)據(jù),那么更新前的原有數(shù)據(jù)就會被寫入一個撤銷段。(事務(wù)回滾也會用到撤銷段中的數(shù)據(jù))。事務(wù)啟動時,Oracle 會為其分配一個撤銷段,事務(wù)和撤銷段存在多對一的關(guān)系,即一個事務(wù)只能對應(yīng)一個撤銷段,多個事務(wù)可以共享一個撤銷段(不過在數(shù)據(jù)庫正常運行時一般不會發(fā)生這種情況)。
Oracle提供了四種可供使用的閃回技術(shù)(閃回查詢,閃回刪除,閃回歸檔,閃回數(shù)據(jù)庫),每種都有不同的底層體系結(jié)構(gòu)支撐,但其實這四種不同的閃回技術(shù)部分功能是有重疊的,使用時也需要根據(jù)實際場景合理選擇最合適的閃回功能。
閃回查詢(FlashbackQuery)
a.基本閃回查詢
功能描述:可以查詢過去某個時間段的數(shù)據(jù)庫狀態(tài)。
工作原理:Oracle 會提取所需要的撤銷數(shù)據(jù)(前提是撤銷是可用的,即撤銷數(shù)據(jù)還沒被覆蓋)進行回滾,但這種回滾是臨時的,僅針對當(dāng)前session可見。
SQL> select * from dept as of timestamp to_timestamp('2016-09-10 11:00:00','yyyy-mm-dd hh24:mi:ss');
b.閃回表
功能描述:可將某個表回退到過去某個時間點
工作原理:同樣,Oracle會先去查詢撤銷段,提取過去某個時間點之后的所有變更,構(gòu)造反轉(zhuǎn)這些變更的SQL語句進行回退,閃回操作是一個單獨的事務(wù),所以若由于撤銷數(shù)據(jù)過期之類的原因?qū)е聼o法閃回,整個操作會回滾,不會存在不一致的狀態(tài)。
步驟:
1.啟用表閃回首先要在表上支持行移動(在數(shù)據(jù)字典中設(shè)置標(biāo)識來標(biāo)識該操作可能會改變行ID,即同一條數(shù)據(jù)閃回成功后主鍵都一樣,但行ID其實已經(jīng)發(fā)生變化了)
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');
閃回表可能會失敗,有可能有以下幾種情況:
違反了數(shù)據(jù)庫約束,比如用戶不小心刪除了子表中的數(shù)據(jù),現(xiàn)在想利用閃回表技術(shù)進行回退,恰好在這中間,父表中與該數(shù)據(jù)對應(yīng)的那條記錄也被刪除了,在這種情況下,由于違反了外鍵約束,導(dǎo)致閃回表操作失敗了;
撤銷數(shù)據(jù)失效,比如用于支撐閃回操作的撤銷數(shù)據(jù)被覆蓋了,這種情況閃回表操作自然會失??;
閃回不能跨越DDL,即在閃回點和當(dāng)前點之間,表結(jié)構(gòu)有過變更,這種情況閃回操作也會失敗。
注意:上述閃回功能都是基于撤銷數(shù)據(jù)的,而撤銷數(shù)據(jù)是會被重寫的(Expired會被重寫,Active不會被重寫),所以,在需要使用這幾種閃回功能去恢復(fù)數(shù)據(jù)的時候(確切地說,是需要使用基于撤銷數(shù)據(jù)的閃回功能時),最短時間發(fā)現(xiàn)錯誤,第一時間執(zhí)行閃回操作,才能大程度地保證閃回功能的成功。
功能描述:閃回刪除可以輕松將一個已經(jīng)被Drop的表還原回來。相應(yīng)的索引,數(shù)據(jù)庫約束也會被還原(除了外鍵約束)
原理描述:Drop命令其實是Rename命令,早期的Oracle版本(10g之前),閃回刪除意味著從數(shù)據(jù)字典中刪除了該表的所有引用,雖然表中數(shù)據(jù)可能還存在,但已成了孤魂野鬼,沒法進行恢復(fù)了,10g版本之后,Drop命令則僅僅是一個Rename操作,所以恢復(fù)就很容易了。
閃回刪除操作執(zhí)行命令很簡單
SQL> flashback table emp to before
如果要還原的表名在當(dāng)前系統(tǒng)中已經(jīng)被占用,也可以在閃回刪除的時候?qū)Ρ碇孛?/p>
SQL> flashback table emp to before drop rename to emp_new
也可以通過回收站查看當(dāng)前用戶那些表被刪除了,每個用戶都有一個回收站,這個回收站是個邏輯結(jié)構(gòu),它不是一塊獨立的存儲空間,它存在在當(dāng)前表空間內(nèi),所以如果有別的操作需要空間,比如現(xiàn)在需要創(chuàng)建一張表,沒有足夠空間可用,回收站中的數(shù)據(jù)就會被清理,這也是導(dǎo)致閃回刪除失敗的原因。
SQL> SHOW RECYCLEBIN;
徹底刪除表,閃回刪除也無能為力
SQL> DROP TABLE EMP PURGE;
清空回收站
SQL> PURGE RECYCLEBIN;
注意:閃回刪除只針對Drop命令,注意區(qū)分truncate操作和drop操作,truncate稱為表截斷,會清空表中數(shù)據(jù)(調(diào)節(jié)Oracle高水位線實現(xiàn)),表結(jié)構(gòu)不受影響,速度很快,弊端是此過程不會產(chǎn)生任何撤銷數(shù)據(jù)或是重做日志,如果誤刪,恢復(fù)異常麻煩,要慎重使用。而Drop則會刪除數(shù)據(jù)+表結(jié)構(gòu),閃回刪除僅針對Drop操作。
功能描述:閃回數(shù)據(jù)歸檔可使表具有回退到過去任何時間點的能力,前面提到的閃回查詢,閃回表都會受限于撤銷數(shù)據(jù)是否失效,如果撤銷數(shù)據(jù)被覆蓋重寫了,閃回操作自然會失敗,閃回刪除則受限于表空間是否有足夠可用空間,而閃回數(shù)據(jù)歸檔,則沒有這些限制。
創(chuàng)建閃回歸檔
1.創(chuàng)建一個用戶閃回數(shù)據(jù)歸檔的表空間,當(dāng)然,也可以使用已經(jīng)存在的表空間。
SQL> create tablespace test_tb datafile 'test.dbf' size 20m;
2.創(chuàng)建一個保留時間為2年的閃回歸檔
SQL> create flashback archive test_fa tablespace test_tb retention 2 year;
為scott用戶下的emp表啟用閃回歸檔
1.賦予用戶歸檔的權(quán)限
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年任意時間點的能力!
功能描述:閃回數(shù)據(jù)庫可將整個數(shù)據(jù)庫回退到過去某個時間點,閃回表是某張表的時空穿梭,閃回數(shù)據(jù)庫則是整個數(shù)據(jù)庫的時空穿梭。當(dāng)然,閃回點之后的所有工作就丟失了,其實就相當(dāng)于數(shù)據(jù)庫的不完整恢復(fù),所以只能以resetlogs模式打開數(shù)據(jù)庫。閃回數(shù)據(jù)庫會造成停機時間,當(dāng)然相比于傳統(tǒng)備份恢復(fù)機制,恢復(fù)過程會快很多。
工作原理:閃回數(shù)據(jù)庫不使用撤銷數(shù)據(jù),使用另外一種機制來保留回退所需要的恢復(fù)數(shù)據(jù),當(dāng)啟用閃回數(shù)據(jù)庫,發(fā)生變化的數(shù)據(jù)塊會不斷從數(shù)據(jù)庫緩沖區(qū)緩存中復(fù)制到閃回緩沖區(qū),然后,稱為恢復(fù)寫入器(Recovery Writer)的后臺進程會將這些數(shù)據(jù)刷新到磁盤中的閃回日志文件中。閃回的過程,則是一個 提取閃回日志-->將塊映像復(fù)制回數(shù)據(jù)文件 的過程。
配置閃回數(shù)據(jù)庫(閃回數(shù)據(jù)庫要求數(shù)據(jù)庫為歸檔模式)
1.指定閃回恢復(fù)區(qū),也就是存放閃回日志的位置,但閃回恢復(fù)區(qū)不僅僅是為了存放閃回日志,Oracle的很多備份恢復(fù)技術(shù)都用到這個區(qū)域,比如控制文件的自動備份等都會存放到此區(qū)域。
SQL> alter system set db_recovery_file_dest ='/flash_recovery_area';
2.指定恢復(fù)區(qū)大小
SQL> alter system set db_recovery_file_dest_size=4G;
3.指定閃回日志保留時間為2小時,即通過閃回操作,可以將數(shù)據(jù)庫回退到前兩小時內(nèi)的任意時間點
SQL> alter system set db_flashback_retention_target=120;
4.有序關(guān)閉數(shù)據(jù)庫--mount模式下啟用閃回數(shù)據(jù)庫--打開數(shù)據(jù)庫
SQL> shutdown immediate; SQL> startup mount; SQL> alter database flashback on; SQL> alter database open;
至此,閃回數(shù)據(jù)庫配置完成!
使用閃回數(shù)據(jù)庫功能
SQL> shutdown immediate; SQL> startup mount; SQL> flashback database to timestamp sysdate-60/1440; SQL> alter database open resetlogs;
本文列舉了四類閃回技術(shù),其中,閃回查詢,包括基本閃回查詢,閃回表等技術(shù)都依賴于撤銷數(shù)據(jù)(還有一類閃回技術(shù)為閃回事務(wù),可以對指定事務(wù)進行閃回操作,原理類似,借助于撤銷數(shù)據(jù)來構(gòu)建用于反轉(zhuǎn)事務(wù)的SQL語句),依賴于撤銷數(shù)據(jù),則自然受限于撤銷數(shù)據(jù)的保留時間,可能會由于撤銷數(shù)據(jù)被覆寫而導(dǎo)致閃回失敗。閃回刪除,則是由于10g版本后對表的刪除僅表現(xiàn)為一個rename操作,引入回收站的概念,但此回收站僅是當(dāng)前表空間的一塊邏輯劃分,所以會受限于當(dāng)前表空間的可用空間的限制;閃回歸檔可提供查詢或回退到過去任意時間點的功能,閃回數(shù)據(jù)庫則是一中更極端的數(shù)據(jù)庫恢復(fù)功能,相當(dāng)于不完整恢復(fù),依賴于閃回日志。
創(chuàng)新互聯(lián)面向全國提供域名注冊、虛擬主機、云服務(wù)器、服務(wù)器托管與租用,如需了解,請聯(lián)系QQ:171356849微信:zh18159893430 咨詢,謝謝!