1.查看資料庫歸檔和閃回狀態,及環境準備SQL> archive log list;SQL> select flashback_on from v$database;關閉資料庫,啟動歸檔和閃回SQL> shutdown immediate;啟動到mount模式SQL> startup mount;開 ...
1.查看資料庫歸檔和閃回狀態,及環境準備
SQL> archive log list;
SQL> select flashback_on from v$database;
關閉資料庫,啟動歸檔和閃回
SQL> shutdown immediate;
啟動到mount模式
SQL> startup mount;
開啟歸檔
SQL> alter database archivelog;
如果歸檔沒有打開,打開歸檔[因為flashback依賴Media recovery,所以在打開flashback之前必須先啟用歸檔]
SQL> alter database flashback on;
SQL> alter database open;
SQL> archive log start;
SQL> archive log list;
啟用閃回資料庫
要想使用Flashback Database, 必須使用Flash Recovery Area。 要配置的2個參數如下,一個是大小,一個是位置。如果資料庫是RAC,flash recovery area 必須位於共用存儲中。資料庫必須處於archivelog 模式.參數db_flashback_retention_target控制閃回日誌的保留時間,預設是1440,即24小時。
SQL>alter system set db_flashback_retention_target=2880;設置歸檔時間:(預設的是一天1440分鐘)
SQL> show parameter db_flashback_retention_target;(查詢歸檔時間)
設置撤銷表信息:
alter system set undo_managerment=auto;設置為auto才可以使用閃回查詢
alter system set undo_retention=900 SCOPE=BOTH;最長保留時間(單位秒)
alter system set undo_tablespace=undotbs1;
SQL> show parameter undo;(查詢undo撤銷時間)
關於Oracle閃回的打開和關閉,主要就是需要註意以下幾點:
1、閃回打開的前提是資料庫歸檔必須打開
2、閃回打開/關閉和歸檔打開/關閉一樣,都是在mount模式下
3、如果要在打開閃回的資料庫上關閉歸檔則必須先關閉依賴於歸檔的閃回功能
關於V$flashback_database_log
Flashback Database 所能回退到的最早時間,取決與保留的Flashback Database Log 的多少, 該視圖就可以查看許多有用的信息。
Oldest_flashback_scn / Oldest_flashback_time : 這兩列用來記錄可以恢復到最早的時點
Flashback_size: 記錄了當前使用的Flash Recovery Area 空間的大小
Retention_target: 可以恢復的時間長度
Estimated_flashback_size: 根據恢復時間長度對需要的空間大小的估計值
SQL> select Oldest_flashback_time,Oldest_flashback_scn,Flashback_size,Retention_target,Estimated_flashback_size from V$flashback_database_log;
關於v$flashback_database_stat
這個視圖用來對Flashback log 空間情況進行更細粒度的記錄和估計。 這個視圖以小時為單位記錄單位時間內資料庫的活動量, Flashback_Data 代表 Flashback log 產生數量, DB_Date 代表數據改變數量, Redo_Date 代表日誌數量,通過這3 個數量可以反映出數據的活動特點,更準確的預計 Flash Recovery Area 的空間需求
SQL> select BEGIN_TIME bt,END_TIME et,FLASHBACK_DATA fd,DB_DATA dd,REDO_DATA rd,ESTIMATED_FLASHBACK_SIZE efs from v$flashback_database_stat;
v$flashback_database_logfile
該視圖主要記錄閃回日誌的詳細信息,NAME閃回日誌的位置,FIRST_CHANGE#閃回日誌中記錄的最早的SCN,FIRST_TIME閃回日誌中記錄的最早時間
SQL> select * from v$flashback_database_logfile;
2.Flashback Query閃回時間點查詢
閃回時間點查詢的另一種方法是首先用PL/SQL包dbms_flashback的enable_at_time或enable_at_scn存儲過程鎖定一個會話級別的閃回時間目標,即進入閃回模式,隨後的查詢命令就可以省略“as of”,但也能達到使用“as of”的閃回效果,直到調用dbms_flashback. disable存儲過程關閉閃回模式為止。
比如,將閃回模式會話定格在15分鐘前:
SQL> exec dbms_flashback.enable_at_time(systimestamp - interval '15' minute);
現在,雖然沒有“as of”子句,以下查詢命令的含義就是查看15分鐘前的hr.employees表:
需要註意此時若訪問SYSDATE、SYSTIMESTAMP等日期函數,它們的返回值還是正常的當前的值,而不是靜止在15分鐘以前。另外,處於閃回會話模式時,執行dml和ddl將報錯:
還有,SYS用戶不能調用enable_at_time和enable_at_scn
在回到過去對所有感興趣的表查詢一番後,再調用disable存儲過程關閉閃回會話模式回到正常狀態:
SQL> exec dbms_flashback.disable
Flashback Version Query(閃回版本查詢)
閃回版本查詢可以貫穿一定長度的時間視窗,通過只使用一條查尋命令就能返回該時間視窗內的不同時間點上的數據,其語法是在表名之後加“versions between”子句。
4.閃回數據歸檔(Flashback Data Archive)
閃回查詢對撤銷數據及參數undo_retention的依賴註定了它們在大事務量的情況下閃回時間視窗將會很小,想要查詢數月之前的“舊”數據絕對不可能,但在閃回數據歸檔面前這並不是不可能的。
閃回數據歸檔的工作原理
將原本只能保存在UNDO表空間的撤銷數據額外的以一種歷史表的形式保存在指定的普通表空間(permanent類型的表空間)中。並且不像undo_retention參數那樣是個影響整個資料庫的設置,閃回數據歸檔可以只為特定的表服務,這樣就可以長時間地保存感興趣的“舊”數據了。
閃回數據歸檔區
閃回數據歸檔區是閃回數據歸檔的歷史數據存儲區域,在一個系統中,可以有一個預設的閃回數據歸檔區,也可以創建其他許多的閃回數據歸檔區域。每一個閃回數據歸檔區都可以有一個唯一的名稱。同時,每一個閃回數據歸檔區都對應了一定的數據保留策略。例如可以配置歸檔區FLASHBACK_DATA_ARCHIVE_1中的數據保留期為1年,而歸檔區FLASHBACK_DATA_ARCHIVE_2的數據保留期為2天或者更短。 以後如果將表放到對應的閃回數據歸檔區,則就按照該歸檔區的保留策略來保存歷史數據。閃回數據歸檔區是一個邏輯概念,是從一個或者多個表空間中拿出一定的空間,來保存表的修改歷史,這樣就擺脫了對Undo撤銷數據的依賴,不利用undo就可以閃回到歸檔策略內的任何一個時間點上。
Flashback archive相關數據字典
* 代表DBA 或者User。
比如,在USERS表空間中創建一個能夠將“舊”數據保存1年的數據歸檔,取名為“FDA1”,操作者必須擁有“flashback archive administer”系統許可權:
SQL> create flashback archive fda1 tablespace users retention 1 year;
有了歸檔,就可以使用“flashback archive”子句在特定的表上啟用閃回數據歸檔功能了。比如,讓hr.employees使用fda1,從此該表的修改歷史將保留1年:
SQL> alter table t_dealer flashback archive fda1;
或新建一個歸檔閃回區給一個表空間或指定一個表空間
SQL>create flashback archive default fbar_1 tablespace "USERS" quota 100M
SQL>CREATE FLASHBACK ARCHIVE fbar_1 TABLESPACE "TBS_DATA1"
一個歸檔區可以不僅僅對應一個表空間,可以採用如下的命令增加或者刪除該歸檔區的表空間的個數,這樣也達到了增加或者減少該歸檔區空間的目的。
SQL>ALTER FLASHBACK ARCHIVE fbar_1 ADD TABLESPACE "TBS_DATA2" quota 20M;
也可以從歸檔區中刪除表空間。註意:這個刪除僅僅是表示從數據歸檔區刪除,並不是刪除該表空間。
4.刪除數據歸檔區fbar_2的表空間TBS_DATA2
SYS>ALTER FLASHBACK ARCHIVE fbar_2 REMOVE TABLESPACE "TBS_DATA2";
若執行以上命令的是個普通賬號,比如HR用戶,那麼其在執行命令前必須被授予“flashback archive”對象許可權,比如:
SQL> grant flashback archive on fda1 to hr;
使用“no flashback archive”子句可以關閉特定表上的閃回數據歸檔功能。執行該命令需要“flashback archive administer”系統許可權:
SQL> alter table t_dealer no flashback archive;
刪除整個數據歸檔區
SQL> drop flashback archive fla2;
Flashback Table
當一張表被修改後(非刪除)需要恢復指定表,需在修改表是記錄時間戳以便恢復。
SQL> select sysdate,timestamp_to_scn(sysdate) from dual; (修改數據時要記錄時間戳)
SYSDATE TIMESTAMP_TO_SCN(SYSDATE)
2017-08-16-16:17:52 196349262
使用數據歸檔前需要開啟表上的行遷移:
SQL> Alter table t_dealer enable row movement;
SQL> flashback table t_dealer to scn 196349262;
SQL> Alter table t_dealer disable row movement;(完成歸檔後關閉表上的行遷移)
若沒有記錄時間戳,這可以查詢指定時間內數據量來判斷數據是佛完整,來恢複數據。
SQL> select count(*) from T_T_THIRDPAY_ORDER_H as of timestamp to_timestamp('20170816 18:00:00','yyyy-mm-dd hh24:mi:ss');
COUNT(*)
325
使用數據歸檔前需要開啟表上的行遷移:
SQL> Alter table t_dealer enable row movement;
開始閃回
SQL> flashback table T_T_THIRDPAY_ORDER_H to timestamp to_timestamp('2011-5-9 13:00:00','yyyy-mm-dd hh24:mi:ss');
SQL> Alter table t_dealer disable row movement;(完成歸檔後關閉表上的行遷移)
Flashback Data
若沒有記錄時間戳,則可恢復整個資料庫
SQL> select to_char(OLDEST_FLASHBACK_TIME,'yyyy-mm-dd hh24:mi:ss') from v$flashback_database_log;
*TO_CHAR(OLDEST_FLAS
2017-08-16 11:23:46*
這個日期為能回退的最早時間,取決於保留的Flashback database log的多少
恢複數據到指定時間點
SQL> shutdown immediate;
SQL> startup mount;
SQL> flashback database to timestamp to_timestamp('2017-08-16 16:00:46','yyyy-mm-dd hh24:mi:ss');
恢覆成功後,最好先以readonly的方式打開資料庫,以確認恢復達到預期,如果沒有達到預期,還可以再進行恢復
SQL> alter database open read only;
檢查恢復完成後打開資料庫
恢覆成功後,以resetlog方式打開資料庫:
SQL> shutdown immediate;
SQL> startup mount
SQL> alter database open resetlogs;
查哪些表已經啟用了閃回數據歸檔
SQL>select * from dba_flashback_archive_tables;
查資料庫中所有的閃回數據歸檔
SQL>select flashback_archive_name,retention_in_days from dba_flashback_archive;
查有關閃回數據歸檔所使用的表空間的信息
SQL>select flashback_archive_name,tablespace_name,quota_in_mb from dba_flashback_archive_ts;
刪除閃回歸檔數據
SQL>drop flashback archive flash1;
Flashback Drop
Flashback drop是從Oracle 10g開始才有的功能,原理是每個表空間都會有嚴格回收站的邏輯區域,當drop時,被刪除的表及其關聯對象不會被物理刪除,只是轉移到回收站中,給用戶提供一個恢復的可能。
註意事項
對system表空間無效, 只能用於非系統表空間和本地管理的表空間
資料庫的版本不能低於10g,否則很多命令無法使用
對象的參考約束不會被恢復,指向該對象的外鍵約束需要重建。
對象能否恢覆成功,取決與對象空間是否被覆蓋重用。
當刪除表時,信賴於該表的物化視圖也會同時刪除,但是由於物化視圖並不會被放入recycle bin,因此當你執行flashback table to before drop 時,也不能恢復依賴其的物化視圖,需要dba 手工介入重新創建。
對於Recycle Bin中的對象,只支持查詢.
刪除幾張表,然後指定表恢復
Oracle11g則為flashback家族又帶來一個新的成員:flashback data archive。
初看起來,flashback data archive和flashback query沒有太大的不同,都是通過as of能夠查詢之前的數據,但是他們的實現機制是不一樣的。Flashback query是通過直接從undo中讀取信息來構造舊數據,這樣就有一個限制,就是undo中的信息不能被覆蓋。而undo段是迴圈使用的,只要事務提交,之前的undo信息就可能被覆蓋,雖然可以通過undo_retention等參數來延長undo的存活期,但這個參數會影響所有的事務,設置過大,可能導致undo tablespace快速膨脹。
Falshback data archive特性則通過將變化數據另外存儲到創建的flashback archive中,以和undo區別開來,這樣就可以通過為flashback archive單獨設置存活策略,使得可以閃回到指定時間之前的舊數據而不影響undo策略。並且可以根據需要指定哪些資料庫對象需要保存歷史變化數據,而不是將資料庫中所有對象的變化數據都保存下來,這樣可以極大的減少空間需求。