一,delete删除,delete删除并commit之后的数据是比较容易恢复的
查看数据库当前的scn号
select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
1203799
查看当前scn号中是否有已删除的数据 ,正常情况下是没有的,已被删除
select count(*) from test as of scn 1203799;
向上查找scn号,直到能查到数据
select count(*) from test as of scn 1203699;
把数据插入到表中commit即可
insert into test select * from test as of scn 1203699;
二、比如我们修改了emp表的sal字段
UPDATE scott.emp t
SET t.sal = '9999';
提交之后用下列语句查询获取versions_xid
SELECT versions_xid,empno,ename,sal FROM scott.emp
VERSIONS BETWEEN SCN minvalue AND maxvalue
WHERE empno='7900';
根据sal字段的值找到所需的versions_xid,根据versions_xid找到对应的scn号
SELECT operation,start_scn FROM flashback_transaction_query
WHERE XID=hextoraw('0200040040050000');
执行下列语句恢复
FLASHBACK TABLE scott.emp TO SCN 1979409
此时可能会提示没有打开行移动功能,用下列语句打开即可
alter table scott.emp enable row movement;
值得注意的是此方法用到快速闪回区,如果没有设置回滚段保留的时间,系统默认只能恢复15分钟内修改的数据,可以通过修改undo_retention参数延长保留时间,但是要考虑回滚段大小和dml语句的频率,如果dml频率较高切回滚段空间不足,及时没有达到undo_retention设置的时间,回滚段中的数据也会被覆盖。
三,truncate删除,这个恢复起来比较麻烦,看下大神的回复
https://zhidao.baidu.com/question/239854928645105324.html