基於時間戳閃回資料庫

skyin_1603發表於2016-10-03
我的上一篇部落格講述基於系統改變號SCN閃回資料庫,在這裡再講述一下基於時間戳的閃回資料庫技術。更多的情況下,
基於時間戳的閃回資料庫更多使用,我在前面的一篇博文中也有所提到,基於時間戳(timestamp)與基於SCN兩種的閃回技術,都可以相互
轉換,轉換函式為:timestamp_to_scn() 與 scn_to_timestamp(),只要便於知道哪一個為先,就用哪一種。
以下讓我們一起進入Scott使用者建立一個實驗表來驗證基於時間戳的閃回資料庫技術:

1、登入Scott使用者:
conn scott/tiger0520
2、建立實驗表,插入資料並查詢:

SQL> create table fbdb_time as select * from fbdb_scn where 1=2;

Table created.
第一條資料

SQL> insert  into  fbdb_time  select  1  as

  2  id,dbms_flashback.get_system_change_number as scn,

  3  sysdate as dd from dual;     

第二條資料 

SQL> insert  into  fbdb_time  select  2  as

  2  id,dbms_flashback.get_system_change_number as scn,sysdate as dd from dual;

1 row created.

SQL> commit;

Commit complete.

 第三條資料

SQL> insert  into  fbdb_time  select  3  as

  2  id,dbms_flashback.get_system_change_number as scn,sysdate as dd from dual;

1 row created.

SQL> commit;

Commit complete.

SQL> select * from fbdb_time;

        ID        SCN DD

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

         1     781596 2016-10-02 10:24:18

         2     781618 2016-10-02 10:25:24

         3     781629 2016-10-02 10:25:45
3、同樣的,刪除使用者Scott模擬損壞資料庫:

SQL> drop user scott cascade;

User dropped.

SQL> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL>

4、開啟資料庫到mount狀態,並逐步驗證資料庫的恢復狀況:

SQL> startup mount;

ORACLE instance started.


Total System Global Area  835104768 bytes

Fixed Size                  2257840 bytes

Variable Size             587205712 bytes

Database Buffers          243269632 bytes

Redo Buffers                2371584 bytes

Database mounted.

SQL>flashback database to timestamp sysdate-15/1440 ;

Flashback complete.

SQL> alter database open read only;

此時,檢視資料是否閃回到預期的狀態

SQL> select * from fbdb_time;

        ID        SCN DD

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

         1     781596 2016-10-02 10:24:18

此時發現,還沒有完全恢復
我們繼續關閉資料庫,再次進行恢復

SQL> shutdown abort;

ORACLE instance shut down.

SQL> startup mount;

ORACLE instance started.


Total System Global Area  835104768 bytes

Fixed Size                  2257840 bytes

Variable Size             587205712 bytes

Database Buffers          243269632 bytes

Redo Buffers                2371584 bytes

Database mounted.
閃回資料庫到時間點為2016-10-02 10:25:30,開啟到只讀狀態,並查詢資料:

SQL> flashback database to timestamp   

  2  to_date('2016-10-02 10:25:30','yyyy-mm-dd hh24:mi:ss');

Flashback complete.

SQL> alter database open read only;

SQL> select * from fbdb_time;

        ID        SCN DD

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

         1     781596 2016-10-02 10:24:18

         2     781618 2016-10-02 10:25:24

這時候,比上一次的閃回,查詢到多了一條資料,這樣算儘量地恢復完整,降低資料的損失率
這下,我們就放心再次關閉資料庫,閃回到時間點為2016-10-02 10:25:30時的狀態,並以

alter database open RESETLOGS方式開啟資料庫

SQL> shutdown abort;

ORACLE instance shut down.

SQL> startup mount;

ORACLE instance started.


Total System Global Area  835104768 bytes

Fixed Size                  2257840 bytes

Variable Size             587205712 bytes

Database Buffers          243269632 bytes

Redo Buffers                2371584 bytes

Database mounted.


SQL> alter database open RESETLOGS;

Database altered.

SQL> select * from scott.fbdb_time;

       ID        SCN DD

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

         1     781596 2016-10-02 10:24:18

         2     781618 2016-10-02 10:25:24


這樣,多次驗證在沒有的資料丟失的情況下,我們可以以RESETLOGS方式開啟資料庫。

注意:
基於事件的閃回一般都沒有準確的閃回時間點,那麼就需要我們做到儘量精確,把資料的損失降低到
以 最小,那麼就需要我們多次的重複以 read only  方式開啟資料庫。就像一個形容包子餡兒小的笑話說的
那樣:“吃包子,第一口沒吃到餡兒,第二口,過去了”。我們基於時間的閃回資料庫也是一樣,不要衝動
接 的大約一個時間閃回,閃回完成後就直接 resetlogs  開啟,只要以 resetlogs  開啟後,就不可逆了,
的 作為合格的 DBA ,一定要把損失控制到最小,所以,要多次以 read only  方式 開啟驗證才是上策。




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

相關文章