巧用flashback database實現靈活的資料復原
之前寫了一篇文章分享了使用flashback database的特性來在測試環境中避免重複匯入大批量的資料,造成時間和儲存空間的浪費。
今天碰到的這個問題更有針對性和普遍性,在很多時候都需要一套獨立的環境來作為客戶的培訓和示範需要,環境中的資料一旦配置完成,一般是很少需要改動的。如果培訓完成後,第二天如果還有培訓或者示範,想得到原來的初始化資料就很困難了。
這個時候我們可以嘗試使用flashback database來實現。
在之前的例子中分享了根據時間點或者scn可以達到閃回資料庫的目的,其實還有一種方式比較普遍通用,就是使用restore point來做閃回資料庫的操作。
假設環境初始化完成之後,我們可以直接設定一個restore point,在後期就不用過分關注時間點或者scn來做閃回操作了。
create restore point original_state_BASE guarantee flashback database;
設定了這個restore point之後,我們可以使用下面的指令碼來查看設定的這個復原點。
col NAME for a20
col TIME for a35
set lines 200
col STORAGE_SIZE for a50
SELECT NAME, SCN, TIME, DATABASE_INCARNATION# DI,GUARANTEE_FLASHBACK_DATABASE, STORAGE_SIZE/1024/1024/1024
FROM V$RESTORE_POINT
WHERE GUARANTEE_FLASHBACK_DATABASE='YES';
NAME SCN TIME DI GUA STORAGE_SIZE/1024/1024/1024
-------------------- ---------- ----------------------------------- ---------- --- ---------------------------
ORIGINAL_STATE_BASE 4465165 17-APR-15 10.48.01.000000000 AM 1 YES 0
ORIGINAL_STATE 4465180 17-APR-15 10.48.10.000000000 AM 1 YES .68359375
設定了之後,如果後面需要閃回恢複就很容易了。
參考指令碼如下,可以很快達到預期的目的。
set echo on feed on
set time on timing on
-spoo logs/restore_flashback.log
select name from v$database;
SELECT current_scn FROM v$database;
col NAME for a20
col TIME for a35
set lines 100
SELECT NAME, SCN, TIME, DATABASE_INCARNATION# DI,GUARANTEE_FLASHBACK_DATABASE, STORAGE_SIZE
FROM V$RESTORE_POINT
WHERE GUARANTEE_FLASHBACK_DATABASE='YES';
shutdown immediate;
startup mount;
flashback database to restore point ORIGINAL_STATE;
alter database open read only;
shutdown immediate;
startup mount;
alter database open resetlogs;
spoo off
當然了這個回退的原理就是flashback database,但是在特定的使用情境中就賦予了更多的實際意義。
在這個基礎上如果根據業務需要,每周的某幾天需要做這個後援動作,就可以設定為crontab的方式來自動運行,就不用大半夜,大清早再去做這些回退了。
本文永久更新連結地址: