數據庫----Oracle中的閃回(flashback)技術

前言

  今天公司的項目由於重新更新了接口對接方式,導致測試數據庫同步到的數據信息出現異常,然後再修改之後同步發現還是無效,就想將之前同步的數據重新刪除,完全同步一下,結果刪除的時候刪錯表的數據了,將同步的源頭表的數據給刪了,結果還提交了,這下闖禍了!但是不要怕,出現了問題就要想着解決,接下來我來介紹一下oracle中誤操作的解救神器 ----Flashback


正文

Flashback介紹

  爲了使Oracle數據庫從任何邏輯誤操作中迅速地恢復,Oracle推出了閃回技術。該技術首先以閃回查詢(Flashback Query)出現在Oracle 9i版本中,後來Oracle在10g中對該技術進行了全面擴展,提供了閃回數據庫、閃回刪除、閃回表、閃回事物及閃回版本查詢等功能,在11g 中,Oracle繼續對該技術進行改進和增強,增加了閃回數據歸檔功能。
  使用該特性,可以確保數據庫表能夠被恢復到之前的某一個時間點上。注意,該功能與最早的9i中的Flashback Query不同,Flashback Query僅僅是得到了表在之前某個時間點上的快照而已,並不改變當前表的狀態;而Falshback Table卻能夠將表及附屬對象一起恢復到以前的某個時間點。該功能基於撤銷數據(undodata)。
  使用閃回表,可將一個或多個表恢復到特定的時間點,而不需要還原備份;從還原表空間檢索數據後可執行閃回表操作;執行閃回表操作需要flashback any table權限;必須對要執行閃回操作的表啓用行移動。
如果用戶沒有行移動權限,將不能執行閃回操作,賦予用戶行移動權限的sql語句爲:

	grant flashback any table to 用戶名;

  閃回表必須有行移動功能

	alter table dept enable row movement;

閃回表數據(Flashback Table)

1.閃回到具體時間點
	flashback table scott.emp to timestamp 
	to_timestamp('2014-09-16 04:32:00','yyyy-mm-dd hh24:mi:ss');
2. 閃回到10分鐘之前
	flashback table scott.emp to timestamp(systimestamp-interval '10' minute);

閃回刪表(Flashback Drop)

閃回刪表指的是撤銷“DROP TABLE”的效果。

1. 閃回被刪掉的scott.emp表
	flashback table scott.emp to before drop;
2. 表被刪掉後,又新建了一個同名表,如果試圖用上述命令閃回原表,則會報ORA-38312: original name is used by an existing object錯誤,可重新命名。
 	flashback table test to before drop rename to test1;
3. 如果表名重複,則閃回時遵循後入先出的原則。
4. 閃回時可指明被恢復的回收站對象
 	 flashback table "BIN$AyId7ZbBjWngUKjADQIIuA==$0" to before drop;

閃回刪表的工作原理是:當“drop table”命令執行時,表及其索引並沒有被真正刪除,其所佔空間只是分配給了另一個數據庫對象:回收站對象,本質上相當於重命名。注意:表空間在自動增長的壓力下會按照先入先出的規則將回收站對象的空間分配給需要空間的段,在將回收站對象耗盡之前數據文件是不會自動增長的。

5. 可禁用回收站功能
 	alter system set recyclebin='OFF' scope=spfile;
6. 刪除當前用戶回收站的所有對象
 	purge recyclebin;

閃回查詢(Flashback Query)

以表爲單位查詢過去的數據稱爲閃回查詢,主要有兩種方式:1. 閃回時間點查詢。利用select命令的“as of”子句與PL/SQL包dbms_flashback在過去的一個時間點上的查詢。2. 閃回版本查詢。利用select命令的“versions between”子句在過去的一段時間範圍內的查詢。

閃回時間點查詢

利用“as of”子句

1. 查詢7788號員工在具體時間的工資
 	select sal from emp as of timestamp to_timestamp('2014-09-16 10:02:30','yyyy-mm-dd,hh24:mi:ss') where empno=7788;
2. 查詢7788號員工在五分鐘前的工資
 	select sal from emp as of timestamp (systimestamp - interval '5' minute) where empno=7788;
3. 查詢具體SCN
 	 select * from emp as of scn 1095000;
4. 將7788號員工的工資修改爲15分鐘之前的值
 	update emp set sal=(select sal from emp as of timestamp(systimestamp - interval '15' minute) where empno=7888) where empno=7788;

利用dbms_flashback包

利用dbms_flashback包的enable_at_time或enable_at_scn存儲過程鎖定一個會話級別的閃回時間目標,即進入閃回模式,隨後的查詢命令可以省略“as of”,直到調用dbms_flashback_disable存儲過程將其關閉爲止。

比如,將閃回模式會話定格在15分鐘前:

 	exec dbms_flashback.enable_at_time(systimestamp - interval '15' minute);

現在進行查詢,注意,此時查詢的是15分鐘之前的表。

 	select sal from emp where empno=7788;   --忽略了“as of”子句

此時若訪問SYSDATE、SYSTIMESTAMP等日期函數,它們的返回值仍是當前值,而不是15分鐘之前的值。

處於閃回會話模式時,執行dml和ddl將報錯

	  update emp set sal=4000 where empno=7788;
	  update emp set sal=4000 where empno=7788

ERROR at line 1:
ORA-08182: operation not supported while in Flashback mode

如果查詢完畢,可調用disable存儲過程關閉閃回會話模式。

 	exec dbms_flashback.disable;

  鹹魚IT技術交流羣:89248062,在這裏有一羣和你一樣有愛、有追求、會生活的朋友! 大家在一起互相支持,共同陪伴,讓自己每天都活在豐盛和喜樂中!同時還有龐大的小夥伴團體,在你遇到困擾時給予你及時的幫助,讓你從自己的坑洞中快速爬出來,元氣滿滿地重新投入到生活中!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章