flashback 只可用在 table drop,不含 table truncation
flashback drop, flashback query, flashback transaction, flashback table 不須額外的設定
flashback database: 有異動的block images ,定期由database buffer cache,寫入到 flashback buffer(SGA內)
Configuring Flashback Database
- 確認處於 Archive Log Mode select log_mode from v$database;
- 設定 FLASH Recovery Area
alter system set db_recovery_file_dest = '/flash_recovery' ; alter system set db_recovery_file_dest_size = 8G;
shutdown immediate; startup mount;
Flashback usage statistics
設定完成後,有以下動態VIEW可觀察v$flashback_database_log
v$flashback_database_stat
v$sgastat
select * from v$sgastat where name = 'flashback generation buff';
觀察 SGA 中,FLASHBACK 的記憶體使用狀態
Flashback enable
下圖顯示啟動 FLASHBACK 的過程啟動後再觀察上述動態 VIEW , 可發現上述動態VIEW不再毫無資料
Database recovery point-in-time using Flashback
以下建立一個TABLE,並記錄現在時間,然後將表格刪除,再使用 Database Control 進行復原 以下使用 RMAN 進行復原在復原前,資料庫必須處於 MOUNT 狀態,然後執行復原
RMAN> shutdown immediate; RMAN> startup mount; RMAN> run{ flashback database to time "to_date('2017-09-18 01:20:22', 'YYYY-MM-DD HH24:MI:SS')"; } RMAN> alter database open resetlogs;執行畫面如下
執行完畢後,再重新查詢,可再找到該表格
Exclude tablespaces from Flashback Logging
啟動 flashback 後,會將 block 的異動寫入到 flashback logs,因此 logs 的成長會影響資料庫的效能,可將部分 TABLESPACE ,取消其 flashback logging查詢 TABLESPACES 的 FLASHBACK 啟動狀態可用下列指令
select name, flashback_on from v$tablespace;
取消 FLACKBACK
alter tablespace
開啟 FLASHBACK
alter tablespace
因為 FLASHBACK 是透過 CONTROLFILE 啟動,而非資料字典,因此其相關資訊需透過動態效能視表(dynamic performance view)查詢,如 v$tablespace,而非資料字典 (DBA_TABLESPACES)。
DROP 以後,物件會被放置到 Recyclebin,可用 USER_RECYCLEBIN 或是 DBA_RECYCLEBIN 來查詢
舉例來說,以下刪除某個表格
select OBJECT_NAME, ORIGINAL_NAME, OPERATION, TYPE, CAN_UNDROP, CAN_PURGE from user_recyclebin;
SQL> flashback table emp_082209 to before drop rename to new_name;
也可以透過ENTERPRISE MANAGER 的DATABASE CONTROL 來復原,但必須以 SYSDBA 身分登入,選擇以下路徑
使用狀態 ==> 管理 ==> 執行復原 ==> 下拉選單選擇(表格) ==> 倒溯刪除的表格 ==> 綱要名稱 (輸入 HR ) ==> 執行
常用語法如下:
SQL> ALTER TABLE XXX ENABLE ROW MOVEMENT ;
假設欲刪除某表格最後一筆資料如下
以 FLASHBACK TABLE 命令復原該表格至前述時間戳記(或之前)
這些資訊被包含在表格的數個虛擬欄位當中 (ROW ID也是虛擬欄位),虛擬欄位有:
欲查詢上述虛擬欄位,需在查詢時,在SQL中使用關鍵字 VERSIONS BETWEEN ,例如,
Flashback DROP
Flashback Drop 用於 table recovery,透過 flashback drop,被刪除(不包含 truncate)的表格,可復原和無法復原的物件如下
從版本 10g 以後,drop table命令,會將原有 table,以重新命名的方式,從資料字典移開
SQL> flashback table emp_082209 to before drop;
Flashback complete.
上述命令亦可改為 Flashback Query
Flashback Query最常使用在使用者不慎刪除某個表格內的某筆紀錄 (不是整個表格),透過它確認已經刪除的資料。
--查詢某個時間戳記,某表格的內容
SQL> select * from hr.emp_082209 as of timestamp to_timestamp('18-09-17 01:22:00','dd-mm-yy hh24:mi:ss') ;
--將某個表格,回逤到某個時間戳記
SQL> flashback table emp to timestamp to_timestamp('18-09-17 01:22:00','dd-mm-yy hh24:mi:ss') ;
--一次回朔兩個表格到某個 SCN ,同時啟用 TRIGGERS
SQL> flashback table emp, dept to scn 65544 enable triggers ;
前述回逤時間戳記,有一個先決條件,必須開啟 ROW MOVEMENT。語法如下:
SQL> select sysdate from dual;
SYSDATE
-------------------
2017-09-18 20:28:10
SQL> alter table hr.emp_082209 enable row movement;
Table altered.
SQL> delete from hr.emp_082209 where last_name='Jeng';
1 row deleted.
SQL> commit;
Commit complete.
刪除以後該筆資料消失
SQL> flashback table hr.emp_082209 to timestamp to_timestamp('18-09-17 20:28:00','dd-mm-yy hh24:mi:ss') ;
Flashback complete.
復原以後再查詢,可以看到原先被刪除的最後一筆資料又出現了。
Flashback Versions Query
Flashback Versions Query 可讓使用者查詢某表格中,一筆紀錄的數個committed versions。
為了實驗,我們在短時間內對某一筆的SALARY進行數次更新,然後我們進行 FLASHBACK VERSIONS QUERY
select employee_id, first_name, salary, VERSIONS_XID, VERSIONS_STARTSCN, VERSIONS_ENDSCN, VERSIONS_OPERATION
from emp_082209
versions between scn minvalue and maxvalue
where last_name='Jeng';
VERSIONS_OPERATION 包含下列:(I) INSERT (U) UPDATE (D) DELETE Flashback and Undo Data
Flashback 能復原的資料,端視存放在 UNDO DATA 的歷史資料而異。此區域的資料會被新的資料所覆蓋。UNDO DATA資料保留的時間長度,由參數 undo_retention 決定。
下圖顯示保留時間為900秒,也就是15分鐘。
如果該區域過小導致舊的資料被覆蓋,將會發生 ORA-1555 snapped too old 的錯誤訊息。
要改善此種狀況可透過設定TABLESPACE的參數 RETENTION GUARANTEE 來改善,或是透過下列的 FLASHBACK DATA ARCHIVE 來紀錄更多歷史資料。
FLASHBACK DATA ARCHIVE
FLASHBACK DATA ARCHIVE 使用額外的 TABLESPACE 來記錄歷史資料,其進行步驟如下
範例如下 :
create tablespace fda datafile '/oracle/app/oracle/oradata/sedb/fda1.dbf' size 10m;
create flashback archive fla1 tablespace fda retention 1 month;
CREATE USER fbdauser
IDENTIFIED BY xxxx
DEFAULT TABLESPACE fda
TEMPORARY TABLESPACE TEMP
PROFILE DEFAULT
ACCOUNT UNLOCK;
GRANT CONNECT TO fbdauser;
GRANT RESOURCE TO fbdauser;
ALTER USER fbdauser DEFAULT ROLE ALL;
-- 2 System Privileges for PROCHUB
grant dba to fbdauser identified by xxxx;
grant flashback archive administer to fbdauser;
grant flashback archive on fla1 to hr;
alter table hr.emp_082209 flashback archive fla1;
建立後,可透過下列 VIEW 來觀察使用狀況
例如: