Oracle閃回技術(shù)詳解,這里整理了4種閃回技術(shù),對(duì)Oracle 閃回技術(shù)做一個(gè)整理總結(jié)。
概述:
閃回技術(shù)是Oracle強(qiáng)大數(shù)據(jù)庫(kù)備份恢復(fù)機(jī)制的一部分,在數(shù)據(jù)庫(kù)發(fā)生邏輯錯(cuò)誤的時(shí)候,閃回技術(shù)能提供快速且最小損失的恢復(fù)(多數(shù)閃回功能都能在數(shù)據(jù)庫(kù)聯(lián)機(jī)狀態(tài)下完成)。需要注意的是,閃回技術(shù)旨在快速恢復(fù)邏輯錯(cuò)誤,對(duì)于物理?yè)p壞或是介質(zhì)丟失的錯(cuò)誤,閃回技術(shù)就回天乏術(shù)了,還是得借助于Oracle一些高級(jí)的備份恢復(fù)工具如RAMN去完成(這才是Oracle強(qiáng)大備份恢復(fù)機(jī)制的精髓所在?。?/p>
撤銷段(UNDO SEGMENT)
在講閃回技術(shù)前,需要先了解Oracle中一個(gè)邏輯結(jié)構(gòu)--撤銷段。因?yàn)榇蟛糠珠W回技術(shù)都需要依賴撤銷段中的撤銷數(shù)據(jù)。撤銷數(shù)據(jù)是反轉(zhuǎn)DML語(yǔ)句結(jié)果所需的信息,只要某個(gè)事務(wù)修改了數(shù)據(jù),那么更新前的原有數(shù)據(jù)就會(huì)被寫入一個(gè)撤銷段。(事務(wù)回滾也會(huì)用到撤銷段中的數(shù)據(jù))。事務(wù)啟動(dòng)時(shí),Oracle 會(huì)為其分配一個(gè)撤銷段,事務(wù)和撤銷段存在多對(duì)一的關(guān)系,即一個(gè)事務(wù)只能對(duì)應(yīng)一個(gè)撤銷段,多個(gè)事務(wù)可以共享一個(gè)撤銷段(不過(guò)在數(shù)據(jù)庫(kù)正常運(yùn)行時(shí)一般不會(huì)發(fā)生這種情況)。
閃回技術(shù)
Oracle提供了四種可供使用的閃回技術(shù)(閃回查詢,閃回刪除,閃回歸檔,閃回?cái)?shù)據(jù)庫(kù)),每種都有不同的底層體系結(jié)構(gòu)支撐,但其實(shí)這四種不同的閃回技術(shù)部分功能是有重疊的,使用時(shí)也需要根據(jù)實(shí)際場(chǎng)景合理選擇最合適的閃回功能。
閃回查詢(Flashback Query)
a.基本閃回查詢
功能描述:可以查詢過(guò)去某個(gè)時(shí)間段的數(shù)據(jù)庫(kù)狀態(tài)。
工作原理:Oracle 會(huì)提取所需要的撤銷數(shù)據(jù)(前提是撤銷是可用的,即撤銷數(shù)據(jù)還沒被覆蓋)進(jìn)行回滾,但這種回滾是臨時(shí)的,僅針對(duì)當(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.閃回表
功能描述:可將某個(gè)表回退到過(guò)去某個(gè)時(shí)間點(diǎn)
工作原理:同樣,Oracle會(huì)先去查詢撤銷段,提取過(guò)去某個(gè)時(shí)間點(diǎn)之后的所有變更,構(gòu)造反轉(zhuǎn)這些變更的SQL語(yǔ)句進(jìn)行回退,閃回操作是一個(gè)單獨(dú)的事務(wù),所以若由于撤銷數(shù)據(jù)過(guò)期之類的原因?qū)е聼o(wú)法閃回,整個(gè)操作會(huì)回滾,不會(huì)存在不一致的狀態(tài)。
步驟:
1.啟用表閃回首先要在表上支持行移動(dòng)(在數(shù)據(jù)字典中設(shè)置標(biāo)識(shí)來(lái)標(biāo)識(shí)該操作可能會(huì)改變行ID,即同一條數(shù)據(jù)閃回成功后主鍵都一樣,但行ID其實(shí)已經(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');
閃回表可能會(huì)失敗,有可能有以下幾種情況:
違反了數(shù)據(jù)庫(kù)約束,比如用戶不小心刪除了子表中的數(shù)據(jù),現(xiàn)在想利用閃回表技術(shù)進(jìn)行回退,恰好在這中間,父表中與該數(shù)據(jù)對(duì)應(yīng)的那條記錄也被刪除了,在這種情況下,由于違反了外鍵約束,導(dǎo)致閃回表操作失敗了;
撤銷數(shù)據(jù)失效,比如用于支撐閃回操作的撤銷數(shù)據(jù)被覆蓋了,這種情況閃回表操作自然會(huì)失?。?/p>
閃回不能跨越DDL,即在閃回點(diǎn)和當(dāng)前點(diǎn)之間,表結(jié)構(gòu)有過(guò)變更,這種情況閃回操作也會(huì)失敗。
注意:上述閃回功能都是基于撤銷數(shù)據(jù)的,而撤銷數(shù)據(jù)是會(huì)被重寫的(Expired會(huì)被重寫,Active不會(huì)被重寫),所以,在需要使用這幾種閃回功能去恢復(fù)數(shù)據(jù)的時(shí)候(確切地說(shuō),是需要使用基于撤銷數(shù)據(jù)的閃回功能時(shí)),最短時(shí)間發(fā)現(xiàn)錯(cuò)誤,第一時(shí)間執(zhí)行閃回操作,才能最大程度地保證閃回功能的成功。
閃回刪除(Flashback Drop)
功能描述:閃回刪除可以輕松將一個(gè)已經(jīng)被Drop的表還原回來(lái)。相應(yīng)的索引,數(shù)據(jù)庫(kù)約束也會(huì)被還原(除了外鍵約束)
原理描述:Drop命令其實(shí)是Rename命令,早期的Oracle版本(10g之前),閃回刪除意味著從數(shù)據(jù)字典中刪除了該表的所有引用,雖然表中數(shù)據(jù)可能還存在,但已成了孤魂野鬼,沒法進(jìn)行恢復(fù)了,10g版本之后,Drop命令則僅僅是一個(gè)Rename操作,所以恢復(fù)就很容易了。
閃回刪除操作執(zhí)行命令很簡(jiǎn)單
SQL> flashback table emp to before
如果要還原的表名在當(dāng)前系統(tǒng)中已經(jīng)被占用,也可以在閃回刪除的時(shí)候?qū)Ρ碇孛?/p>
SQL> flashback table emp to before drop rename to emp_new
也可以通過(guò)回收站查看當(dāng)前用戶那些表被刪除了,每個(gè)用戶都有一個(gè)回收站,這個(gè)回收站是個(gè)邏輯結(jié)構(gòu),它不是一塊獨(dú)立的存儲(chǔ)空間,它存在在當(dāng)前表空間內(nèi),所以如果有別的操作需要空間,比如現(xiàn)在需要?jiǎng)?chuàng)建一張表,沒有足夠空間可用,回收站中的數(shù)據(jù)就會(huì)被清理,這也是導(dǎo)致閃回刪除失敗的原因。
SQL> SHOW RECYCLEBIN;
徹底刪除表,閃回刪除也無(wú)能為力
SQL> DROP TABLE EMP PURGE;
清空回收站
SQL> PURGE RECYCLEBIN;
注意:閃回刪除只針對(duì)Drop命令,注意區(qū)分truncate操作和drop操作,truncate稱為表截?cái)?,?huì)清空表中數(shù)據(jù)(調(diào)節(jié)Oracle高水位線實(shí)現(xiàn)),表結(jié)構(gòu)不受影響,速度很快,弊端是此過(guò)程不會(huì)產(chǎn)生任何撤銷數(shù)據(jù)或是重做日志,如果誤刪,恢復(fù)異常麻煩,要慎重使用。而Drop則會(huì)刪除數(shù)據(jù)+表結(jié)構(gòu),閃回刪除僅針對(duì)Drop操作。
閃回?cái)?shù)據(jù)歸檔(Flashback Data Archive )
功能描述:閃回?cái)?shù)據(jù)歸檔可使表具有回退到過(guò)去任何時(shí)間點(diǎn)的能力,前面提到的閃回查詢,閃回表都會(huì)受限于撤銷數(shù)據(jù)是否失效,如果撤銷數(shù)據(jù)被覆蓋重寫了,閃回操作自然會(huì)失敗,閃回刪除則受限于表空間是否有足夠可用空間,而閃回?cái)?shù)據(jù)歸檔,則沒有這些限制。
創(chuàng)建閃回歸檔
1.創(chuàng)建一個(gè)用戶閃回?cái)?shù)據(jù)歸檔的表空間,當(dāng)然,也可以使用已經(jīng)存在的表空間。
SQL> create tablespace test_tb datafile 'test.dbf' size 20m;
2.創(chuàng)建一個(gè)保留時(shí)間為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表就擁有了可以查詢或回退到過(guò)去2年任意時(shí)間點(diǎn)的能力!
閃回?cái)?shù)據(jù)庫(kù)(Flashback Database)
功能描述:閃回?cái)?shù)據(jù)庫(kù)可將整個(gè)數(shù)據(jù)庫(kù)回退到過(guò)去某個(gè)時(shí)間點(diǎn),閃回表是某張表的時(shí)空穿梭,閃回?cái)?shù)據(jù)庫(kù)則是整個(gè)數(shù)據(jù)庫(kù)的時(shí)空穿梭。當(dāng)然,閃回點(diǎn)之后的所有工作就丟失了,其實(shí)就相當(dāng)于數(shù)據(jù)庫(kù)的不完整恢復(fù),所以只能以resetlogs模式打開數(shù)據(jù)庫(kù)。閃回?cái)?shù)據(jù)庫(kù)會(huì)造成停機(jī)時(shí)間,當(dāng)然相比于傳統(tǒng)備份恢復(fù)機(jī)制,恢復(fù)過(guò)程會(huì)快很多。
工作原理:閃回?cái)?shù)據(jù)庫(kù)不使用撤銷數(shù)據(jù),使用另外一種機(jī)制來(lái)保留回退所需要的恢復(fù)數(shù)據(jù),當(dāng)啟用閃回?cái)?shù)據(jù)庫(kù),發(fā)生變化的數(shù)據(jù)塊會(huì)不斷從數(shù)據(jù)庫(kù)緩沖區(qū)緩存中復(fù)制到閃回緩沖區(qū),然后,稱為恢復(fù)寫入器(Recovery Writer)的后臺(tái)進(jìn)程會(huì)將這些數(shù)據(jù)刷新到磁盤中的閃回日志文件中。閃回的過(guò)程,則是一個(gè) 提取閃回日志-->將塊映像復(fù)制回?cái)?shù)據(jù)文件 的過(guò)程。
配置閃回?cái)?shù)據(jù)庫(kù)(閃回?cái)?shù)據(jù)庫(kù)要求數(shù)據(jù)庫(kù)為歸檔模式)
1.指定閃回恢復(fù)區(qū),也就是存放閃回日志的位置,但閃回恢復(fù)區(qū)不僅僅是為了存放閃回日志,Oracle的很多備份恢復(fù)技術(shù)都用到這個(gè)區(qū)域,比如控制文件的自動(dòng)備份等都會(huì)存放到此區(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.指定閃回日志保留時(shí)間為2小時(shí),即通過(guò)閃回操作,可以將數(shù)據(jù)庫(kù)回退到前兩小時(shí)內(nèi)的任意時(shí)間點(diǎn)
SQL> alter system set db_flashback_retention_target=120;
4.有序關(guān)閉數(shù)據(jù)庫(kù)--mount模式下啟用閃回?cái)?shù)據(jù)庫(kù)--打開數(shù)據(jù)庫(kù)
SQL> shutdown immediate;
SQL> startup mount;
SQL> alter database flashback on;
SQL> alter database open;
至此,閃回?cái)?shù)據(jù)庫(kù)配置完成!
使用閃回?cái)?shù)據(jù)庫(kù)功能
SQL> shutdown immediate;
SQL> startup mount;
SQL> flashback database to timestamp sysdate-60/1440;
SQL> alter database open resetlogs;
總結(jié)
本文列舉了四類閃回技術(shù),其中,閃回查詢,包括基本閃回查詢,閃回表等技術(shù)都依賴于撤銷數(shù)據(jù)(還有一類閃回技術(shù)為閃回事務(wù),可以對(duì)指定事務(wù)進(jìn)行閃回操作,原理類似,借助于撤銷數(shù)據(jù)來(lái)構(gòu)建用于反轉(zhuǎn)事務(wù)的SQL語(yǔ)句),依賴于撤銷數(shù)據(jù),則自然受限于撤銷數(shù)據(jù)的保留時(shí)間,可能會(huì)由于撤銷數(shù)據(jù)被覆寫而導(dǎo)致閃回失敗。閃回刪除,則是由于10g版本后對(duì)表的刪除僅表現(xiàn)為一個(gè)rename操作,引入回收站的概念,但此回收站僅是當(dāng)前表空間的一塊邏輯劃分,所以會(huì)受限于當(dāng)前表空間的可用空間的限制;閃回歸檔可提供查詢或回退到過(guò)去任意時(shí)間點(diǎn)的功能,閃回?cái)?shù)據(jù)庫(kù)則是一中更極端的數(shù)據(jù)庫(kù)恢復(fù)功能,相當(dāng)于不完整恢復(fù),依賴于閃回日志。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
您可能感興趣的文章:- oracle 9i使用閃回查詢恢復(fù)數(shù)據(jù)庫(kù)誤刪問(wèn)題
- oracle 數(shù)據(jù)庫(kù)閃回相關(guān)語(yǔ)句介紹
- Oracle 查看表空間的大小及使用情況sql語(yǔ)句
- ORACLE 10g 安裝教程[圖文]
- Oracle數(shù)據(jù)庫(kù)下載及安裝圖文操作步驟
- Linux系統(tǒng)(X64)安裝Oracle11g完整安裝圖文教程另附基本操作
- oracle常用sql語(yǔ)句
- ORACLE 如何查詢被鎖定表及如何解鎖釋放session
- oracle sqlplus 常用命令大全
- Oracle新建用戶、角色,授權(quán),建表空間的sql語(yǔ)句
- ORACLE數(shù)據(jù)庫(kù)查看執(zhí)行計(jì)劃的方法
- oracle 查詢表名以及表的列名