1、flashback drop
目前,Oracle10g為了加快使用者錯誤操作的恢複,提供了flashback drop新特性。
flashback drop功能可以允許你從當前資料庫中恢複一個被drop了的對象,在執行drop操作時,現在Oracle不是真正刪除它,而是將該對象自動將清除。“資源回收筒”我們可以理解為一個虛擬容器,它用來存放所有被刪除的對象。在資源回收筒中,被刪除的對象將佔用建立時的同樣的空間,你甚至還可以對已經刪除的表查詢,也可以利用flashback功能來恢複它,這個就是flashback drop功能。
資源回收筒內的相關資訊我們可以從recyclebin /user_recyclebin/dba_recyclebin等視圖中擷取,或者通過SQL*Plus的show recyclebin 命令查看。
例:
SQL> create table myemp as select * from emp
表建立.
SQL> drop table myemp
表刪除.
SQL> show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
MYEMP BIN$3oMpfWHfR6q1ccyEgXwBvg==$0 TABLE 2008-05-17:09:42:54
-----------------------閃回還原
SQL> flashback table myemp to before drop
2 /
閃回完成。
SQL> select empno ,ename ,job,sal deptno from myemp where deptno=20
2 /
3
4 EMPNO ENAME JOB DEPTNO
5 ---------- ---------- --------- ----------
6 7369 SMITH CLERK 800
7 7566 JONES MANAGER 2975
8 7788 SCOTT ANALYST 3000
9 7876 ADAMS CLERK 1100
10 7902 FORD ANALYST 3000
注意:使用"purge recyclebin"可以清除資源回收筒中的所有對象。
同時,您也可以通過purge user_recyclebin或purge dba_recyclebin來清除不同的資源回收筒對象。通過PURGE TABLESPACE TSNAME,PURGE TABLESPACE TSNAME USER USERNAME命令來選擇清除資源回收筒。
假如需要徹底刪除一個表,不想放到資源回收筒中,可以在drop語句中增加purge選項,例如:drop table tablename purge
注釋:您需要注意的是sysdba的Drop操作不會被記錄,Oracle從不推薦使用者用sysdba身份來建立使用者物件。
2、flashback database
如果想啟動FLASHBACK DATABASE的功能,您必須在MOUNT模式下,執行alter database flashback on命令。或者是alter tablespace tsname flashback on,資料庫將採集falshback log,如果需要關閉該功能,則修改On為OFF。
如果想執行flashback database命令,你可以在兩種方式下執行:RMAN與SQLPLUS。
SQL >flashback database to time to_date(xxx);
SQL >flashback database to time TO_TIMESTAMP (xxx);
SQL >flashback database to scn xxx
SQL >flashback database to sequence xxx thread 1
SQL>flashback database to timestamp(sysdate-1/24)
我們下面看看具體的例子說明
SQL>shutdown immediate;--立即關閉資料庫和執行個體
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount; --啟動執行個體並載入資料庫
ORACLE instance started.
Total System Global Area 113246208 bytes
Fixed Size 787708 bytes
Variable Size 87030532 bytes
Database Buffers 25165824 bytes
Redo Buffers 262144 bytes
Database mounted.
SQL> alter database flashback on;--開啟閃回功能
alter database flashback on
*
ERROR at line 1:
ORA-38706: Cannot turn on FLASHBACK DATABASE logging.
ORA-38707: Media recovery is not enabled.
可以看到,flashback還必須要歸檔的保證
SQL> alter database archivelog;--設為歸檔模式
Database altered.
SQL> alter database flashback on;
Database altered.
SQL> alter database open;--開啟資料庫
Database altered.
SQL> archive log list; --查看當前模式
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 13
Next log sequence to archive 15
Current log sequence 15
經過以上步驟,我們確保了flashback database的功能,我們還可以發現,10g的自動歸檔是不需要手工幹預的,只要開啟了歸檔,就是自動歸檔了,歸檔區也在DB_RECOVERY_FILE_DEST參數指定的地點。
通過如下的查詢
SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
Session altered.
SQL> SELECT OLDEST_FLASHBACK_SCN, OLDEST_FLASHBACK_TIME FROM V$FLASHBACK_DATABASE_LOG;
OLDEST_FLASHBACK_SCN OLDEST_FLASHBACK_TI
-------------------- -------------------
1135440 2008-05-17 15:20:54
我們可以知道,可以前滾恢複到的最早的SCN與時間點是多少,如果沒有確保flashback database,該視圖將沒有查詢結果。
我們建立三個一樣的表
SQL> create table t1 as select * from dba_objects;
Table created.
SQL> create table t2 as select * from t1;
Table created.
SQL> create table t3 as select * from t1;
Table created.
SQL> set time on;
SQL> select sysdate from dual;
SYSDATE
-------------------
2008-05-17 15:29:33
我們確定了一個時間點
現在,我們分別truncate一個表與drop一個表,類比誤操作。
SQL> set time on;
15:30:10 SQL> truncate table t2;
Table truncated.
15:30:43 SQL> drop table t3;
Table dropped.
沒有備份,我們利用flashback來恢複資料庫到2008-05-17 15:29:33時間點。
15:39:02 SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
15:39:31 SQL> startup mount exclusive
ORACLE instance started.
15:41:19 SQL> FLASHBACK DATABASE TO timestamp(to_date(2008-05-17 15:29:33','yyyy-mm-dd hh24:mi:ss'));
Flashback complete.
之後,我們可以用 ALTER DATABASE OPEN READ ONLY 來檢查結果是否正確,如果滿足結果,則可以用resetlog來正式啟動資料庫,注意,一旦resetlogs之後,將不能再flashback的resetlogs之前的時間點。
15:41:32 SQL> alter database open resetlogs;
Database altered.
我們現在查詢那三個表
15:42:10 SQL> select count(*) from t1;
COUNT(*)
----------
47708
15:42:47 SQL> select count(*) from t2;
COUNT(*)
----------
47708
15:42:50 SQL> select count(*) from t3;
COUNT(*)
----------
47708
發現truncate的記錄或者是drop的表都存在,現在資料庫已經前滾到前一個時間點了。
15:44:56 SQL> SELECT OLDEST_FLASHBACK_SCN, OLDEST_FLASHBACK_TIME FROM $FLASHBACK_DATABASE_LOG;
OLDEST_FLASHBACK_SCN OLDEST_FLASHBACK_TI
-------------------- -------------------
1136169 2008-05-17 15:41:50
同時探索資料庫的最早的flashback的時間與scn都回到resetlog的時間點了。