Oracle快速找回被刪除的表

笱局長發表於2019-01-23

很多情況下為了能快速找回被刪除的表,可以利用回收站找到並重建被刪除的表。
(一)
回收站裡是否可以找到被刪除的表,和undo的保留策略、空間大小有很大關係,超時或者空間不足都會導致無法閃回表,只能從備份中恢復。

# 檢視當前undo 保留策略
SQL> show parameter undo_
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 3600
undo_tablespace string UNDOTBS1

(二)

# 測試表
SQL> select table_name from dba_tables where owner=`WORKING`;
TABLE_NAME
------------------------------
DBA_OBJECTS

###被刪除的物件可以在回收站中檢視,現在沒有內容
SQL> select count(*) from dba_recyclebin;
COUNT(*)
----------
0

(三)
drop 表

# 刪除資料表
SQL> drop table working.DBA_OBJECTS;
Table dropped.

# 回收站中保留了剛刪除的表的資訊,原物件 working.DBA_OBJECTS 在回收站中有一個對映名字 BIN$NSM8ZSPA8vvgU2W8CgpvQg==$0

SQL> select owner,object_name,original_name from dba_recyclebin;
OWNER OBJECT_NAME
------------------------------ ------------------------------
ORIGINAL_NAME
--------------------------------
WORKING BIN$NSM8ZSPA8vvgU2W8CgpvQg==$0
DBA_OBJECTS

(四)
利用閃回特性,還原被刪除的資料表,並重新命名

# 可以直接閃回表,也可以rename 表名
SQL> flashback table working.DBA_OBJECTS to before drop rename to DBA_OBJECTS_bak;

Flashback complete.

SQL> select table_name from dba_tables where owner=`WORKING`;
TABLE_NAME
------------------------------
DBA_OBJECTS_BAK

SQL> select count(*),owner from working.DBA_OBJECTS_bak group by owner;
COUNT(*) OWNER
---------- ------------------------------
1 WORKING
10 OUTLN
3340 PUBLIC
512 RPTADM
609 SYSTEM
8 ORACLE_OCM
124 GWADM
55 DBSNMP
5 APPQOSSYS
9592 SYS
124 PORTALADM
11 rows selected.

(五)
誤更新資料的恢復(update delete)
如果知道確切的誤操作時間,可以閃回至某個時間點,比如20分鐘之前

# 拿上一步恢復的表做測試
SQL> select object_name,owner from working.DBA_OBJECTS_bak where owner=`WORKING`;
OBJECT_NAME
--------------------------------------------------------------------------------
OWNER
------------------------------
DBA_OBJECTS
WORKING
 
###修改資料

SQL> update working.DBA_OBJECTS_bak set object_name = `DBA_OBJECTS_UPDATE` where owner = `WORKING`;

1 row updated.

SQL> commit;

Commit complete.

###第二次更新

SQL> update working.DBA_OBJECTS_bak set object_type = `TABLE_UPDATE` where owner = `WORKING`;

1 row updated.

SQL> commit;

Commit complete.

###檢視更新後的資料

SQL> select object_name,owner,object_type from working.DBA_OBJECTS_bak where owner=`WORKING`;
OBJECT_NAME
--------------------------------------------------------------------------------
OWNER OBJECT_TYPE
------------------------------ -------------------
DBA_OBJECTS_UPDATE
WORKING TABLE_UPDATE

(六)
閃回資料到20分鐘之前

SQL> flashback table WORKING.DBA_OBJECTS_BAK to timestamp(systimestamp-interval `20` minute);

Flashback complete.

SQL> select object_name,owner,object_type from working.DBA_OBJECTS_bak where owner=`WORKING`;
OBJECT_NAME
--------------------------------------------------------------------------------
OWNER OBJECT_TYPE
------------------------------ -------------------
DBA_OBJECTS
WORKING TABLE

超出回滾段保留的時效,可以通過備份檔案進行恢復需要的物件。


相關文章