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 。


沒有留言:

張貼留言