標籤:name byte 操作 -o MF 成功 配置 clu 使用者管理
轉載自:http://blog.csdn.net/leshami/article/details/6100429
閃回技術通常用於快速簡單恢複資料庫中出現的認為誤操作等邏輯錯誤,從閃回的方式可以分為基於資料庫層級閃回、表層級閃回、事務層級閃回,根據閃回對資料的影響程度又可以分為閃回恢複,閃回查詢。閃回恢複將修改資料,閃回點之後的資料將全部丟失。而閃回查詢則可以查詢資料被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以及基於使用者管理的備份與恢複,其主要原因是因為資料庫閃回使用的是閃回日誌,
而閃回日誌中儲存的是資料區塊的完整鏡像。其次閃回能夠恢複的程度取決於閃回空間的大小以及閃回的保留原則,閃回空間大小會被迴圈使用,而閃回的保留原則則決定了閃回日誌保留的時間長度。總之,合理的平衡恢複速度與可用空間依賴於具體服務需求。
1. Oracle 閃回特性(FLASHBACK DATABASE)