1. 程式人生 > >oracle閃回技術詳解之閃回drop(神奇的flashback)

oracle閃回技術詳解之閃回drop(神奇的flashback)

寫在前面:刪庫跑路,相信這是絕大多數程式設計師會經常聽到的一個詞。俗話說:常在河邊走,哪有不溼鞋,作為經常和資料打交道的程式設計師也好,運維實施也好,有時難免會出現資料誤刪除,誤操作等情況。如果你是一個oracle使用者,那麼你如果知道這些關於資料閃回恢復的基本知識,或許可以幫你在出現類似情況的時候解決很多問題。

本文主要介紹一下資料庫的誤drop操作的一些閃回技術,至於整庫的刪除恢復,想在另一篇文章裡詳細介紹。

再來說一個案例吧:今年34月的時候吧,一次現場運維在操作測試庫的時候,誤連了生產資料庫,執行了一個drop操作,將生產的流程核心業務表刪除,刪除之後發現連錯庫了,當時,情急之下,他將測試庫建表指令碼匯出,在生產環境執行建表指令碼,然後才聯絡我找解決措施(當然,後續通過我們的閃回技術,將之前刪除的業務表資料以及後續表重建後的資料全部找回)。下面就來詳細介紹下我們的閃回技術

1,概念
閃回技術是Oracle強大資料庫備份恢復機制的一部分,在資料庫發生邏輯錯誤的時候,閃回技術能提供快速且最小損失的恢復(多數閃回功能都能在資料庫聯機狀態下完成)。需要注意的是,閃回技術旨在快速恢復邏輯錯誤,對於物理損壞或是介質丟失的錯誤,閃回技術就回天乏術了,還是得藉助於Oracle一些高階的備份恢復工具如RAMN去完成
在講閃回技術前,需要先了解Oracle中一個邏輯結構–撤銷段。因為大部分閃回技術都需要依賴撤銷段中的撤銷資料。
撤銷資料是反轉DML語句結果所需的資訊,只要某個事務修改了資料,那麼更新前的原有資料就會被寫入一個撤銷段。
(事務回滾也會用到撤銷段中的資料)。事務啟動時,Oracle 會為其分配一個撤銷段,事務和撤銷段存在多對一的關係,即一個事務只能對應一個撤銷段(你可以理解為windows系統中的回收站)。

2,閃回drop(閃回drop可以輕鬆將一個已經被Drop的表還原。相應的索引,資料庫約束也會被還原(除了外來鍵約束))
先直接來個例子,讓大夥感受下什麼是閃回drop
1)連線sqlplus / as sysdba,檢視是否開啟回收站,如果未開啟(如下圖我已經開啟了回收站):

ALTER SYSTEM SET recyclebin = ON;     開啟系統回收站
ALTER SESSION SET recyclebin = ON;    開啟當前連接回收站
ALTER SYSTEM SET recyclebin = OFF;    關閉系統回收站
ALTER SESSION SET recyclebin = OFF;    關閉當前連接回收站

在這裡插入圖片描述
2)新建測試表,差插入四條資料,效果如下在這裡插入圖片描述
3),對user_test執行drop操作,再查詢時報:表或檢視不存在在這裡插入圖片描述
4),查詢資料字典:select * from dba_recyclebin; 檢視我們的user_test是否在回收站中,如圖確實在回收站中找到了我刪除的user_test表,並且是通過drop操作刪除的
在這裡插入圖片描述
5)接下來就是我們的明星命令了:FLASHBACK table tableName to before drop; 將表閃回到drop前的一個工作點
在這裡插入圖片描述
執行完閃回之後,你看錶資料又恢復了,不過這種flashback 對 TRUNCATE 操作沒用哦,至於TRUNCATE操作如何恢復,需要藉助第三方外掛或其他容災方式恢復了,後面我會介紹通過第三方外掛恢復TRUNCATE操作
注:
a)不通過表名,直接通過物件名也同樣可以完成閃回操作(如果我們同一個表名被刪除後,重新建表了,然後又刪除了,這是我們表名在回收站中可能就有兩個了,這時閃回的時候,可以通過物件名加以區分具體需要閃回的是哪張表了,命令如下)
flashback table “BIN$mKoYM02RCojgQAB/AQAvyw==$0” to before drop;
b)閃回之後重新命名,這個比較簡單,命令如下
flashback table tableName to before drop rename to new_tableName;
6)當然還有一種情況,我們表被刪除了,但是我還想查詢裡面的資料,又不能把表恢復的情況,可以直接通過回收站的物件名進行閃回查詢(注意物件名需要加 “”,不然會報錯的) 在這裡插入圖片描述
Drop命令其實是Rename命令,早期的Oracle版本(10g之前),閃回刪除意味著從資料字典中刪除了該表的所有引用,雖然表中資料可能還存在,但已成了孤魂野鬼,沒法進行恢復了,10g版本之後,Drop命令則僅僅是一個Rename操作,所以恢復就很容易了
10g版本開始,刪除表只是重新命名,但是不保證flashback 一定成功。比如刪除的表的表名字被佔用,期間先建立一個表和被刪除的重名則是由於10g版本後對錶的刪除僅表現為一個rename操作,引入回收站的概念,但此回收站僅是當前表空間的一塊邏輯劃分,所以會受限於當前表空間的可用空間的限制
上述案例中:
由於同事在drop後執行了建表操作,導致無法直接閃回成原來的表名:
解決方法:1,先將表rename
2,執行閃回操作
3,執行insert select 操作,將後續產生的資料更新到業務表中
注意:drop table table_name [purge] 如果你再drop操作中加入了purge引數,那麼我們這次介紹的閃回操作就不適用了(當然也是可以找回的,具體操作後面有機會再做介紹)

3,回收站管理
對於回收站管理,我這邊主要介紹三個命令,謹慎使用哦
> show recycle; 查看回收站.
> purge recyclebin; 清空回收站.
> purge table t2 ; 清空回收站中t2的表.

關於oracle的閃回drop就先介紹到這裡了,希望對大家有所幫助!