應用oracle flashback--Flashback Database介紹

jolly10發表於2008-07-30
第三部分:Flashback Database[@more@]

如果說flashback query可用來恢復指定時間點的記錄,flashback table可用來恢復被刪除或指定時間點的表,而flashback database,則直接提供一個級別的恢復,可將資料庫恢復到指定的時間點,相對於前兩者,其粒度是最大的。

資料庫級別的恢復,大家可能會想到我們通常所用的方式:藉助。那借助flashback database來做恢復相比透過備份恢復,有哪些優勢呢?三思個人看法認為主要有兩點:速度和恢復方式。

眾所周知之前我們對資料庫做不完全恢復,不論是命令列方式備份還是rman 備份,都是藉助備份+有效歸檔,從備份時間點向後做恢復。就三思目前的學識,還從來沒有一種特性,可以讓我們從當前時間點向前做恢復,正是由於有了flashback database這一特性,我們終於可以在不借助備份的情況下將資料庫向前恢復了,無數dba歡欣雀躍啊,哎呀這麼說好像不對,誰沒事兒老想對資料庫做恢復呢,難不成這庫老有毛病?無論如何吧,這是一項有意義的功能啊。

向前向後的有些不理解是吧,沒關係,看圖如下:

常規的恢復方式是這樣,必須藉助備份+歸檔

如果沒有適當的備份,我們想依靠scn2000時的歸檔和資料檔案,是不可能將資料庫恢復到scn1850時的狀態的。

而藉助flashback database,我們可以進行這樣的恢復:

從起用flashback database的那刻到當前時間,藉助flashback database,我們可以將資料庫直接修復到這中單的任意點,比如直接將資料庫flashback至scn1850。當然,實際上我們還是藉助了備份的,只不過沒有了恢復資料檔案的過程,因此才會表現得如此快速,下面我們透過一些實戰操作來演練一下。

1必備條件

A. 資料庫啟用了flashback database

B. 資料庫必須開啟了flash recovery area,如果資料庫是RAC,flash recovery area必須位於共享儲存中。

C. 資料庫必須處於archivelog模式

2限制條件

A. Flashback database是用來將資料庫中的數年恢復至之前的某個時間點,而非介質恢復,你不可能使用flashback database恢復之前被刪除的某個資料檔案。

B. 如果控制檔案被重建,則在此之前所產生的所有flashback 日誌統統失效,不能將資料庫flashback到控制檔案被重建之前。

C. 對於nologging模式下插入的資料,flashback database也恢復不了,因此建議資料庫處於force logging模式。

附C:

什麼是Flash Recovery Area(閃回區)

直白來講,你儘可以將Flash Recovery Area看做一個目錄,只不過往這個目錄裡扔垃圾的不再是操作者你,而是被你操作的,oracle也不是偷偷摸摸扔,人家光明正大,並且完全自動,不僅如此,它不旦將自己產品的日誌扔了進來,而且建議你也最好將一些恢復相關的檔案都統統扔到這個目錄中,比如:歸檔檔案,RMAN的備份集,控制檔案的備份,Online Redo Logs等,總之就是如果你希望能夠將資料庫恢復到之前任意一個時間點的話,你就需要將恢復所需的各種檔案、備份集統統置於Flash Recovery Area中。

這就帶來另外一個問題,該區域設多大合適呢(這裡我們要肯定一點,oracle在這方面還是給了我們一點點自主權的,比如,我們可以透過設定來限制Flash Recovery Area最大可使用的空間,而不是像其某些特性那樣指定一個路徑之後,有多少剩餘空間它就會用多少)?Oracle是這樣建議的,flash recovery area設定的越大,flashback database的恢復能力就越強,因此建議flash recovery area能夠放的下所有的資料檔案,增量備份,以及所有尚未備份的歸檔檔案,當然還有它自己產生的flashback logs(什麼是flashback log呢,可以將其與online redologs對應起來理解,flashback log用來記錄資料塊的修改,這樣當需要flashback時,透過flashback log就可以快速恢復到指定時間點時塊的狀態)。在資料庫執行過程中,oracle自動向該區域寫入檔案,當剩餘空間不足15%的時候,它就會在alert中增加警告,提示你空間不足。但此時不會影響資料庫的正常運轉,直到所有空間統統被用掉之後,oracle首先嚐試刪除尋些過期的檔案,冗餘檔案或備份過的檔案,如果這些做完了,還是沒有空閒空間的話,資料庫就被hang住了,如果是生產資料庫,影響還是很惡劣的啊,因此,該區域的空間設定還是需要仔細思量的。當然,關於生產資料庫是否有必要開啟flash recovery area這裡不多評論,後續再續專題討論,另外關於flash recovery area的也非本系列關注之重點,不過多討論,感興趣的朋友可以自行參考Backup and Recovery Basics官方文件。

再來認識一下初始化引數:DB_FLASHBACK_RETENTION_TARGET

該引數用來控制flashback log資料保留的時間,或者說,你希望flashback database能夠恢復的最早的時間點。預設值是1440,單位是minute,即24小時,需要注意的是該引數雖然未直接指定flash recovery area大小,但卻受其制約,舉個例子假如資料庫每天有10%左右的資料變動的話,如果該初始化引數值設定為1440,則flash recovery area的大小至少要是當前資料庫實際容量的10%,如果該初始化引數設定為2880,則flash recovery area的大小就至少是資料庫所佔容量的20%。

Flashback database即可以在rman中執行,也可以在sql*plus中執行,其命令格式都是一樣的,在這個示例中,我們所有操作都是在sql*plus中執行

A. 檢查是否啟動了flash recovery area:

JSSWEB> show parameter db_recovery_file

NAME TYPE VALUE

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

db_recovery_file_dest string f:oracleoradatajsswebrecoveryarea

db_recovery_file_dest_size big integer 2G

B. 檢查是否啟用了歸檔

JSSWEB> archive log list;

日誌模式 存檔模式

自動存檔 啟用

存檔終點 USE_DB_RECOVERY_FILE_DEST

最早的聯機日誌序列 51

下一個存檔日誌序列 53

當前日誌序列 53

C. 檢查是否啟用了flashback database和force_logging

JSSWEB> select flashback_on,force_logging from v$database;

FLASHBACK_ON FOR

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

YES YES

D. 查詢當前的scn

JSSWEB> SELECT CURRENT_SCN FROM V$DATABASE;

CURRENT_SCN

-----------

686384

JSSWEB> select current_scn from v$database;

CURRENT_SCN

-----------

213749

E. 模擬誤刪除操作

JSSWEB> conn jss/jss

已連線。

JSSWEB> drop table jss_tb1;

表已刪除。

JSSWEB> delete jss_tb2 where id>5;

已刪除15行。

JSSWEB> select count(0) from jss_tb2;

COUNT(0)

----------

5

JSSWEB> commit;

提交完成。

F. 重新啟動到mount狀態,然後執行恢復

JSSWEB> conn / as sysdba

已連線。

JSSWEB> shutdown immediate

資料庫已經關閉。

已經解除安裝資料庫。

ORACLE 例程已經關閉。

JSSWEB> startup mount

ORACLE 例程已經啟動。

Total System Global Area 343932928 bytes

Fixed Size 1296620 bytes

Variable Size 125830932 bytes

Database Buffers 209715200 bytes

Redo Buffers 7090176 bytes

資料庫裝載完畢。

JSSWEB> flashback database to scn 686384;

完成。

提示:此處flashback database to timestamp也是一樣的,不過你需要估計好恢復到的時間點。

注意此處,在你執行完flashback database命令之後,提供了兩種方式讓你修復資料庫:

第一種直接alter database open resetlogs開啟資料庫,當然,指定scn或者timestamp時間點之後產生的資料統統丟失。

另一種方式是先執行alter database open read only命令以read-only模式開啟資料庫,然後立刻透過邏輯匯出的方式將誤操作涉及表的資料匯出,再執行recover database命令以重新應用資料庫產生的redo,將資料庫修復到flashback database操作前的狀態,然後再透過邏輯匯入的方式,將之前誤操作的表重新匯入,這樣的話對現有資料的影響最小,不會有資料丟失。

由於是演示過程,為了更簡便和快速,我們這裡採用方法一中提示的方式,但如果是比較重要的資料庫的話,你要採用哪種方式,就需要仔細評估一下了。

G. 開啟資料庫

JSSWEB> alter database open resetlogs;

資料庫已更改。

H. 驗證資料

JSSWEB> conn jss/jss

已連線。

JSSWEB> select *from tab;

TNAME TABTYPE CLUSTERID

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

JSS_TB1 TABLE

TP TABLE

JSS_TB2 TABLE

JSSWEB> select count(0) from jss_tb2;

COUNT(0)

----------

20

如上,之前的誤運算元據均已恢復。

可以看到這個過程非常迅速(當然跟我們操作的資料量小也有很大關係),這甚至都不算是在做恢復,從頭到尾,我們都沒有執行任何restore,也沒有recover的操作,這就是flashback database的優勢,速度

全文完~~~~~~~~~~~

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

相關文章