事情时这个样子的:上个月一天下午同事突然找我说能给恢复一下正式库吗?当时我就头都大了,因为我们的数据库只有逻辑备份,而且是工作时间。和同事交流了一下,发现实际情况是业务上误删了数据,需要恢复数据。期间业务人员还手工补了数据,第一次闪回查询由于业务人员给说的时间不对,没有还原正确的数据,反而是给手工补的数据给恢复了。
create table test2 as
select * from xxxx
as of timestamp to_timestamp('2016-07-14 14:00:00', 'yyyy-mm-dd hh24:mi:ss');
select * from test2 a
where not exists (select 1 from xxxx b where a.PK_ACCSUBJ = b.PK_ACCSUBJ )
insert into xxxx
select * from test2 a
where not exists (select 1 from xxxx b where a.PK_ACCSUBJ = b.PK_ACCSUBJ )
下边记录一下Oracle的flashback的一些功能和自己的测试步骤
一。Flashback功能的前提准备
1.数据库必须在归档模式下
2.初始化参数
两个初始化参数,db_recovery_file_dest 闪回恢复区路径,db_recovery_file_dest_size 闪回恢复区大小;必须先设置大小,在设置路径
3.数据库开启闪回功能
二。Oracle 11g 的闪回
Oracle闪回功能分为:闪回数据库,闪回删除,闪回表,闪回查询,闪回版本,闪回数据归档,闪回事物处理
闪回删除
创建测试表空间,用户和表
create tablespace test datafile '/u01/app/oracle/oradata/orcl/test.dbf' size 100m;
create user hdb identified by hdb default tablespace test;
grant dba to hdb;
create table test1 as select * from dba_objects;
查看回收站
Drop表
再次查看回收站
可以看到drop表后,表在回收站里了,此时表的空间立马释放,可以使用,如果此时清理了回收站或者覆盖了回收站,就无法再闪回了。另外在回收站里的数据遵循先进先出原则。
闪回删除
2.闪回表
此时需要开启表行迁移
delete表
闪回表
3.闪回查询
最上边实际处理问题时使用的就是闪回查询功能,这里不再重复。
4.闪回版本
新建表test2,插入记录,修改ID
使用flashback versions query,可以看到对表的执行什么操作(i or u)以及数据的变更。可以通过timestamp和scn查询
select versions_starttime ,versions_endtime,versions_xid,versions_operation,
id,name
from test2 versions between timestamp minvalue and maxvalue
order by versions_starttime;
5.闪回数据归档
继续使用上边的test1表测试
注意:此处必须用sys用户设置
查看执行计划,可以看到是从表SYS_FBA_HIST_89874取数
关闭闪回归档
6.闪回事物处理
首先需要打开数据库的补充日志
然后执行undo_sql里的语句,完成闪回事物处理,可以看到,我们是3条insert语句和一条update语句,undo_sql语句对应的就是一条update语句和3条delete语句
7.闪回数据库
闪回数据库到scn2153825
使用resetlogs打开数据库,查看表test2