当前位置: > 数据库 > Oracle >

使用闪回查询找到误删除的数据

时间:2016-12-09 20:25来源:linux.it.net.cn 作者:IT

在oracle10G以后出现的闪回特性,可以让我们在一些情况下方便的找回我们错误删除的数据。

1.undo_retention参数默认900秒,很多时候我们需要调整这个参数如

alter system set undo_retention=18000 sid='*'

 需要注意的是如果RAC环境中,这样写会造成其他的节点挂起,需要使用下面的办法

alter system set undo_retention=18000 sid='RACDB1';
alter system set undo_retention=18000 sid='RACDB2';

调大这个参数会增加undo表空间的扩展,大家需要注意

2.演示找回错误删除的记录(注意,数据库必须处于归档模式下,非归档不能使用)

--1.创建测试用户
create user usr1 identified by usr1 default tablespace app1;
 
--2.创建测试表
conn usr1/usr1
create table test (id int,name char(10));
 
--3.创建测试数据
insert into test(1,'test1');
insert into test(2,'test2');
commit---提交写入redo log file
conn sys/oracle
alter system switch logfile; --手工切换日志,写入归档日志,实际中如果得到条件会自动触发

 模式删除操作,usr1用户的

delete from test where id=1;
 
--这里需要手工触发归档,实际中不需要,因为其他操作可能触发
conn sys/oracle
alter system switch logfile;

 进行恢复操作

--1.首先查询归档日志的scn号
select name,first_change#,first_time from v$archived_log order by 3 desc
/opt/oracle/oradata/orcl/archive1/orcl_1_7_810405035.dbf    1733071 2013-3-20 16:16:21
/opt/oracle/oradata/orcl/archive1/orcl_1_6_810405035.dbf    1731283 2013-3-20 15:52:51
/opt/oracle/oradata/orcl/archive1/orcl_1_5_810405035.dbf    1731279 2013-3-20 15:52:47
 
--2.查询当前的SCN号
 select dbms_flashback.get_system_change_number from dual;  --1734414

  --3.尝试使用闪回查询
     select * from test as of scn 1733071;看看是否存在删除的数据
      select * from test as of scn &scn;输入不同的SCN号来检查数据
    发现1733071 时有数据,创建临时恢复数据表进行操作
    create table test_recov as select * from test as of scn 1733071;  
 

 其实drop table也可以找回数据的,但是我还没有试验成功,后续会补充上。

除了上面使用闪回的方式直接找到数据外,另外还有一种办法就是使用不完全恢复,但是这种方式需要有一个测试机器,把数据恢复到测试机器上然后进行数据操作。
具体方式就是使用logminer来获取scn号。原理是通过logmnr来获取归档日志中的信息,这里可以获取完整的信息,包括当时使用的语句,操作人信息等,而这些信息是使用v$archived_log所不能直接获取到的,后面我会专门介绍logminer的使用。




(责任编辑:IT)
------分隔线----------------------------