1. 程式人生 > >使用閃回功能快速恢復用戶的誤操作

使用閃回功能快速恢復用戶的誤操作

查看表 問題 使用 策略 mail 關註 because 基於 實驗

Oracle提供的閃回特性對於快速恢復誤操作的數據起到了非常大的幫助。在沒有這個特性的Oracle早期版本,如果需要恢復因用戶錯誤導致的數據丟失,需要大量的時間和精力去做不完全恢復。

不過,這種用空間換時間的策略也存在限制,不可能無限地恢復任何時間點的誤操作。針對那些“及時”發現的誤操作,使用該方法進行恢復是非常有效的。

簡單演示一下這個方法,供參考。

1.創建實驗表T
[email protected]> create table t (x int);

Table created.

2.初始化數據
[email protected]> insert into t values (1);

1 row created.

[email protected]> commit;

Commit complete.

[email protected]> insert into t values (2);

1 row created.

[email protected]> commit;

Commit complete.

3.查看表中的數據,之所以使用rowid字段是為了後面實驗參考方便。
[email protected]> select rowid, x from t;

ROWID X
------------------ ----------
AAASVaAAFAAAAAYAAA 1
AAASVaAAFAAAAAYAAB 2

4.模擬誤刪除
[email protected]> delete from t;

2 rows deleted.

[email protected]> commit;

Commit complete.

5.看一看此時T表有哪些動作被記錄在案?
[email protected]> select versions_starttime,versions_endtime, versions_xid, versions_operation,t.x from t versions between timestamp minvalue and maxvalue;

VERSIONS_STARTTIME VERSIONS_ENDTIME VERSIONS_XID V X
--------------------- --------------------- ---------------- - ----------
05-DEC-09 09.52.51 PM 09002C004B250000 D 2
05-DEC-09 09.52.51 PM 09002C004B250000 D 1
05-DEC-09 09.50.57 PM 05-DEC-09 09.52.51 PM 090018004B250000 I 2
05-DEC-09 09.49.54 PM 05-DEC-09 09.52.51 PM 090008004B250000 I 1

因為前後的操作時間並不是很長,所以對於T表的所有操作都清晰的展示出來了。

6.恢復方法一:使用UNDO SQL。
重點關註一下“VERSIONS_XID”的內容,每一個不同的值都對應了一個完整的操作動作。我們逐條看一下上面每個動作對應的恢復語句。
1)如果要恢復誤刪除的操作,可以使用下面的UNDO SQL。
[email protected]> select undo_sql from flashback_transaction_query WHERE XID=‘09002C004B250000‘;

UNDO_SQL
----------------------------------------------------------------------
insert into "SEC"."T"("X") values (‘2‘);
insert into "SEC"."T"("X") values (‘1‘);

2)向前一步回滾:回滾插入的“2”,即刪除記錄“2”對應的行。
[email protected]> select undo_sql from flashback_transaction_query WHERE XID=‘090018004B250000‘;

UNDO_SQL
----------------------------------------------------------------------
delete from "SEC"."T" where ROWID = ‘AAASVaAAFAAAAAYAAB‘;

3)再向前回滾:回滾插入的“1”,即刪除記錄“1”對應的行。
[email protected]> select undo_sql from flashback_transaction_query WHERE XID=‘090008004B250000‘;

UNDO_SQL
----------------------------------------------------------------------
delete from "SEC"."T" where ROWID = ‘AAASVaAAFAAAAAYAAA‘;

7.恢復方法二:使用SCN號進行便捷恢復
上面雖然已經列出了具體回滾的SQL語句,只要簡單的執行即可,不過如果涉及的到的記錄數非常多,那麽使用具體的UNDO SQL就不是很方便了。
這裏有一個比較簡單的方法,我們可以通過XID的值在flashback_transaction_query視圖中得到操作前的SCN號,然後根據SCN號進行閃回恢復。簡單演示一下。
1)得到誤刪除之前的SCN號
[email protected]> col UNDO_SQL for a42
[email protected]> col OPERATION for a8
[email protected]> select undo_sql, operation, start_scn from flashback_transaction_query WHERE XID=‘09002C004B250000‘;

UNDO_SQL OPERATIO START_SCN
------------------------------------------ -------- ----------
insert into "SEC"."T"("X") values (‘2‘); DELETE 31205010
insert into "SEC"."T"("X") values (‘1‘); DELETE 31205010
BEGIN 31205010
2)使用上面的SCN號“31205010”進行閃回
[email protected]> flashback table t to scn 31205010;
flashback table t to scn 31205010
*
ERROR at line 1:
ORA-08189: cannot flashback the table because row movement is not enabled

3)上面報錯提示信息很明確,需要啟用“row movement”。
[email protected]> alter table t enable row movement;

Table altered.

4)再次嘗試閃回,成功。
[email protected]> flashback table t to scn 31205010;

Flashback complete.

5)最後重新查看一下T表的操作記錄
[email protected]> select versions_starttime,versions_endtime, versions_xid, versions_operation,t.x from t versions between timestamp minvalue and maxvalue;

VERSIONS_STARTTIME VERSIONS_ENDTIME VERSIONS_XID V X
--------------------- --------------------- ---------------- - ----------
05-DEC-09 10.02.16 PM 09000F004C250000 I 1
05-DEC-09 10.02.16 PM 09000F004C250000 I 2
05-DEC-09 09.52.51 PM 09002C004B250000 D 2
05-DEC-09 09.52.51 PM 09002C004B250000 D 1
05-DEC-09 09.50.57 PM 05-DEC-09 09.52.51 PM 090018004B250000 I 2
05-DEC-09 09.49.54 PM 05-DEC-09 09.52.51 PM 090008004B250000 I 1

6 rows selected.

可見閃回的動作也被記錄在案,因為使用的是真實的SQL來完成。

6)使用這種基於SCN的恢復方法可以將表恢復到任何“可恢復”的時間點,比較靈活。
例如,我們可以使用下面的SQL恢復T表到僅插入記錄“1”的狀態。
[email protected]> flashback table t to scn 31204988;

Flashback complete.

[email protected]> select * from t;

X
----------
1

8.小結
使用此閃回方法恢復誤操作有一個前提,就是需要盡早的發現問題,果斷的采取行動。若誤操作的記錄已經在UNDO中被清除,則此方法就不可行了,需要另尋他法。

使用閃回功能快速恢復用戶的誤操作