2022年6月9日 星期四

3. Flashback Table

Flashback Table 可分為兩個層次,一種是 Table Drop 之後的恢復,另一種則是 Table 本身資料的恢復。


Oracle 從 10g 開始有了 Recycle bin 的新功能, Recycle bin 就有如 Windows 系統的資源回收桶一樣,當 Table 被執行了 Drop 命令之後不會真正的被刪除,而是會將此 Table 放入 Recycle bin ,被放入 Recycle bin 的 Table 都會重新命名以 BIN$ 作為開頭,而在 Recycle bin 裡面的 Table 並沒有真正的被刪除,只是標示一筆可被刪除的紀錄而已,所以 Recycle bin 還是會占用到空間。 Flashback Table 就是將 Table 從 Recycle bin 還原回來的一種技術。


當 Table 被錯誤的 Drop 時,可以簡單的使用 Flashback Table 指令來還原,例如將 regions 這個 Table 刪除:


此時可以透過查詢 dba_recyclebin 來檢視此 Table 是否存在 Recycle bin :

SQL> select owner, original_name, object_name, type, ts_name, droptime, related, space

from dba_recyclebin where can_undrop = 'YES';


或者是簡單使用 show recyclebin 來查詢也可以:


當確認 Table 有在 Recycle bin 之後,就可以使用 Flashback Table 來還原它:

SQL> flashback table regions to before drop;

      (還原 regions 這個 Table)

SQL> flashback table regions to before drop rename to regions2;

      (還原 regions 這個 Table 並且重新命名為 regions2)


清理 Recycle bin 可以直接使用 purge dba_recyclebin 指令來清空資源回收桶:

SQL> purge dba_recyclebin;


如果不希望 Table 存放在 Recycle bin ,可以在 Drop 時加入 purge 指令,這樣 Table 就完完全全的被刪除了:

SQL> drop table regions purge;


要完整的關閉 Recycle bin 功能可以將參數 recyclebin 設置為 off :

SQL> alter system set recyclebin = off;


設置 recyclebin 為 off 在 Oracle 10g 時必須將資料庫重啟讓參數生效,而在 Oracle 11g 以後就不需要重啟了。


Recycle bin 可以說是防止人為操作疏失的一種保護機制,預設是開啟的,建議還是使用它比較好。


Flashback Table 的另一種模式是將 Table 的資料還原到之前的某一個時間點,這個功能就與 Flashback Query 類似,是基於 Undo 的一種技術,要還原 Table 的資料必須開啟 row movement ,例如將 regions 開啟 row movement :

SQL> alter table regions enable row movement;


此時 Table 的資料被誤刪之後就可以使用 Flashback Table 將資料還原:


Flashback Table 可以還原到之前的某一個 SCN (to scn) 或者是時間點 (to timestamp) :


Flashback Table 會將 Table 全部的資料統一還原到先前的時間點,在實務上並沒有 Flashback Query 好用,如果只是要還原被誤刪的資料,倒不如直接使用 Flashback Query 就好,除非有將 Table 的資料全數倒回去的需求,否則不太會使用 Flashback Table 。


沒有留言:

張貼留言