Oracle的flashback功能

xz43發表於2013-06-17
從Oracle 10g開始,透過使用flashback table語句不僅可以快速恢復表,而且也不影響任何其他表空間和其他表。在Oracle 10g中,當執行drop table操作時,表結構和資料不會被立即清除,而是被放在資料庫的回收站(Recyclebin)中。如果表段所在表空間足夠大,那麼其內容可能永遠不會被清除,此時透過flashback table可以快速恢復。

SQL>  flashback table emp to before drop;
或者
SQL> flashback table emp to before drop rename to emp3;

其實除了上面的DDL外,DML也可以透過flashback來恢復。

SQL> create table emp(sal number(10,1),id number);

Table created.

SQL> insert into emp values(2000,1);

1 row created.

SQL> insert into emp values(3000,2);

1 row created.

SQL> insert into emp values(3500,3);

1 row created.

SQL> commit;

Commit complete.

SQL> select * from emp;

       SAL         ID
---------- ----------
      2000          1
      3000          2
      3500          3

SQL> select to_char(sysdate,'yyyy-MM-dd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,'YY
-------------------
2013-06-17 15:57:52

SQL> update emp set sal=sal*1.1 ;        

3 rows updated.

SQL> commit;

Commit complete.

SQL> select * from emp;

       SAL         ID
---------- ----------
      2200          1
      3300          2
      3850          3

SQL> alter table emp enable row movement;

Table altered.

SQL> update emp set sal=sal*1.1 ;        

3 rows updated.

SQL> commit;

Commit complete.

SQL> select * from emp;

       SAL         ID
---------- ----------
      2420          1
      3630          2
      4235          3

SQL> flashback table emp to timestamp to_timestamp('2013-06-17 15:57:52','yyyy-MM-dd hh24:mi:ss');

Flashback complete.

SQL> select * from emp;

       SAL         ID
---------- ----------
      2000          1
      3000          2
      3500          3

SQL> 

可以看到,即使已經修改過2次,透過flashback table 還是可以把資料表的資料閃回到指定的時間點。唯一需要注意的是,必須啟用表的行移動特性。另外,flashback table 所能恢復到的最早時間受限於初始化引數db_flashback_retention_target。
SQL> show parameter db_flashback_retention_target

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_flashback_retention_target        integer     1440

除了上面的flashback table功能外,從oracle 10g開始,增加了flashback database功能可以將資料庫快速恢復到先前時間點。flashback database不能用於恢復介質失敗,並且使用flashback database必須滿足以下條件:
1)資料庫必須處於 ARCHIVELOG 模式
2)必須啟用資料庫的 flashback 特徵
3)必須合理配置初始化引數db_flashback_retention_target,該引數用於控制可以恢復到的最早時間點。
配置資料庫支援:
SQL> startup mount
SQL> alter database archivelog;
SQL> alter system set db_recovery_file_dest_size=2g;
SQL> alter system set db_recovery_file_dest='/app/flash_recovery_area';
SQL> alter database flashback on;
SQL> alter system set db_flashback_retention_target=3600;
SQL> alter database open;
雖然啟用了資料庫的flashback,仍可以禁止特定表空間的flashback特徵:
SQL> alter tablespace TEST flashback off;

透過查詢試圖 v$flashback_database_log 可以確定flashback database命令可以恢復到的最早時間點:
SQL> select oldest_flashback_scn,oldest_flashback_time from v$flashback_database_log;
 
最後,透過SQL或者RMAN方式使用flashback database命令,以及 to scn選擇或 to time選項。
SQL> startup mount
SQL> flashback database to scn 199468094;
SQL> alter database open resetlogs;
或者
RMAN> shutdown immediate
RMAN> startup mount
RMAN> flashback database to time ‘2013-08-22 10:20:13’;
RMAN> alter database open resetlogs;
為保險起見,可以先不要以resetlogs的形式開啟資料,而是採用read only的方式開啟,確認結果不對,則繼續flashback,確認結果成功,則用resetlogs的方式開啟。


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

相關文章