1. 程式人生 > >oracle delete from table 誤刪資料的恢復:

oracle delete from table 誤刪資料的恢復:

oracle delete from table 誤刪資料的恢復:
select log_mode,open_mode,flashback_on from v$database;        --檢視閃回功能是否開啟(NO 表示未開啟;YES 表示啟用)
--開啟閃回
shutdown immediate
startup mount;
alter database flashback on;    --開啟閃回
alter database flashback off;    --關閉閃回
alter database open;    


建立測試表:
sqlplus / as sysdba
create tablespace test datafile '/u01/app/oracle/oradata/orcl/test.dbf' size 1024m autoextend on next 10m;
create user c##test identified by test;
grant dba to c##test;
ALTER USER c##test DEFAULT TABLESPACE test;
ALTER USER c##test TEMPORARY TABLESPACE TEMP;
conn c##test/test
create table t (ID int,NAME varchar2(20));    
insert into t values(1,'ZhangSan');
select * from c##test.t;

create table t3 as select * from t;

set time on;    --開啟時間顯示功能


select * from t3;
delete from t3;        --刪除表中的資料(只是刪除了資料,但表還是存在的)


--查詢表 t3 在 2018-12-27 13:08:28 這個時間點的資料(這張表是使用 delete from t3 刪除的)
select * from t3 as of timestamp to_timestamp('2018-12-27 13:50:40', 'yyyy-mm-dd HH24:mi:ss') ;
--發現用時間點查詢的有資料,但用select * from t3;查詢是沒有資料的


--如上:知道了表 t3 在 2018-12-27 13:50:40 的資料之後,我們就可以很容易的把表資料恢復到2018-12-27 13:50:40這個時間點了
--第一種方法,通過查詢閃回把2018-12-27 13:50:40這個時點之前的資料拿出來然後插入到當前 t3 表中
insert into t3 select * from t3 as of timestamp to_timestamp('2018-12-27 13:50:40', 'yyyy-mm-dd HH24:mi:ss');
--第二種方法:先找出從person表中刪除的記錄,然後再把它們插到person表中,Sql語句如下:
insert into t3 select * from t3 as of timestamp to_timestamp('2018-12-27 13:50:40', 'yyyy-mm-dd HH24:mi:ss') p where not exists(select * from t3 where id=p.id);