1. 程式人生 > >【oracle恢復】通過閃回(flahback)找回刪除的表

【oracle恢復】通過閃回(flahback)找回刪除的表

oracle誤刪的表通過閃回(flash back)找回

場景:
資料庫版本:11.2.0.4單例項;系統版本:Oracle Linux6.4
子公司聯絡人反饋,某公司人員對庫進行了誤操作,導致有六張基礎表被誤刪除,看能否找回相關表,並把相關使用者名稱atist和表名資訊傳送過來。

解決:
一開始想到使用備份恢復,這個庫是每天凌晨1點進行的備份,使用的方式是exp對每個使用者分開備份

(此時可以看到使用者和密碼,當然這樣的備份貌似有點不太安全,每個使用者的密碼都洩露了;11g後其實推薦使用expdp/impdp,相關的引數實在是好得太多更利於理解,而且可以建立一個back使用者賦予備份的許可權對每個使用者備份,這樣就不用擔心每個使用者的密碼都洩露),但恢復未成功,因為時間緊急,那還有沒有別的方法呢,閃回!!!


■11g閃回有下面幾個相關概念:
閃回查詢、閃回版本查詢、閃回事務查詢、閃回表基於undo的保留資訊
閃回刪除基於recycle回收站機制
閃回資料庫基於閃回日誌
閃迴歸檔(11g新增);
只保護非系統表空間中的表(即系統表不能使用閃回功能),且表空間必須本地管理,外來鍵將不可以被恢復,索引和約束的名字將會被命名為以BIN開頭,由系統生成的名字;
支援在Open狀態下開啟閃回功能;
開啟資料庫閃回的前提條件:開啟資料庫歸檔
設定兩個初始化引數:閃回恢復區大小db_recovery_file_dest_size和閃回恢復區路徑db_recovery_file_dest,而這兩個引數是有先後順序的,必須先設定db_recovery_file_dest_size後設置db_recovery_file_dest,否則系統會報錯。
恢復資料需登入到刪除物件的使用者。


實際操作如下:
$ sqlplus / as sysdba
檢視是否開啟回收站(預設開啟,如不開啟後面的閃回都不用操作了)
SQL> show parameter recycle
檢視是否開啟閃回(資料庫級別的,預設關閉)
SQL> select name,flashback_on from v$database;

此時只是閃回刪除的表操作,不需要開啟資料庫的閃回,切換到刪除表的使用者atist(這點需要注意:如果登入到的是sysdba是檢視不到atist使用者下的回收站的)
SQL> conn atist/密碼
查看回收站內容
SQL> show recyclebin
檢視到回收站有相關刪除的表,準備還原,並且在還原的時候更改表名
SQL> flashback table table_name to before drop rename to table_name_old;


注:此時如果回車站有兩個同名的表,預設恢復最後一次刪除的表,如果想恢復第一次刪除的表,可以根據RECYCLEBIN NAME來恢復:
SQL> show recyclebin
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
T_TEST         BIN$elnypGYGClLgVQAAAAAAAQ==$0 TABLE        2018-11-11:10:12:31
T_TEST         BIN$elnypGYEClLgVQAAAAAAAQ==$0 TABLE        2018-11-11:10:11:56
SQL> flashback table "BIN$elnypGYEClLgVQAAAAAAAQ==$0" to before drop;            #注意這裡的表名為第一次刪除的recyclebin name

查看錶是否還原,再查看錶的主鍵、約束、索引,如果表原來有的話,還原後這些的名稱會有一定的變化,
這時候的名稱是系統自動生成的,需要手動更改(這就是弊端,不過好過資料丟失。)

最後更改表名
SQL> alter table table_name_old rename to table_name;