應用oracle flashback--Flashback Database介紹
如果說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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 應用oracle flashback--Flashback Table之RECYCLEBINOracle
- 關於Oracle Database Vault介紹OracleDatabase
- Oracle database 補丁知識介紹OracleDatabase
- oracle database link 應用OracleDatabase
- ORL Faces Database介紹Database
- Sqlite 介紹及應用SQLite
- less的介紹和應用
- 【RAT】Oracle Real Application Testing(真用應用測試)介紹OracleAPP
- Oracle NOSQL DATABASE簡介OracleSQLDatabase
- Android 應用程式元件介紹Android元件
- Lucene介紹及簡單應用
- Python 應用剖析工具介紹Python
- Rsync原理介紹及配置應用
- RPM 的介紹和應用
- 【徵文】應用oracle flashback(3.2)--Flashback Database操作示例OracleDatabase
- Redis HyperLogLog介紹及應用Redis
- Disruptor的簡單介紹與應用
- 正交多項式介紹及應用
- call、apply、bind應用的介紹APP
- Azure Container App(一)應用介紹AIAPP
- 經典資料分析應用介紹
- arguments的應用示例簡單介紹
- Zookeeper 介紹及典型應用場景
- Flume架構以及應用介紹[轉]架構
- Xamarin開發Anroid應用介紹
- SAP作業型別應用介紹型別
- Harmony 應用開發常用元件介紹元件
- 【kingsql分享】Oracle Database 19c的各種新特性介紹SQLOracleDatabase
- springboot_database專案介紹Spring BootDatabase
- ORACLE OWI介紹Oracle
- ORACLE ORION介紹Oracle
- oracle VPD介紹Oracle
- Oracle recyclebin介紹Oracle
- ORACLE鎖介紹Oracle
- Oracle ACE 介紹Oracle
- oracle job 介紹Oracle
- Oracle Spatial 介紹Oracle
- JavaScript內建物件介紹(重點介紹Math(),Date(),Array()以及案例應用)JavaScript物件