一、閃回資料庫 flashback database
1、可以處理的情境:
1)誤刪使用者
2)truncate table
3)多表資料發生混亂
2、閃回資料庫條件
1)資料庫配置為歸檔模式
2)配置了閃回恢複區(FRA:flash recovery area)
SQL>show parameter db_recovery_file; ------包括路徑和使用空間大小
3)配置閃回保留時間
SQL>show parameter db_flashback_retention_target; -------注意:單位是分鐘 如:1440 = 24小時
SQL>alter system set db_flashback_retention_target = 1440;
4)啟動閃回資料庫
在資料庫是mount狀態下,執行命令
SQL>alter database flashback on;
SQL>alter database flashback on; ----注意:一旦關閉閃回資料庫,FRA日誌全部自動刪除
例子:
SQL>shutdown immediate;
SQL>startup mount exclusive;
SQL>flashback database to timestamp to_date('20091201201030','yyyymmddhh24miss');
恢複到某個時間點上後,read only 開啟資料庫確認後,再重啟動資料庫,並以resetlogs 方式開啟資料庫,保證閃回日誌存在,以便再次閃回。
SQL>alter database open read only;
SQL>select * from .... ----確認恢複的資料
SQL>shutdown immediate;
SQL>startup mount;
SQL>alter database open resetlogs;
閃回是根據閃回日誌來恢複的,也可以根據閃回日誌的SCN號進行閃回。
SQL>flashback database to scn 4879890;
另外,可以用RMAN進行閃回操作,資料庫啟動到mount狀態
[Oracle@book ~]$ export NLS_LANG=american_america
[oracle@book ~]$ export NLS_DATE_FORMAT='yyyymmddhh24miss'
[oracle@book ~]$ rman target /
RAMN> flashback database to time='20091201203010';
或RMAN> flashback database to time='20091201203010';
注意:可以在v$flashback_database_log 相關的閃回資訊。
estimated_flashback_size:根據當前產生的閃回日誌速度,db_flashback_retention_target時間長度,大概需要產生多少日誌。
flashback_size:當前閃回日誌佔用多少位元組的空間
oldest_flashback_scn:當前能閃回最多能閃回到的scn
oldest_flashback_time:當前能閃回最多的時間點
為了避免閃回日誌因為空白間或其他原因而被自動刪除,無法閃回到指定時間點,可以在某個時間點先建立 restore point
SQL>create restore point wuxzh_001 guarantee flashback database;
一旦後續處理失敗,可以閃回到操作之前的時間點。
二、閃回刪除 flashback drop
1、drop table 實際沒有完全刪除,而是改名,存放在資源回收筒(recycle bin),對應的觸發器、索引等一起進入recycle bin。
通過 dba_recyclebin 或 user_recyclebin 可以查到被刪除的對象。
show recyclebin 命令也可以看到目前使用者變刪除表的資訊。
SQL>show recyclebin;
oracle 使用空間規則:使用資料表空間裡不屬於資源回收筒的對象所佔用的可用空間,釋放資源回收筒所佔用的空間(先釋放最老的對象),對資料檔案擴充(定義了自動擴充)。
一旦資源回收筒被釋放,就無法閃回。
2、閃回語句:
SQL>flashback table t to before drop;
SQL>flashback table t to before drop rename to t_new; --閃回並改名字
閃回後索引並行重建
如果一個表建多次,並drop多次。recycle bin 有多條記錄,閃回時,按照“先進後出(FILO)”方式來閃回表。
另外也可以根據recyclebin裡顯示的表面進行閃回。
SQL>flashback table "FSFASnFMMFDmfd==$0" to before drop; ---含有特殊符號,使用雙引號。
如果無法確定表名,使用下面語句確認
SQL>desc "FSFASnFMMFDmfd==$0";
SQL>select count(*) from "FSFASnFMMFDmfd==$0";
3、被刪除的對象的空間回收
1)自動回收
oracle 使用空間規則:使用資料表空間裡不屬於資源回收筒的對象所佔用的可用空間,釋放資源回收筒所佔用的空間(先釋放最老的對象),對資料檔案擴充(定義了自動擴充)。
一旦資源回收筒被釋放,就無法閃回。
2)手工回收
SQL>purge table t; --回收已經刪除的表t,如果有多個,只回收最早刪除的表。
SQL>purge index idx_t;
SQL>purge tablespace users; --清除資源回收筒裡屬於users資料表空間的對象所佔用的空間
SQL>purge user_recyclebin; --清除資源回收筒裡屬於目前使用者的所有對象所佔用的空間
SQL>purge dba_recyclebin; --清除資源回收筒裡屬於所有對象所佔用的空間
以下語句無法閃回
SQL>drop table t purge;
SQL>drop user wuxzh cascade constraints;
SQL>drop tablespace users including contents;
三、閃回表 flashback table
1、閃回表利用的是undo資料表空間裡記錄的資料被改變前的值。
如果保留時間超過undo_retention所指定的值,導致資料被其他事務覆蓋,則無法閃回。
2、閃回後可能資料在資料庫儲存的轉移,閃回前,必須啟動資料行的轉移特性。
SQL>alter table t enable row movement;
3、閃回
SQL>delete table t;
SQL>commit;
SQL>flashback table to timestamp to_date('20091201203010','yyyymmddhh24miss');
可以不斷修改閃回時間,是閃回結果符合要求。
注意:如果表做個DDL操作,則無法閃回,另外sys下的表是不能閃回的。
四、閃回版本查詢 flashback version query
1、所謂版本,就是每次事務引起的資料行的變化情況,每次變化就是一個版本。
2、查看versions 表確定對應的事務。
3、閃回版本查詢不支援外部表格、暫存資料表、X$表(動態效能檢視的基表)以及視圖。
五、閃回事務查詢 flashback transaction query
1、閃回視圖查詢指的是一個視圖 : flashback_transaction_query
同時,也是一個診斷工具,用於確定哪些事務引起的資料的變化,並且提供了撤銷事務的SQL語句。
2、閃回事務查詢利用的是undo資料表空間裡的undo資料。
3.可以把閃回版本查詢和閃回事務查詢結合起來,通過閃回版本查詢查到事務的ID,再利用閃回事務查詢,找到對應的undo sql。
六、閃回查詢 flashback query
SQL>select * from t as of timestamp to_date('20091201203010','yyyymmddhh24miss');
SQL>select * from t as of timestamp to_timestamp('20091201203010','yyyymmddhh24miss');
SQL>create table t_bak as select * from t as of timestamp to_date('20091201203010','yyyymmddhh24miss');