利用閃回拯救我們的資料(五)

realkid4發表於2014-05-05

 

Oracle資料庫的閃回技術Flashback是作為傳統備份還原的一種補充被退出。在傳統的資料庫領域,一旦發生資料損壞,無論是使用者操作失誤,還是系統軟硬體故障,啟用之前進行的備份進行還原動作,是通常的做法。依據不同的備份策略,還原後的資料有是否丟失、丟失多少的問題。

Flashback的特點是恢復速度快、影響面小,對資源消耗情況比傳統的備份還原手段要低得多。如果發生單獨資料表資料丟失、事務操作失誤的情況,單獨使用flashback querytransaction就可以快速進行恢復,而且不會影響其他人使用資料庫。而且,Flashback將恢復的粒度從傳統備份中的“資料庫全庫-表空間-檔案-資料塊”的層面,擴充到“schema-資料表-資料行-事務”的細粒度。

從技術本身看,Flashback並不是一套全新的技術體系,不同的Flashback特性依據的是不同的技術基礎。比如,flashback query等就是依賴Undo前映象檢索到特定時間資料。Flashback Drop則是利用segment recyclebin的特性進行轉儲行為。而Flashback Database則是利用flashback log進行的資料還原。

本篇主要介紹Flashback Database的配置使用。在目前的各種Flashback中,Flashback Database是和其他技術相容應用比較廣泛的一種。在很多場合下,它是可以實現定點資料恢復的。

 

1、環境介紹

 

筆者使用資料庫版本為11gR2,具體版本為11.2.0.4

 

SQL> select * from v$version;

 

BANNER

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

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - Production

PL/SQL Release 11.2.0.4.0 - Production

CORE    11.2.0.4.0      Production

TNS for Linux: Version 11.2.0.4.0 - Production

NLSRTL Version 11.2.0.4.0 – Production

 

當前資料庫處在歸檔模式下,Recovery Area啟用。

 

SQL> archive log list;

Database log mode              Archive Mode

Automatic archival             Enabled

Archive destination            USE_DB_RECOVERY_FILE_DEST

Oldest online log sequence     33

Next log sequence to archive   35

Current log sequence           35

 

Recovery Area留足足夠空間。

 

SQL> show parameter recovery;

 

NAME                                 TYPE        VALUE

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

db_recovery_file_dest                string      /u01/app/fast_recovery_area

db_recovery_file_dest_size           big integer 10000M

recovery_parallelism                 integer     0

 

2Flashback Database配置

 

預設情況下,flashback database是沒有啟動的。需要一次完全關閉資料庫,並且切換到mount狀態下。

 

SQL> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup mount

ORACLE instance started.

 

Total System Global Area  372449280 bytes

Fixed Size                  1364732 bytes

Variable Size             318770436 bytes

Database Buffers           46137344 bytes

Redo Buffers                6176768 bytes

Database mounted.

 

啟動flashback模式。

 

SQL> alter database flashback on;

Database altered.

 

SQL> alter database open;

Database altered.

 

SQL> select flashback_on from v$database;

 

FLASHBACK_ON

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

YES

 

檢視v$database中的flashback_on欄位,可以標識是否開啟閃回資料庫功能。另一個標誌就是後臺進行RVWR,一旦開啟閃回功能,後臺會自動啟動進行進行Flashback Log管理收集。

 

[oracle@SimpleLinux ~]$ ps -ef | grep rvwr

oracle    5725     1  0 13:28 ?        00:00:00 ora_rvwr_ora11g

oracle    5776  1589  1 13:31 pts/0    00:00:00 grep rvwr

 

3Flashback狀態觀察

 

flashback database是基於資料庫對於flashback log的收集進行的。預設情況下,flashback log是儲存在recovery area中的。

 

SQL> select * from v$flash_recovery_area_usage;

 

FILE_TYPE            PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES

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

CONTROL FILE                       0.09                         0               1

REDO LOG                            1.5                         0               3

ARCHIVED LOG                          0                         0               1

BACKUP PIECE                      10.86                         0               4

IMAGE COPY                            0                         0               0

FLASHBACK LOG                         1                         0               2

FOREIGN ARCHIVED LOG                  0                         0               0

 

和常見的歸檔模式備份還原策略不同,flashback database是針對短時間恢復技術而言的。資料庫中存在引數,用於設定恢復時間段。

 

SQL> show parameter flashback;

 

NAME                                 TYPE        VALUE

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

db_flashback_retention_target        integer     1440

 

注意:這個引數預設為1440,單位是分鐘。也就是說,開啟flashback database的情況下,要求保留1440分鐘,也就是24小時的備份。檢視v$flashback_database_log中,可以檢視到能夠恢復到的最早時間。

 

SQL> select OLDEST_FLASHBACK_SCN, to_char(OLDEST_FLASHBACK_TIME,'yyyy-mm-dd hh24:mi:ss') oldest_time, FLASHBACK_SIZE from v$flashback_database_log;

 

OLDEST_FLASHBACK_SCN OLDEST_TIME         FLASHBACK_SIZE

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

             1093695 2014-04-28 13:28:43      104857600

 

當前時間:

 

 

SQL> select dbms_flashback.get_system_change_number, to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

 

GET_SYSTEM_CHANGE_NUMBER TO_CHAR(SYSDATE,'YYYY-MM-DDHH2

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

                 1140051 2014-04-28 14:22:57

 

檢視flashback log日誌檔案情況:

 

SQL> select * from v$flashback_database_logfile;

 

NAME                                                                     LOG#    THREAD#  SEQUENCE#      BYTES FIRST_CHANGE# FIRST_TIME  TYPE

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

/u01/app/fast_recovery_area/ORA11G/flashback/o1_mf_9ovsr9ty_.flb            1          1          1   52428800       1093747 28-四月-14  NORMAL

/u01/app/fast_recovery_area/ORA11G/flashback/o1_mf_9ovsrd5y_.flb            2          1          1   52428800             0             RESERVED

 

這裡需要討論兩個問題,一個是對於引數db_flashback_retention_target的理解,另一個是對於flashback log大小的估算。

 

db_flashback_retention_target設定的是一個儲存日誌的最大時間段。應該說,它是一種“理想值”,和undo_retention相同。我們雖然設定了時間值,但是不同的資料庫負載,redo log生成數量不同,對於flashback log保留需要的資源量就不同。設想一種情況,如果由於儲存原因,Oracle不能保留引數時間段對應的所有日誌,flashback database也是不能恢復到指定時間點的。所以,引數db_flashback_retention_target只是一個期望值,真正能否恢復到什麼時間點,還需要檢視檢視v$flashback_database_log的最早恢復時間。

另一個是log大小的估算。單從recovery area的職責看,archive logbackup setflashback log是三個比較消耗空間的專案。如果開啟了flashback database功能,一定需要分配額外的儲存給recovery area。大小估算要和每分鐘生成redo log size相關,Oracle的經驗公式是參考業務峰值的redo log size和保留時間進行估算。峰值redo size可以從Oracle AWR報告中找到。

 

4、恢復實驗

 

下面進行flashback實驗。當前存在schema名稱為test,其中包括6個物件。

 

 

SQL> select count(*) from dba_objects where owner='TEST';

 

  COUNT(*)

----------

         6

 

模擬誤刪除test使用者。

 

SQL> select dbms_flashback.get_system_change_number, to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

 

GET_SYSTEM_CHANGE_NUMBER TO_CHAR(SYSDATE,'YYYY-MM-DDHH2

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

                 1140051 2014-04-28 14:24:43

 

 

SQL> drop user test cascade;

User dropped

 

SQL> select count(*) from dba_objects where owner='TEST';

 

  COUNT(*)

----------

         0

 

啟動到mount狀態。

 

SQL> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup mount

ORACLE instance started.

 

Total System Global Area  372449280 bytes

Fixed Size                  1364732 bytes

Variable Size             301993220 bytes

Database Buffers           62914560 bytes

Redo Buffers                6176768 bytes

Database mounted.

 

執行恢復操作。

 

SQL> select OLDEST_FLASHBACK_SCN, to_char(OLDEST_FLASHBACK_TIME,'yyyy-mm-dd hh24:mi:ss') oldest_time, FLASHBACK_SIZE from v$flashback_database_log;

 

OLDEST_FLASHBACK_SCN OLDEST_TIME         FLASHBACK_SIZE

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

             1093695 2014-04-28 13:28:43      104857600

 

 

SQL> flashback database to scn 1140051;

Flashback complete.

 

flashback的方式支援三種,scntimestamplog sequence。其中SCNtimestamp比較方便。

執行成功後,open resetlogs啟動資料庫。

 

 

--Open Reset

SQL> alter database open resetlogs;

Database altered.

 

啟動資料庫後,test資料恢復。

 

SQL> select group#, sequence#, status from v$log;

 

    GROUP#  SEQUENCE# STATUS

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

         1          1 CURRENT

         2          0 UNUSED

         3          0 UNUSED

 

 

SQL> select count(*) from dba_objects where owner='TEST';

 

  COUNT(*)

----------

         6

 

實驗成功。

 

5、結論

 

flashback database是一種很方便的資料恢復技術,可以快速的進行資料恢復動作。相對於傳統的備份還原,具有很大優勢。使用過程中,應該注意:啟用flashback會帶來一定程度的效能損耗,在生產環境下使用應該進行仔細評估。


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

相關文章