ORACLE—DELETE表後的恢復

zhengbao_jun發表於2009-05-14

ORACLE—DELETE表後的恢復

ORACLE—DELETE表後的恢復

一)連線到資料庫
C:\Documents and Settings\Administrator>sqlplus system/sa@ot
SQL*Plus: Release 9.0.1.0.1 - Production on Wed May 13 19:13:53 2009
(c) Copyright 2001 Oracle Corporation.  All rights reserved.

Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL>
(二)建立表
SQL> create table t (id int );
Table created.
SQL>
(三)插入10000條資料
SQL> declare
  2   i int :=1;
  3  begin
  4  for i in 1..10000 loop
  5    insert into t values(i);
  6  end loop;
  7  end ;
  8  /
PL/SQL procedure successfully completed.
SQL> select count(*) from t;
  COUNT(*)
----------
     10000
SQL> commit;
Commit complete.
SQL>
(四)誤刪除所有記錄,並且提交更改。
SQL> select count(*) from t;
  COUNT(*)
----------
     10000
SQL> delete from t;
10000 rows deleted.
SQL> select count(*) from t;
  COUNT(*)
----------
         0
SQL> rollback;
Rollback complete.
SQL> select count(*) from t;
  COUNT(*)
----------
     10000
SQL> delete from t;
10000 rows deleted.
SQL> commit;
Commit complete.
SQL> select count(*) from t;
  COUNT(*)
----------
         0
SQL> rollback;
Rollback complete.
SQL> select count(*) from t;
  COUNT(*)
----------
         0
SQL>

(四)獲得當前SCN(Oracle 僅根據 SCN 執行恢復,它定義了資料庫在某個確切時刻提交的版本。在事務提交時,它被賦予一個唯一的標示事物的SCN )獲得當前SCN的目的是:可以進行閃回查詢嘗試.

SQL> select dbms_flashback.get_system_change_number from dual;

GET_SYSTEM_CHANGE_NUMBER
------------------------
                  961371

SQL>  select count(*) from t as of scn 9611370;
  COUNT(*)
----------
            0

(五)確定delete 時候的scn號

[1]建立一個臨時表用於儲存在scn為多少的時候執行了delete

create table temp(count int ,scn int);
[2]往臨時表中加入資料
declare
i int :=961000;
begin
for i in 961000..961371 loop
  insert into temp (scn) values (i);
  update  temp set count=(select count(*) from t as of scn i) where scn=i;
end loop;
end ;
/
[3]查詢scn為多少的時候執行了delete
SQL> select  * from temp where count >0;

     COUNT        SCN
---------- ----------
     10000     961147
     10000     961148
     10000     961149
     10000     961150
     10000     961151
     10000     961152
     10000     961153
     10000     961154
     10000     961155
     10000     961156
     10000     961157
     10000     961158
     10000     961159
     10000     961160
     10000     961161
     10000     961162

SQL>  select count(*) from t as of scn 961162;
  COUNT(*)
----------
     10000
SQL>  select count(*) from t as of scn 961163;
  COUNT(*)
----------
         0
我們看到在SCN=961162時資料都在。即scn為961163就是我們DELETE的事務號。

(六)恢復資料

SQL> insert into t select * from t as of scn 961162;
10000 rows created.

SQL> select count(*) from t;
  COUNT(*)
----------
     10000
SQL>

(七)清理temp表。
SQL> drop table temp;
Table dropped.

SQL> commit;
Commit complete.

SQL> select count(*) from t;
  COUNT(*)
----------
     10000

(八)總結
DELETE的事務號也可以用logminer來方便的獲得。系列實驗待續……

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

相關文章