一種資料被誤修改後的找回方法

yb708發表於2013-11-23

一種資料被誤修改後的找回方法

       之前同事跟我提起我們資料庫中表的資料有時會莫名其妙的被修改,針對這種情況如何儘快的找到原來的資料呢,看起來問題比較棘手,但如果問題發現的時間與資料被修改的時間間隔不長的話,在oracle中提供了一種比較簡單和輕量級的方法就是閃回查詢,通過閃回查詢在大多數情況下可以滿足這種要求。

       假設希望獲得表t1一天前的資料,使用如下查詢即可以達到目的:

FM@TEST 2013-11-22 15:21:21> SELECT * FROM T1 AS OF TIMESTAMP ( TO_DATE('2013-11-21 15:19:51', 'YYYY-MM-DD HH24:MI:SS') ) ;

A

----------

BBB

但如果查詢更早時間的資料,也有可能會報錯:

FM@TEST 2013-11-22 15:21:35> SELECT *FROM T1 AS OF TIMESTAMP ( TO_DATE('2013-11-21 00:19:51', 'YYYY-MM-DD HH24:MI:SS') ) ;

SELECT * FROM T1 AS OF TIMESTAMP ( TO_DATE('2013-11-21 00:19:51', 'YYYY-MM-DD HH24:MI:SS') )              *

ERROR at line 1:

ORA-01555: snapshot too old: rollback segment number 2 with name "_SYSSMU2_1606812849$" too small

能夠查詢到多久前的資料可以查詢檢視v$undostat(該檢視會保留4天的資料):

SYS@test 2013-11-23 18:18:51> select begin_time, end_time , tuned_undoretention from v$undostat order by end_time;

BEGIN_TIME          END_TIME            TUNED_UNDORETENTION

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

2013-11-19 18:28:21 2013-11-22 21:18:21                   0

2013-11-22 21:18:21 2013-11-22 21:28:21                1123

2013-11-22 21:28:21 2013-11-22 21:38:21                 900

2013-11-22 21:38:21 2013-11-22 21:48:21                1120

2013-11-22 21:48:21 2013-11-22 21:58:21                1720

2013-11-22 21:58:21 2013-11-22 22:08:21                1116

2013-11-22 22:08:21 2013-11-22 22:18:21                1717

這個查詢跨度由undo_retention引數、undo表空間的大小和undo表空間的RETENTION屬性(取值為NOGUARANTEEGUARANTEE)來控制,如果將undo_retention引數設定為更大的值(oracle的建議值是86400),並且undo表空間為自動擴充套件的話,閃回查詢可以保證查詢到更長時間前的資料。

另外通過這次對錶的閃回查詢的測試,糾正了之前的一個理解錯誤,表的閃回查詢需要在歸檔模式下才有效,其實沒有任何關係。


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

相關文章