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)。
Flashback DROP
Flashback Drop 用於 table recovery,透過 flashback drop,被刪除(不包含 truncate)的表格,可復原和無法復原的物件如下
- 可復原物件: table, index, grant, triggers, grants, unique-key, primary-key, not-null constraints。
- 無法復原物件:foreign constraints
DROP 以後,物件會被放置到 Recyclebin,可用 USER_RECYCLEBIN 或是 DBA_RECYCLEBIN 來查詢
舉例來說,以下刪除某個表格
刪除以後查詢回收桶select OBJECT_NAME, ORIGINAL_NAME, OPERATION, TYPE, CAN_UNDROP, CAN_PURGE from user_recyclebin;
查詢後透過 FLASHBACK 復原
SQL> flashback table emp_082209 to before drop; Flashback complete.上述命令亦可改為
SQL> flashback table emp_082209 to before drop rename to new_name;
也可以透過ENTERPRISE MANAGER 的DATABASE CONTROL 來復原,但必須以 SYSDBA 身分登入,選擇以下路徑
使用狀態 ==> 管理 ==> 執行復原 ==> 下拉選單選擇(表格) ==> 倒溯刪除的表格 ==> 綱要名稱 (輸入 HR ) ==> 執行
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> ALTER TABLE XXX ENABLE ROW MOVEMENT ;
假設欲刪除某表格最後一筆資料如下
先記錄時間戳記,將表格開放 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.刪除以後該筆資料消失
以 FLASHBACK TABLE 命令復原該表格至前述時間戳記(或之前)
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。這些資訊被包含在表格的數個虛擬欄位當中 (ROW ID也是虛擬欄位),虛擬欄位有:
- VERSIONS_STARTSCN
- VERSIONS_STARTTIME
- VERSIONS_ENDSCN
- VERSIONS_ENDTIME
- VERSIONS_XID
- VERSIONS_OPERATION
欲查詢上述虛擬欄位,需在查詢時,在SQL中使用關鍵字 VERSIONS BETWEEN ,例如,
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 between scn minvalue and maxvalue
- versions between timestamp (SYSTIMESTAMP- 1/24) and SYSTIMESTAMP
- versions between timestamp to_timestamp('19-09-17 08:10:00','dd-mm-yy hh24:mi:ss') and SYSTIMESTAMP
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
- Create flashback archive
- Create user & schema that using the flashback data archive
- Grant flashback archive on
to user - Alter table
flashback archive
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 來觀察使用狀況
- dba_flashback_archive
- dba_flashback_archive_ts
- dba_flashback_archive_tables