--=====================================
-- Oracle 閃回特性 (FLASHBACK DATABASE)
--=====================================
?
??? 閃回技術通常用于快速簡單恢復數據庫中出現的認為誤操作等邏輯錯誤,從閃回的方式可以分為基于數據庫級別閃回、表級別閃回、事務
級別閃回,根據閃回對數據的影響程度又可以分為閃回恢復,閃回查詢。閃回恢復將修改數據,閃回點之后的數據將全部丟失。而閃回查詢則可
以查詢數據被 DML 的不同版本,也可以在此基礎之上確定是否進行恢復等。本文主要描述 flashback database 的使用。
???
一、 flashback database 特性
??? flashback data1base 閃回到過去的某一時刻
??? 閃回點之后的工作全部丟失
??? 使用 resetlogs 創建新的場景并打開數據庫 ( 一旦 resetlogs 之后,將不能再 flashback 至 resetlogs 之前的時間點 )
???
??? 常用的場景 :truncate table 、多表發生意外錯誤等
??? 使用閃回日志來實現數據庫閃回,閃回點之后的數據將丟失
???
二、 flashback database 的組成
??? 閃回緩沖區 : 當啟用 flashback database, 則 sga 中會開辟一塊新區域作為閃回緩沖區 , 大小由系統分配
??? 啟用新的 rvwr 進程 :rvwr 進程將閃回緩沖區的內容寫入到閃回日志中,注意閃回日志不同于聯機重做日志,閃回日志在聯機重做日志基礎之
??????? 上生成,是完整數據塊映像的日志。聯機日志則是變化的日志。閃回日志不能復用,也不能歸檔。閃回日志使用循環寫方式。
???????????
三、 flashback database 的配置
??? flashback database 要求數據庫必須處于歸檔模式,且閃回之后必須使用 resetlogs 打開數據庫
??? a . 查看數據庫的歸檔模式及閃回是否啟用
??????? SQL > ? select log_mode , open_mode , flashback_on from v$database ;
?
??????? LOG_MODE ???? OPEN_MODE ? FLASHBACK_ON
??????? ------------ ---------- ------------------
??????? ARCHIVELOG ?? READ WRITE NO ???????????? --FLASHBACK_ON 為 NO ,則表示閃回特性尚未啟用
???
??? b . 查看及設置閃回目錄、閃回目錄空間大小等
??????? -- 下面查看恢復目錄及恢復目路分配的大小
??????? -- 可以使用 alter system set db_recovery_file_dest 來設置新路徑
??????? -- 可以使用 alter system set db_recovery_file_dest_size 來設定新的大小
??????? SQL > show parameter db_recovery ?
?
??????? NAME ???????????????????????????????? TYPE ??????? VALUE
??????? ------------------------------------ ----------- ------------------------------
??????? db_recovery_file_dest ??????????????? string ????? / u01 / app / oracle / flash_recovery
??????????????????????????????????????????????????????? ? _area
??????? db_recovery_file_dest_size ?????????? big integer 2G ???
???????
??? c . 設置閃回保留目標生存期
??????? SQL > show parameter db_flashback ????? -- 缺省為分鐘,即小時
?
??????? NAME ???????????????????????????????? TYPE ??????? VALUE
??????? ------------------------------------ ----------- ------------------------------
??????? db_flashback_retention_target ??????? integer ???? 1440
???????????????????
??????? SQL > alter system set db_flashback_retention_target = 30 ; -- 設定保留時間為半小時
???????
??? d . 在 mount 狀態下來啟用 flashback ,如在 open 狀態下則出現下列錯誤提示
??????? SQL > alter database flashback on ;
??????? alter database flashback on
??????? *
??????? ERROR at line 1 :
??????? ORA - 38759 : Database must be mounted by only one instance and not open .
???????
??????? -- 一致性關閉數據庫后,在 mount 狀態下設置 flashback
??????? SQL > startup mount exclusive ;
???????
??????? SQL > select status from v$instance ;
?
??????? STATUS
??????? ------------
??????? MOUNTED ????????
?
??????? SQL > alter database flashback on ; ???? -- 開啟閃回數據庫功能
?
??????? SQL > ho ps - ef | grep rvw ???????????? -- 可以看到新增了后臺進程 rvwr
??????? oracle ??? 3563 ???? 1 ? 0 12 : 12 ? ??????? 00 : 00 : 00 ora_rvwr_orcl
?
??????? -- 下面查看閃回區分配的大小為大約 M ,閃回分鐘以內的數據則需要 M 左右的空間
??????? -- 注意列 oldest_flashback_time 說明了允許返回的最早的時間點
??????? SQL > select oldest_flashback_scn old_flhbck_scn , oldest_flashback_time old_flhbck_tim ,
??????? ? 2 ? retention_target rete_trgt , flashback_size / 1024 / 1024 flhbck_siz ,
??????? ? 3 ? estimated_flashback_size / 1024 / 1024 est_flhbck_size
??????? ? 4 ? from v$flashback_database_log ;
?
??????? OLD_FLHBCK_SCN OLD_FLHBC ? RETE_TRGT FLHBCK_SIZ EST_FLHBCK_SIZE
??????? -------------- --------- ---------- ---------- ---------------
??????????????? 915137 24 - OCT - 10 ???????? 30 ???? 7.8125 ????? 11.2519531
?
??????? SQL > select * from v$flashback_database_stat ; ?? -- 查看閃回
?
??????? BEGIN_TIM END_TIME ? FLASHBACK_DATA ??? DB_DATA ? REDO_DATA ESTIMATED_FLASHBACK_SIZE
??????? --------- --------- -------------- ---------- ---------- ------------------------
??????? 24 - OCT - 10 24 - OCT - 10 ??????? 7905280 ?? 86802432 ?? 96329728 ??????????????????????? 0
?
??????? SQL > select * from v$sgastat where name like 'flashback%' ; ?????? -- 查看 sga 中分配的閃回空間大小
?
??????? POOL ???????? NAME ??????????????????????????? BYTES
??????? ------------ -------------------------- ----------
??????? shared pool ? flashback generation buff ???? 3981204
??????? shared pool ? flashback_marker_cache_si ??????? 9196
???????????????????????
??????? SQL > ho ls - hlt $ORACLE_BASE / flash_recovery_area / ORCL / flashback ? -- 查看生成的閃回日志
??????? total 7.9M
??????? - rw - r ----- 1 oracle oinstall 7.9M Oct 24 12:37 o1_mf_6d7dkogw_.flb
???????
四、使用 flashback database 閃回數據庫
??? 步驟 ( 前提歸檔日志可用 )
??????? 關閉數據庫
??????? 啟動數據庫到 mount 狀態 (exclusive 模式 )
??????? 閃回至某個時間點, SCN 或 log sequence number
??????? 使用 resetlogs 打開數據庫
??? 1. 使用 sqlplus 實現閃回
??????? 可以接受一個時間標記或一個系統改變號實參
??????? sqlplus 幾種常用的閃回數據庫方法
??????????? FLASHBACK [STANDBY] DATABASE [<database_name>] ? TO [BEFORE] SCN <system_change_number> ?? -- 基于 SCN 閃回
??????????? FLASHBACK [STANDBY] DATABASE [<database_name>] ? TO [BEFORE] TIMESTMP <system_timestamp_value> -- 基于時間戳閃回
??????????? FLASHBACK [STANDBY] DATABASE [<database_name>] ? TO [BEFORE] RESTORE POINT <restore_point_name> -- 基于時點閃回
??????? 如下面的示例:
??????????? SQL > flashback database to timestamp ( '2010-10-24 13:04:30' , 'yyyy-mm-dd hh24:mi:ss' );
??????????? SQL > flashback database to scn 918987 ;
??????????? SQL > flashback database ro restore point b1_load ;
???????
??????? a . 基于時間戳閃回
??????????? SQL > select count ( 1 ) from usr1 . tb1 ; ?? -- 查詢用戶 usr1 下表 tb1 中的記錄數
?
??????????? ? COUNT ( 1 )
??????????? ----------
??????????????? 404944
???????????
??????????? SQL > select to_char ( sysdate , 'yyyy-mm-dd hh24:mi:ss' ) tm from dual ; ? -- 獲得系統當前的時間
?
??????????? TM
??????????? -------------------
??????????? 2010 - 10 - 24 13 : 04 : 30
?
??????????? SQL > drop user usr1 cascade ; ???? -- 刪除帳戶 usr1 ,同時帳戶 usr1 下的所有對象將被刪除
?
??????????? SQL > conn scott / tiger ; ?????????? -- 使用 scott 帳戶登陸
?
??????????? SQL > create table tb_emp as select * from emp ; ? -- 新創建表 tb_emp
?
??????????? SQL > shutdown immediate ; ??????? -- 關系系統
?
??????????? SQL > startup mount ; ???????????? -- 重新到 mount 狀態
?
??????????? SQL > flashback database to timestamp ? -- 實施閃回
??????????? ? 2 ? to_timestamp ( '2010-10-24 13:04:30' , 'yyyy-mm-dd hh24:mi:ss' ) ; ?????????
???????????
??????????? SQL > alter database open resetlogs ;
???????????
??????????? SQL > select count ( 1 ) from usr1 . tb1 ; ??? -- 帳戶 usr1 及其對象 tb1 被成功閃回
?
??????????? ? COUNT ( 1 )
??????????? ----------
??????????????? 404944
?
??????????? SQL > select count ( 1 ) from scott . tb_emp ; ?? -- 閃回成功后,在閃回點之后修改的數據全部丟失
??????????? select count ( 1 ) from scott . tb_emp
??????????????????????????????????? ?? *
??????????? ERROR at line 1 :
??????????? ORA - 00942 : table or view does not exist ????????
???????????
??????? b . 基于 SCN 號閃回 ????????
??????????? SQL > select current_scn from v$database ; ?? -- 獲得當前的 SCN 號
?
??????????? CURRENT_SCN
??????????? -----------
??????????????? 918987
?
??????????? SQL > drop table usr1 . tb1 ; ?? -- 刪除用戶 usr1 下的表 tb1
???????
??????????? SQL > alter system checkpoint ; ??? -- 手動執行檢查點
?
??????????? SQL > ? select file# , checkpoint_change# from v$datafile ;
?
??????????????? ? FILE# CHECKPOINT_CHANGE#
??????????? ---------- ------------------
??????????????????? ? 5 ???????????? 921478
?
??????????? SQL > shutdown abort ; ???
???????????
??????????? SQL > startup mount ;
?
??????????? SQL > flashback database to scn 918987 ;
?
??????????? SQL > select count ( 1 ) from usr1 . tb1 ;
?
??????????? ? COUNT ( 1 )
??????????? ----------
??????????????? 404944
?
??????? c . 基于時點閃回
??????????? SQL > create table t ( id int , col varchar2 ( 20 )); ?? -- 創建表 t
?
??????????? SQL > insert into t values ( 1 , 'ABC' );
?
??????????? SQL > insert into t values ( 2 , 'DEF' );
?
??????????? SQL > commit ;
?
??????????? SQL > create restore point bef_damage ; ??? -- 創建閃回點
?
??????????? SQL > insert into t values ( 3 , 'GHI' );
?
??????????? SQL > select ora_rowscn , id , col from t ; ?? -- 查看表 t 的記錄
?
??????????? ORA_ROWSCN ???????? ID COL
??????????? ---------- ---------- --------------------
??????????? ?? 1874406 ????????? 1 ABC
??????????? ?? 1874406 ????????? 2 DEF
??????????? ?? 1874406 ????????? 3 GHI ??????????
???????
??????????? SQL > shutdown immediate ;
???????????
??????????? SQL > startup mount exclusive ;
???????????
??????????? SQL > flashback database to restore point bef_damage ; ? -- 實施時點閃回
???????????
??????????? SQL > alter database open resetlogs ;
???????????
??????????? SQL > select * from t ; ?? -- 閃回成功后,閃回點之后的數據丟失
?
??????????????????? ID COL
??????????? ---------- --------------------
??????????????????? ? 1 ABC
??????????????????? ? 2 DEF
??????????????????? ?
??? 2. 使用 RMAN 進行 flashback database
??????? 使用 RMAN 進行閃回數據庫的幾種常用辦法
??????????? RMAN > flashback database to scn = 918987 ;
??????????? RMAN > flashback database to sequence = 85 ? thread = 1 ;
??????? SQL > create table scott . tb_emp as select * from scott . emp ;
?
??????? SQL > select count ( 1 ) from scott . tb_emp ;
?
??????? ? COUNT ( 1 )
??????? ----------
??????????????? 14
?
??????? SQL > select to_char ( sysdate , 'yyyy-mm-dd hh24:mi:ss' ) tm from dual ;
?
??????? TM
??????? -------------------
??????? 2010 - 10 - 24 13 : 59 : 38
?
??????? SQL > drop table scott . tb_emp ;
?
??????? SQL > shutdown abort ;
???
??????? SQL > startup mount ;
?
??????? RMAN > ? flashback database
??????? 2 > to time = "to_date('2010-10-24 13:59:00','yyyy-mm-dd hh24:mi:ss')" ;
?
??????? SQL > select count ( 1 ) from scott . tb_emp ;
?
??????? ? COUNT ( 1 )
??????? ----------
??????????????? 14
?
??????? 查詢視圖: v$recovery_file_dest 將顯示閃回區的使用情況
??????? SQL > select name , space_limit / 1024 / 1024 sp_limt
??????? ? 2 ?? , space_used / 1024 / 1024 sp_usd , space_reclaimable / 1024 / 1024 sp_recl ,
??????? ? 3 ? number_of_files num_fils from v$recovery_file_dest ;
?
??????? NAME ???????????????????????????????????????????? SP_LIMT ???? SP_USD ??? SP_RECL ?? NUM_FILS
??????? --------------------------------------------- ---------- ---------- ---------- ----------
??????? / u01 / app / oracle / flash_recovery_area ???????????????? 2048 472.070313 380.671875 ???????? 18
?
??????? 可以將某些表空間排除在閃回之外
?
??????? SQL > alter tablespace users flashback off ;
?
??????? SQL > select name , flashback_on from v$tablespace where ts# = 4 ;
?
??????? NAME ??????????? FLA
??????? --------------- ---
??????? USERS ?????????? NO
?
??????? 如果需要對上述表空間啟用閃回功能,則需要在 mount 模式下對該表空間進行開啟該功能。
?
五、總結
閃回策略是針對 Oracle 撤銷功能的增強,為快速恢復數據庫提供了更多的便利。數據庫的閃回恢復的速度要快于 RMAN 以及基于用戶管理的備份與恢復,其主要原因是因為數據庫閃回使用的是閃回日志,而閃回日志中保存的是數據塊的完整鏡像。其次閃回能夠恢復的程度取決于閃回空間的大小以及閃回的保留策略,閃回空間大小會被循環使用,而閃回的保留策略則決定了閃回日志保留的時間長度。總之,合理的平衡恢復速度與可用空間依賴于具體服務要求。
???
六、 更多參考 ???
有關基于用戶管理的備份和備份恢復的概念請參考:
??????? Oracle 冷備份
??????? Oracle 熱備份
??????? Oracle 備份恢復概念
??????? Oracle 實例恢復
??????? Oracle 基于用戶管理恢復的處理 ( 詳細描述了介質恢復及其處理 )
???????
??? 有關 RMAN 的恢復與管理請參考:
??????? RMAN 概述及其體系結構
??????? RMAN 配置、監控與管理
??????? RMAN 備份詳解
??????? RMAN 還原與恢復
???????
??? 有關 Oracle 體系結構請參考:
??????? Oracle 實例和Oracle 數據庫(Oracle 體系結構)
??????? Oracle 表空間與數據文件
??????? Oracle 密碼文件
??????? Oracle 參數文件
??????? Oracle 聯機重做日志文件(ONLINE LOG FILE)
??????? Oracle 控制文件(CONTROLFILE)
??????? Oracle 歸檔日志
?
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
