Oracle Flashback (9i & 10g) [zt]

tolywang發表於2008-01-31

第一章、前言

根據以往的經驗,很多操作失誤或者使用者錯誤,將導致應用停頓甚至終止,但是,實際上,防止這種誤操作的辦法是非常用限的。如果沒有良好的計劃與高超的技術,一個很小的錯誤將可能導致一個很大的影響,如錯誤的刪除(delete)資料或者是刪除(drop)一個表。

[@more@]

那怎麼樣來防止這種“不小心的操作呢”,Oracle從版本9開始,就開始提供了flashback query(閃回查詢)的功能,最初的功能也是很有限的,不僅完全依賴於自動Undo(AUM),對於droptruncateDDL操作是毫無辦法,而且,由於受到Undo空間限制,能閃回的時間也是有限的。Oracle的版本10中,對falshback做了巨大的改進,不再僅僅是侷限於AUM的閃回查詢了,甚至可以閃回整個資料庫,您將真正的回到操作之前的狀態。

在以下的章節中,我們將瞭解到如下的內容

1、 Oracle 9i開始的flashback query

2、 Oracle 9i開始的flashback exp

3、 Oracle 10gflashback database

4、 Oracle 10g flashback table

5、 Oracle 10g flashback drop

6、 Oracle 10g flashback version query

7、 Oracle 10g flashback transaction query

第二章、從Oracle 9i開始的flashback query

2.1Oracle 9iflashback query

在過去,如果使用者錯誤運算元據後,除了不完全恢復外,沒有好的解決辦法,到了Oracle9i,這一個難堪局面有所改善。Oracle 9i中提供了一項新的技術手段——flashback query(閃回查詢),這個功能的實現,由一個新的包DBMS_FLASH來實現。使用者使用閃回查詢可以及時取得誤操作前的資料,並可以針對錯誤進行相應的恢復措施。

如果需要用到閃回查詢,必須在init.ora或者是spfile.ora中設定以下引數UNDO_MANAGEMENT = AUTO ,在Oracle9i中,該引數預設就是AutoAUM)。與此相關的其它引數還有:

SQL> show parameter undo

NAME TYPE VALUE

-------------------------------- ----------- -----------

undo_management string AUTO

undo_retention integer 10800

undo_suppress_errors boolean FALSE

undo_tablespace string UNDOTBS

除了確保以上引數中的UNDO_MANAGEMENT = AUTO外,還要注意另外一個引數undo_retention = n(秒),它決定了能往前閃回的最大時間,從引數也可以看到,這個引數決定了Undo最多的儲存時間,越大的值,就會需要更多的Undo空間的支援。我們可以透過如下的命令來修改該引數

SQL> ALTER SYSTEM SET undo_retention = 1200;

System altered.

以上的命令,告訴OracleUndo資訊將保持1200(20分鐘),這個將確保任何提交後的資訊在Undo中將保持20分鐘,除了可以一定程度的防止Ora-01555錯誤外,Falshback query將也直接的應用到其中的資訊。

現在,我們用一個簡單的例子來說明Oracle 9iflashback query

1、建立FLASH使用者

SQL> create user flash identified by flash;

SQL> grant connect, resource to flash;

SQL> grant execute on dbms_flashback to flash;

SQL> connect flash/flash

2、建立一個測試表

SQL> CREATE TABLE tst(t number(5));

Table created.

SQL> INSERT INTO tst VALUES(1);

1 row created.

SQL> INSERT INTO tst VALUES(2);

1 row created.

SQL> COMMIT;

Commit complete.

SQL> CREATE TABLE keep_date (date_scn_tracking date);

Table created.

SQL> SELECT * FROM tst;

T

----------

1

2

注意在執行步驟3或者步驟4之前,等待5分鐘。

3. 刪除記錄

SQL> execute dbms_flashback.disable;

PL/SQL procedure successfully completed.

SQL> INSERT INTO keep_date select sysdate from dual;

1 row created.

SQL> COMMIT;

Commit complete.

SQL> DELETE FROM tst WHERE t = 1;

1 row deleted.

SQL> COMMIT;

Commit complete.

SQL> SELECT * FROM tst;

T

----------

2

透過以上的操作,我們插入了兩條記錄,並刪除了其中一條記錄,現在的結果是,我們這裡只有一條記錄了。在以下的操作中,我們將透過flashback query找到刪除的記錄

4. 閃回查詢

SQL> declare

2 restore_scn date;

3 begin

4 select date_scn_tracking into restore_scn from keep_date;

5 dbms_flashback.enable_at_time(restore_scn);

6 end;

7 /

PL/SQL procedure successfully completed.

SQL> SELECT * FROM tst;

T

----------

1

2

可以看到,雖然我們刪除記錄並提交了,但是透過特定操作,我們還能查詢到刪除前的兩條記錄,

這裡需要特別注意的是,Oracle 9i是每五分鐘記錄一次SCN的,並將SCN和對應時間的對映做個紀錄。如果原來插入的記錄到做閃回的時間在5分鐘之內,用基於時間的flashback可能並查詢不到記錄,因為如果是基於時間點的查詢,也是轉化為最近的一次SCN,然後從這個SCN開始進行恢復,因此,如果需要精確的查詢,我們可以採用基於SCNflashback,它將能精確的閃回到需要恢復的時間,關於獲取SCN,我們可以透過DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER或者LOGMNR。如

DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER(SCN_NUM);

來定位你的恢復時間點,下面是使用方法:

SQL> VARIABLE SCN_SAVE NUMBER;

SQL>EXECUTE :SCN_SAVE := DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER;

PL/SQL procedure successfully completed.

SQL> print SCN_SAVE;

SCN_SAVE

----------

2.1202E+11

SQL>execute DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER(:SCN_SAVE);

最後注意,Oracle 9iFlashback有如下限制。

·採用時間點的恢復,不能精確到最近5分鐘,如果需要更精確的查詢,需要採用SCN

·不能flashback5天以前的資料,這個並不是undo_retention所能決定的。

·閃回查詢無法恢復到表結構改變之前,因為閃回查詢使用的當前的資料字典。

·由於受到undo_retention的影響,對於undo_retention之前的時間,flashback不保證能成功

·對於drop,truncate等不記錄回滾的操作,flashback是無能為力的。

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

相關文章