2022年6月29日 星期三

4. Flashback Database

Flashback Database 是一種把整個資料庫還原到先前其中一個時間點的一項技術,使用傳統的 Restore Database 將資料庫還原到之前的一個時間點,必須由備份 Restore Datafile ,然後再由 Archive Log 把它 Recover 到某一個時間點,而 Flashback Database 則是藉由 Flashback Log 快速的將資料庫還原,不須經由 Restore 、 Recover 的程序, Flashback Database 所需要消耗的時間取決於還原所需的 Flashback Log 多寡,資料庫本身的大小不會影響到 Flashback Database 的速度,在資料庫啟用 Flashback Database 之後,就會產生一個 RVWR (Flashback Writer) 的 Background Process , RVWR 主要的目的是將 SGA 裡面 Flashback Buffer 的資料寫入 Flashback Log ,而 Flashback Buffer 主要是抓取 Buffer Cache 裡面異動 Block 的 Before Image ,因此 Flashback Database 只不過是經由 Flashback Log 把這些異動 Block 的 Before Image 蓋回來而已,所以它才能夠這麼快速的還原,而我們 Flashback Database 回去的時間點可能沒有那麼剛好都是 Flashback Log 裡面的時間點,那麼其中不足的部分會自動地藉由 Redo Log (Archive Log) 把它還原到我們設定的時間點,例如早上 11:00 的時候資料庫出現狀況,需要緊急的將資料庫還原到 10:10 的狀態,那麼在 11:00 的時候下了一個 Flashback Database to 10:10 :


這個時候資料庫會先找 10:10 之前可用的 Flashback Log ,假設已經找到 Flashback Log ,裡面 Before Image 的時間點為 09:30 ,那麼資料庫就會先 Apply 這些 Flashback Log ,然後再加上 09:30 ~ 10:10 這段時間的 Redo Data 把資料庫還原到我們所設定的 10:10 。


Flashback Database 這項功能預設是關閉的,如果想要使用必須把資料庫啟用這項功能,經由 v$database 可以查詢目前資料庫是否有啟用 Flashback Database :

SQL> select flashback_on from v$database;


由於 Flashback Log 會存放在 Recovery Area 底下,因此在啟用 Flashback Database 之前必須設定 Recover Area 相關參數 :

SQL> alter system set db_recovery_file_dest='/u01/fra' scope = spfile;

SQL> alter system set db_recovery_file_dest_size=1024M scope=spfile;


接下來要設定 Flashback Log 的保留時間,資料庫能夠還原到多久以前的狀態,取決於 Flashback Log 保留時間的長度,例如設定 Flashback Log 保留期間為 2天,那麼資料庫就可以 Flashback 回兩天前的狀態 :

SQL> alter system set db_flashback_retention_target=2880 scope=spfile;


設定完相關參數後,就可以把資料庫啟用 Flashback Database 功能,資料庫必須重起至 mount 狀態下才可以更改 :

SQL> shutdown immediate;

SQL> startup mount;

SQL> alter database flashback on;

SQL> alter database open;


在啟用了 Flashback Database 之後,於 Recovery Area 底下就會產生 Flashback Log 檔案 :


接下來就可以透過這些 Flashback Log 進行 Flashback Database 的操作,例如將使用者 HR 先進行刪除的動作 :


使用 Flashback Database 將資料庫進行還原到刪除 HR 之前的某一個時間點或 SCN :

SQL> shutdown immediate;

SQL> startup mount;

--- 選擇 timestamp 或 scn 進行 flashback ---

SQL> flashback database to timestamp to_timestamp('20100329 10:00:00', 'yyyymmdd hh24:mi:ss');

     (Flashback Database 至 20100329 10:00:00)

SQL> flashback database to scn 999689;

     (Flashback Database 至 scn 999689)

SQL> alter database open resetlogs;


Flashback Database 完成之後,之前被刪除的 HR 使用者也已經還原回來了 :


在實務上 Flashback Database 這項功能最常運用的場景在於做為資料庫重大異動時的一個還原方案。例如資料庫升級,在實際進行升級動作之前,先建立一個 Restore Point ,萬一升級有問題,就可以 Flashback Database 回到這個 Restore Point ,迅速做一個回退的動作。例如建立一個名為 before_upgrd 的 Restore Point :

SQL> create restore point before_upgrd guarantee flashback database;


透過 v$restore_point 可以查詢目前所建立的 Restore Point :


使用 Restore Point 的方式將資料庫進行 Flashback :

SQL> shutdown immediate;

SQL> startup mount;

SQL> flashback database to restore point before_upgrd;

SQL> alter database open resetlogs;


這邊要注意的是,為了確保資料庫一定可以 Flashback 回升級前的狀態,所以 Restore Point 的建立使用 Guarantee Flashback Database ,也就是從 Restore Point 建立起來的這一時間點開始,所有的 Flashback Log 都會被保留直到 Restore Point 被刪除為止,當資料庫已經沒有 Flashback 的需求時,務必將 Restore Point 進行刪除,否則 Recovery Area 的空間會被 Flashback Log 占滿導致空間不足。經由 v$flash_recovery_area_usage 可以查詢目前 Flashback Log 占用多少 Recovery Area 的空間 :


雖然 Flashback Database 可以快速的還原資料庫,但還是有所限制, Flashback Database 能還原回來的只有資料庫裡面的東西,例如資料庫使用者、 Table 、 Data Dictionary …等,對於實體的 Data File 就無法使用 Flashback Database 進行還原,例如當 Data File 產生 Corruption 時,就必須使用 RMAN 將 Data File 從備份 Restore 回來再進行 Recover ,這個情況就無法使用 Flashback Database 。


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 。