Oracle Flashback(二)

dayong2015發表於2014-06-18
閃回版本查詢(Flashback Version Query)
查詢指定時間點的所有資料, 步驟是記錄當前SCN及時間,然後進行DML操作,提交後使用timestamp或SCN進行對DML操作之前的資料資訊進行查詢,該功能基於撤銷資料(undodata)。
閃回查詢示例如下:
基於時間戳和SCN號的閃回查詢
SQL> set time on;
01:22:30 SQL> conn / as sysdba
Connected.

01:22:53 SQL> select count(*) from scott.mydept;

  COUNT(*)
----------
         4

01:23:10 SQL> select current_scn from v$database;

CURRENT_SCN
-----------
     609437

01:23:23 SQL> delete scott.mydept;

4 rows deleted.

01:23:37 SQL> commit;

Commit complete.

01:23:55 SQL> select count(*) from scott.mydept;

  COUNT(*)
----------
         0

01:24:02 SQL> select current_scn from v$database;

CURRENT_SCN
-----------
     609462
基於時間戳的閃回查詢,如下:

01:24:12 SQL> select count(*) from scott.mydept as of timestamp to_timestamp('2014-06-18 01:22:53','yyyy-mm-dd hh24:mi:ss');

  COUNT(*)
----------
         4

01:25:43 SQL> c/'2014-06-18 01:22:53'/'2014-06-18 01:23:55'           --c /.. /.. 表示替換
  1* select count(*) from scott.mydept as of timestamp to_timestamp('2014-06-18 01:23:55','yyyy-mm-dd hh24:mi:ss')
01:26:45 SQL> /

  COUNT(*)
----------
         0

01:26:47 SQL> select count(*) from scott.mydept as of scn 609437;

  COUNT(*)
----------
         4

01:27:23 SQL> select count(*) from scott.mydept as of scn 609462;

  COUNT(*)
----------
         0

閃回事務查詢(Flashback Transaction Query)
使用該特性,可以在事物級別上檢查資料庫的任何改變,大大方便了對資料庫的效能最佳化、事務審計及錯誤診斷等操作。該功能基於撤銷資料(undodata)。
閃回事務查詢示例如下:
查詢事務的操作記錄,flashback_transaction_query
SQL> show user;
USER is "SYS"

SQL> select OPERATION,TABLE_NAME,UNDO_SQL from flashback_transaction_query where table_name='MYEMP' and table_owner='SCOTT';

OPERATION  TABLE_NAME                 UNDO_SQL
----------       ----------              ------------------------------------------------------------------------
UPDATE     MYEMP                 update "SCOTT"."MYEMP" set "SAL" = '1800' where ROWID = 'AAANOvAAEAAAAA8AAA';

UPDATE     MYEMP                 update "SCOTT"."MYEMP" set "SAL" = '800' where ROWID = 'AAANOvAAEAAAAA8AAA';

閃回資料庫(Flashback Database)
該特性允許使用者透過flashback database語句,使資料庫迅速地回滾到以前的某個時間點或者某個SCN(系統更改號)上,而不需要進行時間點的恢復操作。該功能基於閃回日誌
ORACLE的閃回資料庫技術使用閃回日誌以及部分的歸檔日誌來恢復使用者的邏輯錯誤,這種恢復只針對使用者錯誤的恢復,而不涉及整個資料庫的恢復,恢復具有針對性而且恢復時間少。
Oracle Flashback(二)
在上圖的閃回緩衝區中(Flashback Buffer)的變化資料將按照一定的時間間隔順序被寫入閃回日誌(Flashback Logs)。將閃回緩衝區中的資料寫入閃回日誌的操作由RVWR程式負責,一旦啟動了閃回資料庫,該程式會自動啟動。
批註:對於閃回資料庫而言,閃回日誌不會被歸檔。
閃回資料庫方法
閃回資料庫可以使用RMAN方法,也可以使用SQL指令方法實現。
使用RMAN閃回資料庫有如下三種方法:
? RMAN>flashback database to time=to_date(‘2014-06-18 01:30:13’,’YYYY-MM-DD HH23:MI:SS’);
該方法將資料庫閃回到過去的某個時間點,透過to_date函式指定具體的時間;
? RMAN>flashback database to SCN=638832;
該方法將資料庫閃回到過去某個的某個SCN,顯然在實踐中這個方法不容易實現,因為在資料庫發生邏輯錯誤之前一般不會去查詢資料庫當前的SCN;
? RMAN>flashback database to sequence=345 thread=1;
該方法閃回到特定日誌序列號之前的狀態,不包括序列號345.
使用SQL指令閃回資料庫有如下兩種方式:
? SQL>flashback database to timestamp(sysdate-1/24)
將資料庫閃回到時間戳指定的狀態
? SQL>flashback database to SCN 678854
該方法閃回資料庫到過去的某個SCN
批註:在執行閃回資料庫時,需要將資料庫切換到mount狀態,在閃回資料庫結束後必須使用alter database open resetlogs開啟資料庫,即需要重新設定重做日誌,使得重做日誌序列號重新計數。
閃回資料庫示例如下:
1.使用初始化引數 DB_FLASHBACK_RETENTION_TARGET 設定保留目標。可以指定一個上限值(以分鐘表示),指明希望能夠將資料庫閃回到多長時間以前。本示例使用了 2880 分鐘,相當於兩天。該引數只是一個目標,並不提供任何保證。閃回時間間隔取決於快速恢復區中保留的閃回資料量的大小。
SQL> show parameter db_flashback_retention_target;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_flashback_retention_target        integer     1440
SQL> alter system set db_flashback_retention_target=2880 scope=both;

System altered.

2.啟用閃回資料庫
ORACLE預設不啟動閃回資料庫,如果需要啟動閃回資料庫特性,必須將資料庫設定為歸檔模式,並啟用閃回恢復區,因為閃回日誌檔案存放在閃回恢復區。如果在RAC環境下,必須將閃回恢復區儲存在叢集檔案或ASM檔案中。

SQL> show parameter db_recovery_file_dest;      --查詢快速恢復區的目錄和大小

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest                string      /u01/oracle/flash_recovery_area
db_recovery_file_dest_size           big integer 2G
SQL> SELECT flashback_on FROM v$database;        --查詢來確定是否啟用了閃回資料庫

FLASHBACK_ON
------------------
NO

批註:必須先配置資料庫以進行歸檔,且必須在 MOUNT EXCLUSIVE 模式下啟動資料庫後,才能發出此命令來啟用閃回資料庫。
3.檢視資料庫的歸檔狀態,若不是歸檔模式,設定為歸檔模式
SQL> archive log list;
Database log mode              No Archive Mode
Automatic archival             Disabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     9
Current log sequence           11
SQL> shutdown immediate
SQL> startup mount exclusive;     --以exclusive (獨佔)模式啟動資料庫到mount狀態
SQL> alter database archivelog;     --設定資料庫為歸檔模式

Database altered.

SQL> alter database flashback on;    --啟用閃回資料庫

Database altered.

SQL> SELECT flashback_on FROM v$database;

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

[oracle@primary ~]$  ps -ef |grep rvwr         --檢視RVWR後臺程式是否啟用
oracle    4424     1  0 02:28 ?        00:00:00 ora_rvwr_orcl
oracle    4463  4430  0 02:29 pts/5    00:00:00 grep rvwr
4.檢視快速恢復區閃回目錄是否建立成功
[oracle@primary flashback]$ date
Wed Jun 18 02:32:07 CST 2014
[oracle@primary flashback]$ ll
total 8020
-rw-r----- 1 oracle oinstall 8200192 Jun 18 02:28 o1_mf_9t125spy_.flb
[oracle@primary flashback]$ pwd
/u01/oracle/flash_recovery_area/ORCL/flashback
5.基於SCN號的資料庫閃回
1.模擬scott使用者下的表誤刪除,如下:
SQL> alter database open;
SQL> select current_scn from v$database;

CURRENT_SCN
-----------
     612916

SQL> conn scott/tiger;
Connected.
SQL> drop table myemp purge;

Table dropped.

SQL>conn / as sysdba

SQL> select current_scn from v$database;

CURRENT_SCN
-----------
     612999

2.閃回資料庫中誤刪除的表myemp
1)關閉資料庫啟動至mount狀態
SQL> shutdown immediate
SQL> startup mount;
2)基於SCN號的資料庫閃回
SQL>  flashback database to SCN 612955;

Flashback complete.

SQL> alter database open read only;             --以read only模式開啟資料庫

Database altered.

SQL> conn scott/tiger;
Connected.
SQL> select tname,tabtype from tab where tname like '%MYEMP%';

no rows selected
檢視可知此時表mydept並沒有閃回,繼續閃回如下:
SQL> conn / as sysdba
Connected.
SQL> shutdown immediate
SQL> startup mount
SQL> flashback database to SCN 612914;

Flashback complete.

SQL> alter database open read only;

Database altered.

SQL> conn scott/tiger;
Connected.
SQL> select tname,tabtype from tab where tname like '%MYEMP%';

TNAME                          TABTYPE
------------------------------ -------
MYEMP                          TABLE           

批註:可知表myemp已經成功閃回
重啟資料庫,以resetlogs方式開啟資料庫,如下:
SQL> conn / as sysdba
Connected.
SQL> shutdown immediate
SQL> startup mount
SQL> alter database open resetlogs;
6.基於時間戳的資料庫閃回
1)誤刪除某使用者,感覺scott看著不順眼,刪了
SQL> set time on;
03:02:32 SQL> drop user scott cascade;

User dropped.

03:02:58 SQL> create table mytab as select * from dual;       --建立表mytab

Table created.

2)執行閃回資料庫操作
03:05:47 SQL> shutdown immediate
03:06:54 SQL> startup mount
03:07:06 SQL> flashback database to timestamp to_timestamp('2014-06-18 03:02:32','yyyy-mm-dd hh24:mi:ss');

Flashback complete.

03:08:33 SQL> alter database open read only;

Database altered.

03:08:48 SQL> select username from dba_users where username like '%SCOTT%';

USERNAME
------------------------------
SCOTT
檢視閃回時間點之後建立的表是否存在:
03:09:10 SQL> select table_name from dba_tables where table_name like '%MY%';

TABLE_NAME
----------
MYEMP

批註:在該使用者刪除前,對在該使用者下所進行的ddl語句,在閃回資料庫後,不會丟失。而在基於時間戳之後在其他使用者下進行的DDL語句將會丟失,不會閃回。
03:11:42 SQL> shutdown immediate       --重新資料庫,以resetlogs方式開啟資料庫
03:11:51 SQL> startup mount;
03:12:40 SQL> alter database open resetlogs;
7.從閃回資料庫中排除表空間
執行閃回資料庫恢復前離線提取表空間,刪除表空間或透過傳統時間點恢復來恢復離線檔案。
不希望為某個表空間記錄閃回資料庫資料。可以使用 ALTER TABLESPACE 命令阻止表空間參與閃回資料庫操作。也可以在建立表空間時指定該屬性。預設值為 ON。
閃回資料庫前必須離線獲取此表空間,然後可以刪除該表空間或使用傳統時間點恢復方法恢復離線資料檔案,可以查詢 V$TABLESPACE 檢視來確定表空間的閃回狀態。
批註:如果重新建立控制檔案,則所有表空間都將處於 FLASHBACK ON 模式。必須重複 ALTER TABLESPACE 命令,以確保將表空間從閃回資料庫操作中排除。

SQL> select name,flashback_on from v$tablespace;
SQL> alter tablespace test flashback off;

重啟到mount狀態恢復表空間在閃回資料庫時的預設閃回狀態

SQL> shutdown immediate

SQL> startup mount;

SQL> alter tablespace test flashback on;

SQL> alter database open;

8.閃回資料庫注意事項

閃回資料庫操作完成時,將按以下方式開啟資料庫:
   在只讀模式下開啟,以驗證是否使用了正確的目標時間或SCN
   透過resetlogs操作開啟,以允許DML
在下列情況下不能實用閃回資料庫:
   已經還原或重新建立了控制檔案
   已經刪除了表空間
   已經收縮了資料檔案
使用to before resetlogs閃回到最後一次resetlogs操作之前。 
在不能使用閃回資料庫功能的情況下,應使用不完全恢復操作將資料庫返回至特定時間。閃回資料庫操作完成後,可以在只讀模式下開啟資料庫,以驗證是否使用了正確的目標時間或 SCN。如果不正確,則可以重新閃回資料庫,或執行恢復來前滾資料庫。所以,為了還原閃回資料庫操作,應向前恢復資料庫。
不能使用閃回資料庫操作來恢復閃回時間段內刪除的資料檔案。刪除的資料檔案將被新增到控制檔案中並標記為離線,但是不會進行閃回。閃回資料庫不能將資料檔案閃回至介於其建立之後與調整操作之前的某一時刻。如果在資料庫要閃回到的時間段內調整了檔案,則應在開始閃回資料庫操作前離線提取該檔案。這適用於收縮的檔案,而不是擴充套件的檔案。可以將閃回資料庫用於已經配置為自動擴充套件的資料檔案。
9.監視閃回資料庫
因為無法保證一定可以閃回到從現在開始到引數db_flashback_retention_target指定時間段內的任意時間點,所以在閃回前最好使用資料字典V$flashback_database_log查詢可以閃回到最小SCN號以及可以閃回到的時間點,如下所示:
SQL> select oldest_flashback_scn,oldest_flashback_time from v$flashback_database_log;

OLDEST_FLASHBACK_SCN OLDEST_FL
-------------------- ---------
              612596 18-JUN-14
下面介紹資料字典檢視v$flashback_database_stat,該字典檢視的作用是監視閃回日誌寫入閃回資料的各種開銷,如記錄了當前閃回記錄起止時間、閃回記錄的資料量以及重做日誌記錄的資料量等資訊。該檢視記錄24小時內的閃回日誌開銷記錄,每一行記錄了一小時間隔的狀態,如下所示:

SQL>  select * from v$flashback_database_stat;

BEGIN_TIM END_TIME  FLASHBACK_DATA    DB_DATA  REDO_DATA          ESTIMATED_FLASHBACK_SIZE
--------- --------- -------------- ---------- ----------                   -------------------------------------
18-JUN-14 18-JUN-14        2965504    1515520    1177088                       0
批註:其中flashback_data表示在時間間隔內記錄的多少閃回資料,單位是位元組引數;db_data記錄了時間間隔內有多少資料塊的讀寫,單位是資料塊;引數redo_data說明時間間隔內記錄了多少重做資料,單位是位元組。
查詢快閃恢復區的空間使用情況,如下:

SQL> select name,space_limit,space_used,space_reclaimable,number_of_files from v$recovery_file_dest;

NAME                                                        SPACE_LIMIT SPACE_USED SPACE_RECLAIMABLE NUMBER_OF_FILES
------------------------------------------------          ----------- ---------- ----------------- ---------------
/u01/oracle/flash_recovery_area          2147483648  116262912                 0               5
批註:引數name說明了使用快閃恢復區的目錄;引數space_limit說明空間最大使用上限;引數space_used說明已經使用的空間;引數space_reclaimable說明可以回收的空間。
10.使用閃回資料庫的限制
以下幾種環境下不能使用閃回資料庫特性,只能使用不完全恢復將資料庫恢復到過去的某個時間點:
? 如果是資料檔案被刪除或縮短
? 如果在閃回時間範圍內復原或重建了控制檔案
? 在resetlogs操作之前
? 表空間被刪除
11.復還原點技術
在閃回資料庫或閃回表操作時,往往需要一個具體的時間點或者SCN等資訊,說明將閃回到哪裡結束,而復原點就是SCN的別名。
1)建立一個復原點
SQL>  create restore point scn1;

Restore point created.
2)查詢復原點資訊

SQL> select name,scn,storage_size,guarantee_flashback_database from v$restore_point;

NAME                              SCN STORAGE_SIZE GUA
----------------------          ---------- ------------ ---
       SCN1                    614343            0 NO

3)有保證的復原點技術
這種技術可以保證在快閃恢復區空間可以保證情況下,總可以閃回到該復原點,如果快閃恢復區空間不足,則資料庫關閉。並且使用有保證的復原點與是否使用閃回日誌無關,一旦使用了有保證的復原點,ORACLE會自動儲存自復原點之後的閃回日誌,並不會刪除這些日誌。

 1.建立有保證的復原點
SQL> create restore point scn2 guarantee flashback database;

Restore point created.
2.透過資料字典檢視v$restore_point,檢視有保證的復原點是否建立成功
SQL> select name,scn,storage_size,guarantee_flashback_database from v$restore_point;

NAME              SCN STORAGE_SIZE GUA
---------- ---------- ------------ ---
SCN2           614518      8192000 YES
SCN1           614343            0 NO

從輸出可以看出復原點scn2是有保證的復原點,因為引數guarantee_flashback_database為yes。並且相對於普通復原點scn2而言,storage_size存在引數值,該引數說明為保證的復原點指定的儲存空間。
3.刪除有保證的復原點
SQL> drop restore point scn2;

Restore point dropped.
SQL> select name,scn,storage_size,guarantee_flashback_database from v$restore_point;

NAME              SCN STORAGE_SIZE GUA
---------- ---------- ------------ ---
SCN1           614343            0 NO

總結:使用閃回特性可以快速的恢復使用者的邏輯錯誤或者誤刪除表等操作。閃回刪除主要是關注使用者誤刪除表、索引的資料庫物件,閃回刪除使用回收站作為儲存刪除的資料庫物件的邏輯儲存結構。閃回刪除並不是直接將資料從資料庫中刪除放入回收站,而只是將資料庫物件的定義從資料字典中刪除,資料儲存在原處。在回收站中記錄這個被刪除的資料庫物件,一旦需要閃回到刪除前的狀態,使用回收站中記錄的物件資訊進行閃回。再刪除表時,與表相關聯的其他資料庫物件如索引、觸發器等也都一併刪除。在閃回表時,這些相關的資料庫物件被自動恢復,但是名稱需要進一步修改。
閃回資料庫技術是處理使用者邏輯錯誤的快速資料恢復技術,相比傳統的資料庫恢復會減少恢復時間,傳統的資料庫恢復時間取決於資料庫自身的大小,而閃回資料庫技術的恢復取決於邏輯錯誤的資料量大小。使用閃回資料庫技術需要將資料庫設定為歸檔模式,並啟動快閃恢復區作為閃回日誌的儲存目錄。一般條件下應該儘量設定較大的快閃恢復區,以保證閃回資料庫總可以執行成功。

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

相關文章