Oracle閃回技術之閃回資料庫

壹頁書發表於2015-01-19
OCA/OCP認證考試指南 580頁

Oracle閃回技術包括
1.閃回資料庫
2.閃回查詢、事務和表
3.閃回刪除
4.閃回資料歸檔

閃回資料庫
    可以將資料庫回退到過去的某一時刻,效果等同於不完整恢復.他將丟失在閃回點之後的所有資料,因為他必須使用resetlogs開啟資料庫.
它可以恢復一些邏輯錯誤,比如update語句忘記了where過濾條件,導致整個表的資料被修改.
   
    閃回資料庫不能撤銷物理損壞,而只能恢復使用者錯誤造成的邏輯錯誤.
   
    啟用閃回資料庫,修改的塊的映象會不時的從資料庫緩衝區複製到SGA內的閃回緩衝區,由恢復寫入器(Recovery Writer,RVWR)將閃回緩衝區寫入磁碟和閃回日誌.閃回日誌記錄的是完整塊映象的日誌.
    閃回資料庫從效能考慮,並不會將所有塊的變化寫入閃回日誌.
    假設有一個資料塊A,每十分鐘改變一次.那麼從10點到11點,改變了6次,但是很可能只有兩次變更寫入了閃回日誌.
    假設資料塊A,10:00和10:30的變更寫入了閃回日誌,而現在需要將資料庫閃回至10:15.
    閃回資料庫首先會找到塊A在10:00變更的完整映象,然後應用redolog,將資料塊A的變更推到10:15.
    
    這個恢復的方式雖然和RMAN不完整恢復相似,但是閃回資料庫更加方便和快捷.
    假設有一個凌晨4點的RMAN備份,如果在上午11點發生了使用者錯誤,使用RMAN不完整恢復,恢復到10:30.這實際上是將資料庫所有的塊(凌晨4點的版本)應用redolog向前推進至10:30
    
    而閃回資料庫則不同,閃回日誌只記錄發生變化的塊.按照上面的例子,只需要在閃回日誌中找到10:30之前的最近一個資料塊的版本,應用redolog即可.所以閃回資料庫相對於RMAN不完全恢復有如下的優點
1.只恢復有變化的資料塊(RMAN需要恢復所有的資料塊)
2.從最近的一個資料塊版本恢復(按照上面的例子,閃回資料庫很可能從10:20的一個資料塊開始恢復,而RMAN不完全恢復統統是從凌晨4點的資料塊開始恢復)
                
配置閃回資料庫
1.開啟歸檔模式,並確認閃回區


開啟歸檔模式的命令如下:
shutdown immediate;
startup mount;
alter database archivelog;
alter database open;

2.設定閃回保留目標時間
由db_flashback_retention_target引數控制,單位為分鐘,預設是1440(一天)

設定為兩天
alter system set db_flashback_retention_target=2880 scope=both;

3.重啟資料庫,啟用閃回日誌記錄
shutdown immediate;
startup mount;
alter database flashback on;
alter database open;

4.確認開啟了閃回日誌
select flashback_on from v$database;

有兩個檢視可以檢視閃回的資訊
set linesize 300;
select * from v$flashback_database_log;
select * from v$flashback_database_stat;

閃回緩衝區大小不受DBA控制,但是可以檢視
select * from v$sgastat where name='flashback generation buff';


使用閃回資料庫恢復
1.建立實驗表
建立時間在22:14左右


2.模擬失誤的使用者操作.
使用者錯誤的truncate了表


3.執行閃回資料庫

SQL> shutdown abort;
SQL> startup mount;
然後閃回資料庫到發生事故的時間點左右.
flashback database to timestamp
to_timestamp('2015-01-19 22:13:00','yyyy-mm-dd HH24:mi:ss');
然後以只讀方式開啟資料庫,確認資料
SQL> alter database open read only;

當然,此時實驗表尚未建立
SQL> select table_name from user_tables;
no rows selected

繼續前推
shutdown abort;
startup mount;
recover database until time '2015-01-19 22:15:00';
alter database open read only;

可以看到資料已經回來了
SQL> select table_name from user_tables;
TABLE_NAME
------------------------------
T

SQL> select count(*) from t;
  COUNT(*)
----------
       999
SQL>

這時候,就可以以resetlogs開啟資料庫,閃回資料庫完成
shutdown abort;
startup mount;
alter database open resetlogs;

這裡需要注意兩點
1.一旦確認了恢復的時間點,並以resetlogs方式開啟資料庫,則該時間點之後的資料統統丟失.不能恢復了
2.閃回資料庫需要歸檔日誌,也就是說閃回目標保留時間(db_flashback_retention_target)要小於等於歸檔日誌保留時間.
否則,歸檔日誌因為備份策略的原因被刪除,則不能保證閃回資料庫的效果.


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

相關文章