Oracle閃回資料庫

llnnmc發表於2017-05-19

閃回資料庫就像給資料庫增加了倒帶按鈕的功能,它將當前的資料庫視為起點,然後在時間上順序回退所有的工作,直到回退到設定的時間點。最終結果就好像執行了不完整恢復,位於閃回點之後的所有工作將丟失。

閃回資料庫只能恢復使用者邏輯錯誤,如果遇到物理損壞或介質丟失,如丟失資料檔案,則閃回技術不適用,對此必須使用傳統的備份還原和恢復技術。作為使用者操作錯誤後替代不完整恢復的一種手段,閃回資料庫往往是更加靈活快捷的方法,它影響的停機時間通常較短,並且容易使用。這樣的例子包括誤認為連線到測試庫而刪除了生產系統中的使用者,重要的表被截斷而不是刪除時也可以考慮使用閃回資料庫。

閃回資料庫是多個程式和資料結構的組合。除了需要啟用閃回日誌外,還需要重做日誌來完成閃回到一致的資料庫版本,因此它需要資料庫處於歸檔模式。另外閃回資料庫需要在載入模式下進行,因此需要佔用一定的停機時間。

1、閃回資料庫體系結構

一旦啟用了閃回資料庫,修改的塊的映像會不時的從資料庫緩衝區快取複製到SGA中一個新的儲存區域,即閃回緩衝區。透過一個新的後臺程式恢復寫入器(Recovery Writer,RVWR)將閃回緩衝區重新整理到磁碟閃回日誌。與重做日誌不同,閃回日誌記錄不是記錄變化的日誌,而是記錄完整塊映像的日誌,並且不能多路複用和歸檔閃回日誌,它們是系統自動建立和管理的。

對效能至關重要的一點是,系統並不是將所有變化複製到閃回緩衝區,而只是記錄變化的一個子集。內部演算法限制將哪些塊的哪些版本放置在閃回緩衝區,以便限制填充閃回緩衝區以及寫入磁碟的塊的大小和頻率。這些演算法的初衷是在啟用閃回資料庫時確保不會對效能造成負面影響。

當執行資料庫閃回時,Oracle將會讀取閃回日誌以提取每個改變的資料庫塊的版本,並將這些版本複製回資料檔案。這樣做的效果是透過反轉DBWn程式執行的寫入操作及時回退資料庫。由於不是將每個變化的塊的所有版本都複製到閃回緩衝區和隨後的閃回日誌中,因此不可能閃回到某個精確的時間點。一個塊可能被修改多次,但是閃回日誌只記錄這些變化的一個子集。閃回操作將盡可能接近期望的時間(但不能晚於該時間)回退每個更改的塊。因此,閃回資料庫構造一個恰好在希望的時間點之前的資料檔案版本。資料檔案的這種版本可能完全不一致,不同的塊將置於不同的系統變更號。要完成閃回過程,Oracle可以使用重做日誌。它將把所有的塊嚴格恢復到請求的時間,從而將所有資料檔案同步到相同的SCN上。最後再回滾在那個時間點還未提交的任何事務。

因此,閃回資料庫實際上是多個程式和資料結構的組合。歸納為以下幾個步驟:
1)在SGA中分配一些記憶體(這是自動進行的,無法控制緩衝區的大小)並在磁碟上分配一些空間來儲存閃回資料,同時啟用RVWR程式來支援閃回日誌記錄。
2)當執行閃回時,Oracle會使用閃回日誌將資料庫及時回退到期望的時間之前的某個時間點。
3)按照不完整恢復中的常規方式應用重做日誌,將資料檔案前滾到希望的確切時間,並回滾那個時間點尚未提交的事務。
4)使用RESETLOGS選項開啟資料庫,建立資料庫的一個新的化身。

由此看到,閃回資料庫要求使用歸檔模式,因為如果歸檔日誌資料流不可用,則無法將應用閃回日誌得到的不一致的資料庫版本轉換到能夠開啟的一致的資料庫版本。

與不完整恢復相比,不完整恢復總是耗時的,因為部分過程是完全還原。不完整恢復的時間在很大程度上與資料庫的大小成正比。而資料庫閃回所需的時間主要取決於需要撤銷的更改的資料量,與資料庫的總資料量相比,更改的資料量往往是很少的,因此閃回操作應該會快很多倍。另外,相比不完整恢復,閃回資料庫也很容易使用。

2、配置閃回資料庫

配置一個資料庫啟用閃回模式需要在載入模式下發出命令,因此是需要停機時間的。以下透過一個例子來演示配置過程。

1)確保資料庫處於歸檔日誌模式
select log_mode from v$database;

LOG_MODE
------------
ARCHIVELOG

2)建立閃回恢復區
閃回恢復區是存放閃回日誌的場所,可以使用兩個例項引數來設定閃回恢復區,一個是db_recovery_file_dest,用來指定閃回恢復區目錄,另一個是db_recovery_file_dest_size,用來指定恢復區大小。
show parameter db_recovery_file_dest;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest                string      c:\oracle\flash_recovery_area
db_recovery_file_dest_size           big integer 3912M

如果需要修改目標位置和大小
alter system set db_recovery_file_dest='e:\flash_recovery_area';
alter system set db_recovery_file_dest_size=4g;

show parameter db_recovery_file_dest;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest                string      e:\flash_recovery_area
db_recovery_file_dest_size           big integer 4G

3)設定閃回日誌保留目標時間
該時間透過例項引數db_flashback_retention_target來控制,單位分鐘,預設值1440分鐘,即1天。閃回日誌空間以迴圈的方式重用,更新的資料將覆蓋舊的資料。該引數指示Oracle在重寫它之前儲存閃回資料的分鐘數,然而這只是一個目標時間,如果閃回恢復區的大小不足,則Oracle可能無法保持該目標。
show parameter db_flashback_retention_target;

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

以下將閃回日誌保留時間改為12小時
alter system set db_flashback_retention_target=720;

show parameter db_flashback_retention_target;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_flashback_retention_target        integer     720

4)乾淨的關閉並載入資料庫
shutdown immediate;
startup mount;

5)啟用閃回日誌記錄
alter database flashback on;

這將啟動RVWR程式並在SGA中分配閃回緩衝區。查詢檢視v$process可以看到該程式已啟動
select pname, program from v$process where pname='RVWR';

PNAME PROGRAM
----- ----------------------------------------------------------------
RVWR  ORACLE.EXE (RVWR)

6)開啟資料庫
alter database open;

從現在起將會啟用從資料庫緩衝區快取到閃回緩衝區的資料塊映像日誌記錄功能。

7)如果是要更改閃回恢復區的位置,則按以下步驟執行
作業系統中建立好新的閃回恢復區目錄
修改初始化引數
alter system set db_recovery_file_dest='d:\flash_recovery_area';
乾淨的關閉並載入資料庫
shutdown immediate
startup mount
關閉並重開閃回
alter database flashback off;
alter database flashback on;
開啟資料庫
alter database open;

3、監視閃回資料庫

閃回監視最基本的層次是確認啟用了它,這可以透過查詢檢視v$database來確認
select flashback_on from v$database;

FLASHBACK_ON
------------------
YES

查詢檢視v$process也可以看到閃回寫程式已啟動
select pname, program from v$process where pname='RVWR';

PNAME PROGRAM
----- ----------------------------------------------------------------
RVWR  ORACLE.EXE (RVWR)

為了監視當前的閃回能力並估計為滿足目標時間閃回日誌所需的空間,可以查詢檢視v$flashback_database_log。該查詢顯示由db_flashback_retention_target例項引數指定的保留目標時間的設定值(單位是分鐘),預設值是1天,並顯示閃回日誌檔案佔用的實際空間大小、閃回日誌可將資料庫回退到的確切時間和SCN、預估的需要的閃回恢復區大小。
select * from v$flashback_database_log;

OLDEST_FLASHBACK_SCN OLDEST_FLASHBACK_TI RETENTION_TARGET FLASHBACK_SIZE ESTIMATED_FLASHBACK_SIZE
-------------------- ------------------- ---------------- -------------- ------------------------
            10214885 2017-01-25 22:33:32             1440       15941632                249102336

另一個檢視v$flashback_database_stat提供了一個有關資料檔案、聯機重做日誌檔案和閃回日誌檔案佔用磁碟I/O比例的歷史檢視。顯示出了與正常資料庫活動相比較的I/O量,體現了啟用閃回資料庫而付出的代價,計量單位是位元組數。該檢視每小時顯示一行資料。
select * from v$flashback_database_stat;

BEGIN_TIME          END_TIME            FLASHBACK_DATA    DB_DATA  REDO_DATA ESTIMATED_FLASHBACK_SIZE
------------------- ------------------- -------------- ---------- ---------- ------------------------
2016-03-12 20:36:09 2016-03-12 21:17:23        6782976   10706944    3343872                        0
2016-03-12 19:36:06 2016-03-12 20:36:09        7913472   13164544    4203008                 52731904
2016-03-12 18:36:01 2016-03-12 19:36:06       22691840   30851072   18845184                 56094720
2016-03-12 17:35:57 2016-03-12 18:36:01        7897088   12869632    4201984                 49541120
2016-03-12 16:35:54 2016-03-12 17:35:57        7954432   13213696    4218368                 53751808
2016-03-12 15:35:46 2016-03-12 16:35:54        7159808   14540800    4313088                 60461056
2016-03-12 14:35:41 2016-03-12 15:35:46       29949952   36323328   25719808                 74510336
2016-03-12 13:19:18 2016-03-12 14:35:41       12419072   18210816    8408064                 39018496

閃回緩衝區的大小不受DBA的控制,要檢視它當前的大小,可以查詢檢視v$sgastat
select * from v$sgastat where name = 'flashback generation buff';

POOL         NAME                                                    BYTES
------------ -------------------------------------------------- ----------
shared pool  flashback generation buff                            15937344

可以看到閃回緩衝區位於共享池當中。

雖然可以設定引數db_flashback_retention_target的閃回時間總目標,但並不保證一定可以閃回到那個時間點,因為閃回日誌是由閃回恢復區管理的,而閃回恢復區是備份優先儲存,如果因為需要放置備份而導致閃回恢復區空間不足,則Oracle會刪除部分閃回日誌以獲取空間。因此需要注意閃回恢復區的空間使用情況,必要時增加閃回恢復區空間大小。

檢視閃回恢復區空間使用資訊
col name for a50
select * from v$recovery_file_dest;

NAME                                               SPACE_LIMIT SPACE_USED SPACE_RECLAIMABLE NUMBER_OF_FILES
-------------------------------------------------- ----------- ---------- ----------------- ---------------
e:\flash_recovery_area                              4294967296   15941632                 0            1

檢視閃回恢復區各類檔案分佈情況
select * from v$flash_recovery_area_usage;

FILE_TYPE            PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES
-------------------- ------------------ ------------------------- ---------------
CONTROL FILE                          0                         0               0
REDO LOG                              0                         0               0
ARCHIVED LOG                          0                         0               0
BACKUP PIECE                          0                         0               0
IMAGE COPY                            0                         0               0
FLASHBACK LOG                       .37                         0               1
FOREIGN ARCHIVED LOG                  0                         0               0

4、使用閃回資料庫

閃回資料庫的使用包括以下幾個步驟:
1)關閉資料庫
2)載入資料庫
3)閃回到某個時間點、SCN或日誌切換序列號
4)使用RESETLOGS開啟資料庫

只要擁有需要的所有歸檔日誌,閃回操作將能夠完全自動的執行。下面在已經配置好閃回資料庫的MES庫上進行閃回實驗。

假定在2016-03-12 22:30一名開發人員不小心刪除了MES資料庫的RMES使用者模式,從而將RMES使用者的所有表全部刪除了。這種錯誤常常發生在例如原本以為連線的是一個開發庫或測試庫,而實際上連線的是生產庫。10分鐘之後發現了錯誤,而該生產庫又是一個業務量繁忙的資料庫,必須儘快恢復。

首先就是關閉資料庫
shutdown abort;

此時使用其它任何型別的關閉都是毫無意義的,無論怎樣都會丟失正在進行的所有工作,而需要的是最小化停機時間,然後重啟到載入模式
startup mount;

將資料庫回退到22:30這個預估的時間點上,並用READ ONLY模式開啟資料庫
flashback database to timestamp to_timestamp('2016-03-12 22:30:00', 'yyyy-mm-dd hh24:mi:ss');
alter database open read only;

當在READ ONLY模式下時,可以針對刪除的模式執行查詢。如果發現使用者模式仍可用,如查詢表RMES.R_WIP_TRACKING_T發現表仍存在,那麼或許能夠恢復更多一些的使用者資料。現在我們把恢復時間改到22:35,此時需要藉助恢復命令來完成
shutdown abort;
startup mount;
recover database until time '2016-03-12 22:35:00';
alter database open read only;

重新執行查詢,發現恢復5分鐘的資料後,RMES使用者模式又不見了,則它必定是在22:30~22:35之間刪除的。因此可採用平分法則設定閃回到時間22:32:30
shutdown abort;
startup mount;
flashback database to timestamp to_timestamp('2016-03-12 22:32:30', 'yyyy-mm-dd hh24:mi:ss');
alter database open read only;

如果現在RMES使用者模式還不可用,就再往前閃回一點時間。如果發現模式可用,就執行一點時間的恢復。可以重複執行閃回和恢復命令,直到找到希望的時間,在此期間透過在只讀模式下執行查詢來測試。最後我們確定將MES資料庫恢復到的滿意時間為22:32:00。

當找到滿意的時間點後執行最後一次資料庫關閉並使用RESETLOGS開啟來建立資料庫的一個新化身
shutdown abort;
startup mount;
alter database open resetlogs;

之後MES資料庫就可以正常使用了。這種方法可以最小化資料損失,並且相對於不完整恢復,花費的停機時間是較短的。

在RMAN環境中,有三種閃回命令選擇,閃回到某個時間點、SCN或日誌切換序列號,如下例子
RMAN> flashback database to time = to_date('2016-03-12 22:30:00', 'yyyy-mm-dd hh24:mi:ss');
RMAN> flashback database to scn = 2728665;
RMAN> flashback database to sequence = 2123 thread = 1;

SQL*Plus的閃回語法可以接受時間戳或SCN引數,與RMAN不同的是,它不接受日期或日誌切換序列號
SQL> flashback database to timestamp to_timestamp('2016-03-12 22:32:30', 'yyyy-mm-dd hh24:mi:ss');
SQL> flashback daatabase to scn 678854;

除了語法上的微小變化外,RMAN閃回與SQL*Plus閃回操作相同,都是採用重複應用閃回與恢復,直到找到開啟資料庫的最佳點。

採用Database Control的Web模式、RMAN模式或是SQL*Plus模式,它們之間還有一點區別是閃回粒度的不同。Database Control的基於時間的閃回粒度只能是分鐘,而RMAN可以閃回到秒,SQL*Plus則可以閃回到時間戳---百萬分之一秒。

5、限制生成的閃回資料量

Oracle用來限制寫入到閃回日誌中的資料量的演算法是精心設計的,以便儘量減小對效能的影響。但有時可能還希望進一步降低它的影響。這可以對錶空間是否加入閃回日誌加以選擇。將一些表空間排除在閃回日誌記錄之外將有助於提高聯機效能,但付出的代價是必須執行屬於恢復過程的部分還原。

預設情況下,如果啟用了閃回資料庫,那麼會記錄所有表空間的閃回資料,使用如下命令可關閉表空間的閃回屬性
alter tablespace <tablespace_name> flashback off;

可以在任何時候執行上面的命令。而使用如下命令可開啟表空間的閃回屬性,但必須要求資料庫處於載入模式時才能執行
alter tablespace <tablespace_name> flashback on;

為了檢視錶空間的閃回狀態,v$tablespace檢視中提供了這樣一個列
select name, flashback_on from v$tablespace;

NAME                           FLA
------------------------------ ---
SYSTEM                         YES
SYSAUX                         YES
UNDOTBS1                       YES
USERS                          YES
TEMP                           YES
CMES                           YES
RMES                           YES
INDX                           YES

如果一個或多個表空間不生成閃回資料,那麼在執行閃回操作之前必須使構成表空間的檔案離線。在閃回操作後使構成表空間的資料檔案聯機,然後還原並執行不完整恢復,一直到閃回的時間點。這樣才能同步所有的資料檔案,並隨後可以使用RESETLOGS開啟資料庫。

6、復原點的使用

復原點就是SCN的別名,但更容易記憶。以下建立一個普通的復原點
create restore point rp1;

透過資料字典v$restore_point查詢建立的復原點
col name for a10
select name, scn, storage_size, guarantee_flashback_database from v$restore_point;

NAME              SCN STORAGE_SIZE GUA
---------- ---------- ------------ ---
RP1          10421437            0 NO

該復原點並不保證閃回資料一定成功,因為它依賴於閃回日誌資料是否存在。

以下則建立有保證的復原點,在閃回恢復區空間可以保證的情況下總可以閃回到該復原點,如果閃回恢復區空間不足,則資料庫會關閉
create restore point grp1 guarantee flashback database;

再次查詢建立的復原點,可以看到guarantee_flashback_database為yes
col name for a10
select name, scn, storage_size, guarantee_flashback_database from v$restore_point;

NAME              SCN STORAGE_SIZE GUA
---------- ---------- ------------ ---
GRP1         10423592     15941632 YES
RP1          10421437            0 NO

不需要復原點時,可將其刪除
drop restore point rp1;
drop restore point grp1;


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

相關文章