天天看點

10G的閃回技術

1.flash query

需要有flashback any table的系統權限或者是該表的flashback對象權限。

  需要有該表的SELECT, INSERT, DELETE, ALTER權限

  必須保證該表ROW MOVEMENT

A.drop table:

在普通使用者下使用 flashback table test to before drop;

但是在sys下面會報錯ORA-38305: object not in RECYCLE BIN

如果删除一個表,而不想放到資源回收筒中,可以利用purge選項在drop語句中,如

drop table tablename purge

另外,還有一些需要注意的地方

·drop tablespace tsname including contents時,表空間内的所有對象包括資源回收筒内的對象都将被清除。

·隻執行drop tablespace,如果有永久對象将不能執行,如果僅僅是有資源回收筒内的對象,将先清除資源回收筒,然後删除表空間

·如果drop user username cascade時,所有對象将被删除,而且不放入資源回收筒

B.delete/update/insert:

可以使用下列語句查詢曆史資料,但是超過undo_retention(預設15分鐘)的時候就不一定能查到:

SELECT * FROM test AS OF TIMESTAMP

  TO_TIMESTAMP('2009-01-9 09:00:00', 'YYYY-MM-DD HH:MI:SS')WHERE XXX

但是作了truncate等DDL操作用上面的查詢就,不能用閃回了

會報ORA-01466: 無法讀取資料 - 表定義已更改

執行FLASHBACK TABLE XXXXXXXXXX的時候必須先

alter table test enable ROW MOVEMENT

然後

FLASHBACK TABLE test TO TIMESTAMP TO_TIMESTAMP('2009-01-08 19:37:15', 'YYYY-MM-DD HH24:MI:SS')

多個表都需要flash back就可以

FLASHBACK TABLE test,test1,test2 TO TIMESTAMP TO_TIMESTAMP('2009-01-08 19:37:15', 'YYYY-MM-DD HH24:MI:SS')

  

10g的flashback table有如下特性

  · 線上操作

  · 恢複到指定時間點或者SCN的任何資料.

  · 自動恢複相關屬性,如索引,觸發器等

  · 滿足分布式的一緻性

  · 滿足資料一緻性,所有相關對象将自動一緻

  文法為:

  FLASHBACK TABLE test TO TIMESTAMP  TO_TIMESTAMP('2009-01-08 19:37:15', 'YYYY-MM-DD HH24:MI:SS')

  FLASHBACK TABLE test TO SCN 123456;

  FLASHBACK TABLE test TO TIMESTAMP '2009-01-08 19:37:15' ENABLE TRIGGERS;

  其中ENABLE TRIGGERS表示觸發器恢複之後為enable狀态,而預設為disable狀态。

以上的都是可以線上作,因為它使用的undo裡面的資料。

C.truncate table 不能恢複,其他對象比如package等就需要flash database了

D.其他操作:

a.

select versions_starttime,versions_endtime, versions_xid,versions_operation

from test versions

between timestamp minvalue and maxvalue

order by versions_starttime

在上述查詢中,列 versions_starttime、versions_endtime、versions_xid、versions_operation是僞列,

還有一些僞列,如versions_startscn和versions_endscn顯示了該時刻的系統更改号。列versions_xid顯示了更改該行的事務辨別符

b.某一段時間内的操作

select dummy,versions_starttime,versions_endtime, versions_xid,versions_operation from test 

versions between timestamp to_date('2009-01-09 08:30:00','yyyy-mm-dd hh24:mi:ss') and to_date('2009-01-09 08:30:00','yyyy-mm-dd hh24:mi:ss')

2.Flashback Transaction Query:

select * from FLASHBACK_TRANSACTION_QUERY

必須在SYS使用者下執行

裡面查詢的是undo的SQL,比如删除了一筆資料,裡面的就是插入資料的SQL,如果知道v$transaction的xid就可以查到這條undo SQL

3.flash database:

資料不要超過db_flashback_retention_target(預設一天),否則就有可能救不回來。

使用的回閃區域,是以,與下列的參數有關系

db_recovery_file_dest = /oracle/compard/flashbackarea

db_recovery_file_dest_size = 2G

db_flashback_retention_target = 1440

這些參數要事先設定好,否則mount下執行flashback on的時候,會報錯誤:

ORA-38706: Cannot turn on FLASHBACK DATABASE logging.

ORA-38709: Recovery Area is not enabled.

在mount狀态下,确認資料庫開啟到archivelog模式,打開回閃,指令如下:

alter database flashback on;

用下列指令确認資料庫是否開啟在閃回模式下

select flashback_on from v$database;

如果發現資料庫出問題,需要回閃,就可以使用下列指令,将整個資料庫回閃到過去某個時刻。

flashback database to timestamp TO_TIMESTAMP('2008-01-08 19:46:15', 'YYYY-MM-DD HH24:MI:SS');

alter database open read only;

看看是否正确,如果不正确,可以退到mount下繼續閃回

如果确認恢複的是正确的就是用這條SQL,把資料庫打開alter database open resetlogs;

試了一下,依次執行下面的這三條SQL都可以成功:

flashback database to timestamp TO_TIMESTAMP('2008-01-14 10:00:15', 'YYYY-MM-DD HH24:MI:SS');

flashback database to timestamp TO_TIMESTAMP('2008-01-14 09:58:34', 'YYYY-MM-DD HH24:MI:SS');

flashback database to timestamp TO_TIMESTAMP('2008-01-14 10:07:15', 'YYYY-MM-DD HH24:MI:SS');