使用閃回拯救我們的資料(二)

realkid4發表於2011-01-25

 

宣告:本篇思路和知識點源自eygle老師作品。

 

 

本篇是筆者《使用閃回拯救我們的資料》系列之二。在Oracle9i之後,資料庫閃回技術逐漸成熟。到10g時,資料庫閃回已經成為一套比較完整的資料恢復方案。

 

提到閃回flashback,要注意Oracle的閃回技術是由幾個相對獨立的技術實現的。

 

ü        資料庫級別閃回:flashback database。將整個資料庫快速恢復到一個時間點;

ü        資料表級別閃回:將資料表全部恢復到過去的一個時間點上,或者對已經刪除掉的資料表恢復;

ü        行級別閃回:設定指定的時間點,可以查詢到該時間點的特定資料行;

ü        事務閃回:可以將按照事務的單位,將資料庫變更閃回;

 

 

我們已經在本系列的第一篇中,介紹過行級別的閃回,可以將制定時間的資料行匯出。在本篇中,我們介紹一下資料表級別的閃回。

 

在實際開發和維護中,我們有時候會遇到把資料表drop掉的情況。過去這種情況,我們只能透過之前保留的備份,進行不完全的備份。這樣的工作量很大也很麻煩。從Oracle10g起,引入了回收站的機制,將drop掉的資料表儲存在回收站中。當發現誤刪除的時候,可以透過回收站回收資料表。

 

回收站機制類似於我們在Windows上的回收站。在windows中,當我們選擇刪除一個檔案時,本質上並沒有將檔案從硬碟上刪除,只是將檔案以一種形式改名,這樣就能從回收站中看到。

 

Oracle的回收站也是採用同樣的原理。下面我們做一個簡單的實驗。

 

首先,確定系統引數。在Oracle10g中,有一個引數recyclebin,控制資料表回收站機制的啟動和關閉。

 

//用sys帳號登入,確定recyclebin引數

SQL> conn sys/sys@orcl as sysdba;

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

Connected as SYS

 

SQL> show parameter recyclebin;

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------

recyclebin                           string      on //當取值為on的時候,表示開啟回收站功能;

 

SQL>

 

之後,我們以scott使用者登入進去,演示刪除一張資料表。

 

SQL> conn scott/tiger@orcl;

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

Connected as scott

//建立資料表

SQL> create table t as select * from all_objects;

 

Table created

 

SQL> select count(*) from t;

 

  COUNT(*)

----------

     40712

 

 

之後刪除資料表。

 

SQL> drop table t;

 

Table dropped

 

SQL> select * from t;

 

select * from t

 

ORA-00942: 表或檢視不存在

 

 

sqlplus(注意:只能在sqlplus/sqlplusw中檢視到)中,使用show recyclebin命令,可以看到當前回收站的情況資訊。

 

SQL> show recyclebin;

ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME

---------------- ------------------------------ ------------ -------------------

T                BIN$jJvR2eVETmKH1JE6yBQ2og==$0 TABLE 2011-01-25:22:30:52

 

 

記錄的內容顯而易見,有一個物件原名為T,在回收站中的名稱為“BIN$”。原來的物件型別為資料表,是在XXX時間被刪除。

 

 

如果這個時候確定說刪除是一個錯誤,需要恢復,簡單的使用flashback命令,就可以了。

//使用閃回命令,將資料表t閃回到刪除之前的狀態去

SQL> flashback table t to before drop;

 

閃回完成。

 

SQL> select count(*) from t;

 

  COUNT(*)

----------

40712

 

//資料恢復

 

一個簡單的命令,就可以挽回我們誤操作的結果了。

 

那麼,如果我們不需要這個物件了,需要完全的刪除。我們需要怎麼做呢?而且,在windows的回收站裡,檔案在清空回收站之前是還會佔用硬碟空間的。Oracle的回收站裡面既然儲存資料,那麼必然要消耗資料庫空間。

 

我們可以使用purge命令,對回收站的資訊進行清除。

 

SQL> drop table t;

 

表已刪除。

 

SQL> purge table t; //清除表

 

表已清除。

 

SQL> show recyclebin;

SQL> flashback table t to before drop; //嘗試閃回,失敗

flashback table t to before drop

*

1 行出現錯誤:

ORA-38305: 物件不在回收站中

 

 

同時,purge命令還提供了不同的操作粒度,如下:

 

ü        purge table ; 對指定的資料表進行清除purge;

ü        purge tablespace ; 對指定的表空間回收站進行purge;

ü        purge tablespace user ;對指定表空間回收站中指定使用者schema物件進行purge操作;

 

那麼,如果我們不想透過回收站進行刪除操作,希望在drop資料表的時候完全刪除,怎麼做呢?

 

 

SQL> select count(*) from t;

 

  COUNT(*)

----------

     40712

 

SQL> drop table t purge; //使用purge關鍵字,相當是說“不希望轉入回收站”

 

表已刪除。

 

SQL> show recyclebin;

 

 

談到drop一個資料表,就不能不說truncate table操作。truncate操作具有操作快的特點,那麼truncate命令是否支援閃回呢?

 

SQL> select count(*) from t;

 

  COUNT(*)

----------

     40712

 

SQL> truncate table t; //截斷資料表

 

表被截斷。

 

SQL> show recyclebin;

SQL> flashback table t to before drop;  //沒有在回收站中,也就必然不能支援閃回了;

flashback table t to before drop

*

1 行出現錯誤:

ORA-38305: 物件不在回收站中

 

 

 

那麼,flashback drop的原理是如何的呢?回收站機制是怎麼進行操作的呢?在下一次我們繼續一起研究。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17203031/viewspace-684631/,如需轉載,請註明出處,否則將追究法律責任。

相關文章