天天看點

Oracle資料庫中誤删除資料後恢複

Oracle資料庫中誤删除資料後恢複

SCN(系統改變号),它的英文全拼為:System Change Number ,它是資料庫中非常重要的一個資料結構。

SCN提供了Oracle的内部時鐘機制,可被看作邏輯時鐘,這對于恢複操作是至關重要的

注釋:Oracle 僅根據 SCN 執行恢複。

它定義了資料庫在某個确切時刻送出的版本。在事物送出時,它被賦予一個唯一的标示事物的SCN 。一些人認為 SCN 是指, System Commit Number ,而通常 SCN 在送出時才變化,是以很多情況下,

這兩個名詞經常被交替使用。

究竟是哪個詞其實對我們來說并不是最重要的,重要的是我們知道 SCN 是 Oracle 内部的時鐘機制, Oracle 通過 SCN 來維護資料庫的一緻性,并通過SCN 實施 Oracle 至關重要的恢複機制。

具體執行流程我們可從以下幾個示例圖中體會;

1.原表記錄 

$ sqlplus eygle/eygle

SQL*Plus: Release 10.1.0.2.0 - Production on Wed Mar 30 08:52:04 2005

Copyright (c) 1982, 2004, Oracle. All rights reserved.

Connected to:

Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - 64bit Production

With the Partitioning, OLAP and Data Mining options

SQL>select count(*) from t_officename;

COUNT(*)

----------

9318

2.誤删除所有記錄,并且送出更改。

SQL>delete from t_officename;

9318 rows deleted.

SQL>commit;

Commit complete.

SQL>select count(*) from t1;

COUNT(*)

----------

3.獲得目前SCN

如果能夠确切知道删除之前SCN最好,如果不知道,可以進行閃回查詢嘗試.

SQL>select dbms_flashback.get_system_change_number from dual;

GET_SYSTEM_CHANGE_NUMBER

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

10671006

SQL>select count(*) from t1 as of scn 10671000;

COUNT(*)

----------

SQL>select count(*) from t1 as of scn 10670000; //如果找不到,不斷減少scn号再償試

COUNT(*)

----------

9318

  

我們看到在SCN=10670000時,資料都在。

  

4.恢複資料.

SQL>insert into t_officename select * from t_officename as of scn 10670000;

9318 rows created.

SQL>commit;

Commit complete.

SQL>select count(*) from t_officename;

COUNT(*)

----------

9318

誤删資料後的還原

select timestamp_to_scn(to_timestamp('2009-03-13 09:00:00','YYYY-MM-DD HH:MI:SS')) from dual;

結果:13526973

将删除時間轉換為scn

select * from reportinfo  AS OF SCN 13526973

将reportinfo表中的scn點的資料取出

後可以根據這個資料進行還原操作

create table reporttest as select * from reportinfo where 1=0;

insert into reporttest select * from reportinfo AS OF SCN 13526973;

--上面兩句應該可以合成一句

--create table reporttest as select * from reportinfo AS OF SCN 13526973;

這時reporttest表中就是scn點的reportinfo資料,處理即可