Oracle Flashback(一)

dayong2015發表於2014-06-18
為了使Oracle資料庫從任何邏輯誤操作中迅速地恢復,Oracle推出了閃回技術。該技術首先以閃回查詢(Flashback Query)出現在Oracle 9i版本中,後來Oracle在10g中對該技術進行了全面擴充套件,提供了閃回資料庫、閃回刪除、閃回表、閃回事物及閃回版本查詢等功能,在11g 中,Oracle繼續對該技術進行改進和增強,增加了閃回資料歸檔功能。
閃回表(Flashback Table)
使用該特性,可以確保資料庫表能夠被恢復到之前的某一個時間點上。注意,該功能與最早的9i中的Flashback Query不同,Flashback Query僅僅是得到了表在之前某個時間點上的快照而已,並不改變當前表的狀態;而Falshback Table卻能夠將表及附屬物件一起恢復到以前的某個時間點。該功能基於撤銷資料(undodata)。
使用閃回表,可將一個或多個表恢復到特定的時間點,而不需要還原備份;從還原表空間檢索資料後可執行閃回表操作;執行閃回表操作需要flashback any table許可權;必須對要執行閃回操作的表啟用行移動。
閃回表示例如下:
首先查詢undo引數資訊:

SQL> show parameter undo; 

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_management                      string      AUTO
undo_retention                       integer     900
undo_tablespace                      string      UNDOTBS1
1.基於時間戳的閃回表
現不小心刪除scott使用者下的myemp表,演示基於時間戳的閃回表操作
1)賦予scott使用者flashback any table許可權,使表myemp能夠行移動
SQL> grant flashback any table to scott;

Grant succeeded.
SQL> conn scott/tiger;
Connected.

SQL> select * from tab;

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
MYEMP                          TABLE
DEPT                           TABLE
EMP                            TABLE
BONUS                          TABLE
SALGRADE                       TABLE

SQL> alter table myemp enable row movement;

Table altered.

2)更新表myemp 如下:

SQL> set time on;
00:02:25 SQL> select count(*) from myemp;

  COUNT(*)
----------
        14

00:02:44 SQL> insert into myemp select * from myemp;

14 rows created.

00:03:16 SQL> commit;

Commit complete.

00:03:20 SQL> select count(*) from myemp;

  COUNT(*)
----------
        28

00:03:27 SQL> insert into myemp select * from myemp;

28 rows created.

00:03:36 SQL> commit;

Commit complete.

00:03:46 SQL> select count(*) from myemp;

  COUNT(*)
----------
        56

3)執行閃回表操作
00:03:55 SQL> select sysdate from dual;

SYSDATE
---------
18-JUN-14

00:08:45 SQL> flashback table myemp to timestamp to_timestamp('2014-06-18 00:03:46','yyyy-mm-dd hh24:mi:ss');

Flashback complete.

00:09:23 SQL> select count(*) from myemp;

  COUNT(*)
----------
        28

00:08:45 SQL> flashback table myemp to timestamp to_timestamp('2014-06-18 00:03:46','yyyy-mm-dd hh24:mi:ss');  
Flashback complete.

00:09:23 SQL> select count(*) from myemp;

  COUNT(*)
----------
        28
批註:最好在之前設定的時間點3s之後執行閃回操作

00:09:27 SQL> flashback table myemp to timestamp to_timestamp('2014-06-18 00:03:50','yyyy-mm-dd hh24:mi:ss');

Flashback complete.

00:10:10 SQL> select count(*) from myemp;

  COUNT(*)
----------
        56
批註:只要在設定的UNDO保留的900s之內,可以執行任意基於時間點的表閃回操作。

2.基於SCN的閃回表
1)對scoot使用者下的myemp表執行如下操作:

SQL> conn / as sysdba
Connected.
SQL> select count(*) from scott.myemp;

  COUNT(*)
----------
        56

SQL> select current_scn from v$database;     --檢視當前資料庫的SCN號

CURRENT_SCN
-----------
     606722

SQL>  insert into scott.myemp select * from scott.myemp;

56 rows created.

SQL> commit;

Commit complete.

SQL> select count(*) from scott.myemp;

  COUNT(*)
----------
       112

SQL> select current_scn from v$database;

CURRENT_SCN
-----------
     606736

SQL>  delete from scott.myemp;

112 rows deleted.

SQL> commit;

Commit complete.

SQL>  select count(*) from scott.myemp;

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

SQL> select current_scn from v$database;

CURRENT_SCN
-----------
     606756

2)基於SCN號的閃回表
SQL> flashback table scott.myemp to scn 606722;

Flashback complete.

SQL> select count(*) from scott.myemp;

  COUNT(*)
----------
        56

SQL> flashback table scott.myemp to scn 606736;

Flashback complete.

SQL> select count(*) from scott.myemp;

  COUNT(*)
----------
       112

SQL> flashback table scott.myemp to scn 606756;

Flashback complete.

SQL> select count(*) from scott.myemp;

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

批註:只要在設定的UNDO保留的900s之內,可以執行任意基於SCN的表閃回操作。
閃回刪除(Flashback Drop)
閃回刪除類似於作業系統的垃圾回收站功能,可以從中恢復被drop的表或者索引。該功能基於回收站(RecycleBin)。 如果使用drop table指令刪除表,該表不會從資料庫中立即刪除,而是儲存原表的位置,但是將刪除的表重新命名,並將刪除的表資訊儲存在回收站中,回收站記錄了被刪除表的新名字和原名字,記錄在回收站中資訊會保留一段時間,直到回收站空間不足或者使用purge指令刪除回收站中的記錄。回收站是一個邏輯結構,不具有物理資料結構,只要刪除的表資訊記錄在回收站中,就可以透過閃回技術恢復誤刪除的表。
資料字典檢視USER_RECYCLEBINDBA_RECYCLEBIN供使用者查詢資料庫中回收站中記錄的資訊。
閃回刪除不適用於:駐留在system表空間中的表;使用細粒度級審計或虛擬專用資料庫的表; 駐留在字典管理表空間中的表;已清除的表,無論是手動刪除的,還是在空間壓力下自動刪除的。
閃回刪除示例1如下:
首先,要啟動閃回刪除,關鍵是啟動recyclebin,預設情況下是啟動的
SQL> show parameter recyclebin;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
recyclebin                           string      on

1.刪除scott使用者下的myemp表

SQL> drop table myemp;

Table dropped.

SQL> show recyclebin;         --此時recyclebin是user_recyclebin的同義詞
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
MYEMP            BIN$/ArGYSO8X4TgQKjACgoP7Q==$0 TABLE        2014-06-18:00:38:34
批註:在重新命名被刪除的表時,也會重新命名該表的依賴物件如涉及的索引、觸發器等,在恢復表時,該表涉及的依賴物件會自動恢復,但是會保留系統名稱。
2.恢復刪除的表

SQL> flashback table "BIN$/ArGYSO8X4TgQKjACgoP7Q==$0" to before drop;     

Flashback complete.
批註:如果知道刪除之前的表名,也可以如下方式恢復誤刪除的表 flashback table myemp  to before drop;
SQL> select tname,tabtype from tab where tname like '%MYEMP%';       --驗證表是否恢復

TNAME                          TABTYPE
------------------------------ -------
MYEMP                          TABLE
批註:閃回的時候也可以為表重新命名,如下
SQL> flashback table "BIN$/ArGYSO8X4TgQKjACgoP7Q==$0" to before drop rename to emp;
閃回刪除示例2如下:
1.在scott使用者下建立mydept表,
SQL> create table mydept as select * from dept;
2.建立基於表mydept下欄位dname的索引
SQL> create index mydept_dname on mydept(dname);

Index created.

SQL> select table_name,index_name from user_indexes where table_name like '%MYDEPT%';           --檢視索引是否建立成功

TABLE_NAME                     INDEX_NAME
------------------------------ ------------------------------
MYDEPT                         MYDEPT_DNAME

3.現在刪除mydept表,然後閃回,檢視基於該表的索引名稱的變化,如下:
SQL> drop table mydept;

Table dropped.

SQL> show recyclebin;
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
MYDEPT           BIN$/AwWTga9PSHgQKjACgoQJA==$0 TABLE        2014-06-18:01:00:55
SQL> select table_name,index_name from user_indexes where table_name like '%MYDEPT%';    --查詢可知基於表mydept中欄位dname的索引已經刪除

no rows selected

4.執行閃回表操作
SQL> flashback table "BIN$/AwWTga9PSHgQKjACgoQJA==$0" to before drop;

Flashback complete.

查詢基於表mydept的索引閃回情況,如下:
SQL> select table_name,index_name from user_indexes where table_name like '%MYDEPT%';

TABLE_NAME                     INDEX_NAME
------------------------------ ------------------------------
MYDEPT                         BIN$/AwWTga8PSHgQKjACgoQJA==$0

批註:我們看到mydept的索引閃回成功,但是名稱依然是在閃回表時的為該索引起的名字,所以需要使用者自己修改該索引的名字。
SQL> drop index "BIN$/AwWTga8PSHgQKjACgoQJA==$0";

Index dropped.

SQL> create index mydept_dname on mydept(dname);

Index created.

SQL> select table_name,index_name from user_indexes where table_name like '%MYDEPT%';

TABLE_NAME                     INDEX_NAME
------------------------------ ------------------------------
MYDEPT                         MYDEPT_DNAME

補充:回收站相關操作
1.回收站:手動回收空間
使用 PURGE 命令可從回收站中永久地刪除物件。從回收站中清除某個物件時,會從資料庫中永久地刪除該物件及其相關物件。因此,將無法再使用閃回刪除功能恢復從回收站中清除的物件。下面是可能使用的一些 PURGE 命令:
PURGE TABLE 清除指定表。
PURGE INDEX 清除指定索引。
PURGE TABLESPACE 清除駐留在指定表空間內的所有物件。另外,如果駐留在其它表空間內的物件是相關的,則這些物件也可能被清除。此外,還可以指定 USER 子句,以僅清除屬於指定使用者的那些物件,這些物件對於指定表空間執行於較低的磁碟限額上。
PURGE RECYCLEBIN 清除屬於當前使用者的所有物件。RECYCLEBIN 與 USER_RECYCLEBIN 功能相同。
PURGE DBA_RECYCLEBIN 清除所有物件。要發出此命令,必須具有足夠的系統許可權或 SYSDBA 系統許可權。
批註:對於 PURGE TABLE 和 PURGE INDEX 命令,如果指定原始名稱且回收站包含多個具有該名稱的物件,則首先清除位於回收站中時間最長的物件 (FIFO)。

2.繞過回收站
可以使用 DROP TABLE PURGE 命令從資料庫中永久地刪除表及其相關物件。使用此命令時,對應的物件不會移動到回收站中。此命令的功能與 DROP TABLE 在先前版本中提供的功能相同。
發出 DROP TABLESPACE ...INCLUDING CONTENTS 命令後,表空間中的物件不會移到回收站中。而且,回收站中屬於該表空間的物件也將被清除。發出沒有 INCLUDING CONTENTS 子句的相同命令時,要使命令能夠成功地得以執行,表空間必須是空的。但回收站中可以有屬於該表空間的物件。在這種情況下,這些物件將被清除。
發出 DROP USER ...CASCADE 命令後,將從資料庫中永久地刪除該使用者及其擁有的所有物件。回收站中屬於已刪除使用者的所有物件都將被清除。

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

相關文章