整理有關Flashback的相關資料

heibao326發表於2015-03-19

簡單概括

閃回功能

使用條件

Flashback query

Undo採用自動管理

Flashback Version query

Undo採用自動管理

Flashback transaction query

1.Undo採用自動管理
2.
開啟補充日誌alter database add supplemental log data(預設不開啟,一般不開啟)

Flashback table

方法一、開啟recyclebin(預設開啟),適用於drop table後的恢復
方法二、從undo表空間中恢復,table開啟行遷移alter table table enable row movement(預設不開啟)

Flashback database

開啟閃回區Flashback Recovery Area




















先建立一張表,以下示例均以這張表為例

Create  table  flash_tbl(id,vl) as select  rownum,oname from (select

substr(object_name,1,1)  oname  from all_objects

 group by  substr(object_name,1,1)  order by 1)

where rownum<=20;

一、 Flashback Query

1.1基於時間的查詢

Delete Flash_tbl  where id<10;

Commit;

假設5分鐘後,發現使用者發現誤刪了資料,則可以通過如下語句查出5分鐘前,flashback_tbl中的記錄

Select  *  from flashback_tbl as of timestamp sysdate-5/1440

 

1.2基於SCN的查詢

獲取資料庫當前的SCN

方法一:通過DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER函式,此時需給使用者分配許可權(grant execute on DBMS_FLASHBACK TO scott;)

方法二:查詢V$DATABASE中的CURRENT_SCN,此時需給使用者分配許可權(grant  select on v_$database to scott);

刪除前查詢下資料庫的SCN

Select dbms_flashback.get_system_change_number from dual;

----------------------------

1613083

Delete Flash_tbl  where id<10;

Commit;

此時可以通過指定SCN號來進行SCN=1613083時資料的查詢

SELECT * FROM FLASH_TBL  AS OF SCN 1613083;

 

備註:1.  Flashback query 不會更改資料,只是顯示某個時間點上表中的資料

      2.使用SCN查詢會比TIMESTAMP 更精確,實際上指定TIMESTAMP查詢,Oracle也是將其轉換成SCN。具體轉換規則是通過SYS.SMON_SCN_TIME實現的,可以通過兩個函式進行轉換

Select timestamp_to_scn(sysdate) from dual

Select  to_char(SCN_TO_TIMESTAMP(1613168),’yyyy-mm-dd’) from dual

      3.並非可以查詢到任何時間點的資料,需受undo_retentionundo空間大小限制。

      4.如果更改表結構(drop/modify 列、move表、drop分割槽、

Truncate Table/分割槽)是不能使用閃回查詢



一、 FLASHBACK Version Query

適用於檢視一段時間內某一物件多次修改的記錄

語法格式:SELECT ID,VL,VERSIONS_STARTSCN,

VERSIONS_ENDSCN,VERSIONS_OPERATION,VERSIONS_XID FROM FLASH_TBL VERSIONS BETWEEN SCN 1613083 AND 1613819;

備註:Flashback Query Version Query的偽列說明

VERSIONS_STARTSCN
VERSIONS_STARTTIME

該條記錄操作時的SCN或時間,如果為空,表示該行記錄是在查詢範圍外建立的

VERSIONS_ENDSCN
VERSIONS_ENDTIME

該條記錄失效時的SCN或時間,如果為空,說明記錄當前時間在當前表內部存在,或者已經被刪除,可以配合著VERSION_OPERATION列來看,如果VERSION_OPERATION列值為D,說明該列已被刪除;如果該列為空,則說明記錄在這段時間無操作

VERSIONS_XID

該操作的事務ID

VERSIONS_OPERATION

對該行執行的操作:I表示INSERT,D表示DELETE,U表示UPDATE


假設上述SQL查詢出的結果如下,解釋如下

ID

VL

VERSIONS_STARTSCN

VERSIONS_ENDSCN

VERSIONS_OPERATION

VERSIONS_XID

含義

201

A1

1636927

 

I

05000C0029050000

SCN=1636927insert,至現在還有效

4

C

1636904

 

D

06001300D7050000

記錄在SCN=1636904時被刪除

3

B

1636904

 

D

06001300D7050000

記錄在SCN=1636904時被刪除

2

A

1636904

 

D

06001300D7050000

記錄在SCN=1636904時被刪除

1

/

1636904

 

D

06001300D7050000

記錄在SCN=1636904時被刪除

120

S

1636892

 

U

400120077040000

記錄在SCN=1636892時被更新,至現在還有效

119

R

1636892

 

U

400120077040000

記錄在SCN=1636892時被更新,至現在還有效

118

Q

1636892

 

U

400120077040000

記錄在SCN=1636892時被更新,至現在還有效

117

P

1636892

 

U

400120077040000

記錄在SCN=1636892時被更新,至現在還有效

116

O

1636892

 

U

400120077040000

記錄在SCN=1636892時被更新,至現在還有效

1

/

 

1636904

 

 

記錄在SCN=1636904失效

2

A

 

1636904

 

 

記錄在SCN=1636904失效

3

B

 

1636904

 

 

記錄在SCN=1636904失效

4

C

 

1636904

 

 

記錄在SCN=1636904失效

5

D

 

 

 

 

記錄在SCN範圍外建立,至現在未有任何操作,還有效

6

E

 

 

 

 

記錄在SCN範圍外建立,至現在未有任何操作,還有效

7

F

 

 

 

 

記錄在SCN範圍外建立,至現在未有任何操作,還有效

8

G

 

 

 

 

記錄在SCN範圍外建立,至現在未有任何操作,還有效

9

H

 

 

 

 

記錄在SCN範圍外建立,至現在未有任何操作,還有效

10

I

 

 

 

 

記錄在SCN範圍外建立,至現在未有任何操作,還有效

11

J

 

 

 

 

記錄在SCN範圍外建立,至現在未有任何操作,還有效

12

K

 

 

 

 

記錄在SCN範圍外建立,至現在未有任何操作,還有效

13

L

 

 

 

 

記錄在SCN範圍外建立,至現在未有任何操作,還有效

14

M

 

 

 

 

記錄在SCN範圍外建立,至現在未有任何操作,還有效

15

N

 

 

 

 

記錄在SCN範圍外建立,至現在未有任何操作,還有效

16

O

 

1636892

 

 

記錄在SCN=1636892失效

17

P

 

1636892

 

 

記錄在SCN=1636892失效

18

Q

 

1636892

 

 

記錄在SCN=1636892失效

19

R

 

1636892

 

 

記錄在SCN=1636892失效

20

S

 

1636892

 

 

記錄在SCN=1636892失效


一、 使用FLASHBACK Transaction Query

    查詢某表修改記錄,並給出回滾SQL,但不能檢視當時修改的SQL,只能通過回滾SQL猜測

   示例如下

 delete flash_tbl where id = 401;

FLASHBACK_TRANSACTION_QUERY查詢

 

  select xid, commit_scn, commit_timestamp, operation, undo_sql

    from flashback_transaction_query q

   where q.xid in

         (select versions_xid

            from flash_tbl versions between scn 1643896 and 1643905)

XID

COMMIT_SCN

COMMIT_TIMESTAMP

OPERATION

UNDO_SQL

06000D00D9050000

1643902

2015/3/19 9:51

DELETE

insert into "XXCARA"."FLASH_TBL"("ID","VL") values ('401','A1');

06000D00D9050000

1643902

2015/3/19 9:51

BEGIN

 



一、 Flashback  Table

4.1 Recycle bin中恢復

    適用於不小心drop table的情形

   簡單示例如下

   Drop table flash_tbl;

   可以從recycle bin中查詢到

   select * from recyclebin where original_NAME='FLASH_TBL';

  我們可以直接利用以下語句直接閃回

   Flashback table flash_tbl to before drop;

  複雜示例如下

  情景一:待閃回的表名(flash_tbl)在資料庫中已又有了相同名字的表,這時候需要對待閃回的表進行rename

  Flashback  table  flash_tbl  to before  drop rename to flash_tbl_new;

  情景二:多個同名物件均被刪除多次,預設情況下是最先刪除的表最先被恢復,但是我們可以通過指定Recycle Bin中的物件名來恢復

  Flashback table “BIN$EZwIUFv2DOXgUwEAAH+rmg==$0”  to before drop;

 備註:如果刪除分割槽表的某一分割槽,則無法通過此方法恢復已刪除的分割槽。

4.2 UNDO中恢復

適用於處理的表不是被意外刪除,而是被反覆修改,希望回到某個時間點

Flashback語句:Flashback table Flash_tbl to scn  1666152

 

五、閃回資料庫

有關閃回資料庫部分暫不整理


文章整理自《塗抹Oracle》,轉載出處:http://wenku.it168.com/d_000051507.shtml 






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

相關文章