联奕科技工程体系

 找回密码
 立即注册
查看: 174|回复: 0

Oracle delete数据后恢复办法示例

[复制链接]

21

主题

30

帖子

5万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
54982
发表于 2018-11-9 18:52:52 | 显示全部楼层 |阅读模式
1       创建表
SQL>create table wdongh(
  2  idinteger,
  3  namevarchar2(60)
  4  );
2       插入数据
SQL>insert into wdongh values(1,'wdh');
1 rowinserted
SQL>insert into wdongh values(2,'xiaoming');
1 rowinserted
SQL>insert into wdongh values(3,'hanmei');
1 rowinserted
SQL>insert into wdongh values(4,'leilei');
1 rowinserted
SQL>select * from wdongh;
                     ID               NAME
-----------      -----------
                      1               wdh
                      2               xiaoming
                      3               hanmei
                      4               leilei
3       删除数据
SQL>delete from wdongh;
4 rowsdeleted
SQL>commit;
Commitcomplete
SQL>select * from wdongh;
                     ID               NAME
-----------      -----------
4       获得当前SCN
Oracle 仅根据 SCN 执行恢复,它定义了数据库在某个确切时刻提交的版本。在事务提交时,它被赋予一个唯一的标示事物的SCN 。获得当前SCN的目的是:可以进行闪回查询尝试.
SQL>select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
                  668754
SQL>select count(*) from wdongh as of scn 668754;
  COUNT(*)
----------
         0
5       确定delete时的scn5.1   建立一个临时表用于存储在scn为多少的时候执行了delete
SQL>create table temp(count int,scn int);
Tablecreated
5.2   往临时表中加入数据
SQL>declare
  2  iint :=668700;
  3 begin
  4  fori in 668700..668754 loop
  5   insert into temp (scn) values (i);
  6   update  temp set count=(selectcount(*) from wdongh as of scn i) where scn=i;
  7  endloop;
  8  end;
  9  /
PL/SQLprocedure successfully completed
SQL>commit;
Commitcomplete
5.3   查询scn为多少时执行了delete
SQL>select  * from temp where count >0;
                                  COUNT                                     SCN
------------                   -------------
                                      4                                  668700
                                      4                                  668701
                                      4                                  668702
                                      4                                  668703
                                      4                                  668704
                                      4                                  668705
                                      4                                  668706
                                      4                                  668707
8 rowsselected
SQL>select count(*) from wdongh as of scn 668707;
  COUNT(*)
----------
         4
SQL>select count(*) from wdongh as of scn 668708;
  COUNT(*)
----------
         0
我们看到在scn668707时数据还在,即scn668708就是我们delete的事务号。
6       恢复数据
SQL>insert into wdongh select * from wdongh as of scn 668707;
4 rowsinserted
SQL>select count(*) from wdongh;
  COUNT(*)
----------
         4
7       干掉临时表temp
SQL>drop table temp;
Tabledropped
SQL>commit;
Commitcomplete

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|ly-sky.com

GMT+8, 2025-12-17 23:56 , Processed in 0.099663 second(s), 20 queries .

快速回复 返回顶部 返回列表