在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的使用。