刪除Oracle數據庫數據一般有以下2種方式:delete、drop或truncate。下面針對這2種刪除oracle數據庫數據的方式探討一下oracle數據庫數據恢復方法(不考慮全庫備份和利用歸檔日志)。
1、delete誤刪除的數據恢復方法。
利用oracle提供的閃回方法進行恢復。如果在刪除數據后還沒做大量的操作(只要被刪除數據的塊沒被覆寫),就可以利用閃回直接找回刪除的數據。
具體步驟為:
a、確定刪除數據的時間(最好是刪除數據的時間點)。
b、用以下語句找出刪除的數據:select * from 表名 as of timestamp to_timestamp('刪除時間點','yyyy-mm-dd hh24:mi:ss')
c、把刪除的數據重新插入原表:insert into 表名 (select * from 表名 as of timestamp to_timestamp('刪除時間點','yyyy-mm-dd hh24:mi:ss'))
注意要保證主鍵不重復。
如果表結構沒有發生改變,還可以直接使用閃回整個表的方式來恢復數據(表閃回要求用戶必須要有flash any table權限。)。
具體步驟:
alter table 表名 enable row movement
flashback table 表名 to timestamp to_timestamp(刪除時間點',' frombyte yyyy-mm-dd hh24:mi:ss')
2、drop誤刪除的數據恢復方法。
oracle在刪除表時沒有直接將表所占的塊清空,只是對該表的數據塊做了可以被覆寫的標志。oracle將已刪除的表的信息放到了一個虛擬容器“回收站”中,所以在塊未被重新使用前還可以恢復。
具體步驟:
查詢這個“回收站”或者查詢user_table視圖來查找已被刪除的表:
select table_name,dropped from user_tables
select object_name,original_name,type,droptime from user_recyclebin
在以上信息中,表名都是被重命名過的,字段table_name或者object_name就是刪除后在回收站中的存放表名。
如果還能記住表名,則可以用下面語句直接恢復:
flashback table 原表名 to before drop
如果記不住了,可以直接使用回收站的表名進行恢復,然后再重命名。參照下方語句:
flashback table "回收站中的表名(如:Bin$DSbdfd4rdfdfdfegdfsf==$0)" to before drop rename to 新表名
oracle的閃回功能除了以上基本功能外,還可以閃回整個數據庫。
使用數據庫閃回功能讓數據庫回到過去某一狀態。語句如下:
SQL>alter database flashback on
SQL>flashback database to scn SCNNO
SQL>flashback database to timestamp to_timestamp('時間點','yyyy-mm-dd hh24:mi:ss')
總結:
oracle數據庫雖然提供以上安全機制保證了誤操作后可以恢復數據,但同時也出現另外一個問題:空間占用。drop表或者delete表數據后,空間不會自動回收。
對于一些確定不使用的表,刪除后可以回收空間。刪除后回收空間的方法:
1、采用truncate方式進行截斷。
2、在drop時加上purge選項:drop table 表名 purge
該選項還有以下用途:
通過刪除recyclebin區域來永久性刪除表。
原始刪除表emp:
drop table emp cascade constraints purge table emp
刪除當前用戶的回收站:
purge recyclebin
刪除全體用戶在回收站的數據:
purge dba_recyclebin
審核編輯 黃宇
-
數據恢復
+關注
關注
10文章
505瀏覽量
17183 -
數據庫
+關注
關注
7文章
3707瀏覽量
64018 -
Oracle
+關注
關注
2文章
280瀏覽量
35044
發布評論請先 登錄
相關推薦
評論