oracle闪回技术


一、闪回设置

show parameter undo; 
undo_managment='AUTO';   //自动闪回管理
undo_retention=900;   //闪回数据保存秒数
undo_tablespace='UNDOTBS1';   //设置闪回表空间

二、闪回查询

1、闪回时间查询

select * from scott.dept;
delete from scott.dept where deptno=40; 
commit;
select * from scott.dept as of timestamp sysdate-1/1400;  //查看一分钟前的表信息,删除后一分钟内查询,否则要把时间范围扩大

2、闪回scn查询

select ora_rowscn,deptno,dname from scott.dept;  
update scott.dept set dname='DBA' where deptno=30;
commit;

select ora_rowscn,deptno,dname from scott.dept;  //获取修改数据后的scn号,得1343382
select deptno,dname from scott.dept as of scn 1343382-1;  //获取修改前的数据

三、闪回版本查询

1、伪列

versions_xid   //事务号
versions_operation  //执行的操作类型,U(update)、I(insert)、D(delete)
versions_starttime  //操作时间
versions_startscn  //scn号

//外部表、临时表、固定表、视图不能使用versions子句
//versions子句不能跨DDL命令使用

2、查询伪列

select versions_xid,versions_operation,versions_starttime,versions_startscn,deptno,dname from scott.dept versions between scn minvalue and maxvalue;

四、闪回表

update scott.emp set sal=sal+1;
commit;

select versions_starttime,versions_startscn from scott.emp versions between scn minvalue and maxvalue;

alter table scott.emp enable row movement;  //打开行的移动
flashback table scott.emp to scn 447150-1;
alter table scott.emp disable row movement;

五、闪回事务处理查询

alter database add supplemental log data;  //增加附加日志
alter database add supplemental log data (primary key) columns;
select supplemental _log_data_fk,supplemental _log_data_all,supplemental _log_data_min,supplemental _log_data_pk,supplemental _log_data_ui from v#database;


delete scott.emp;
commit;
select tname from tab where tname like '%TRAN%';
desc flashback_transaction_query;

select versions_xid from scott.emp versions between scn minvalue and maxvalue;
select undo_sql from flashback_transaction_query where xid='versions_xid ';  //反操作语句

spool /tmp/emp.sql rep;
set linesize 400;
select undo_sql from flashback_transaction_query where xid='versions_xid ';
spool off;
ho sed '/^insert into/p' -n /tmp/emp.sql >/tmp/emp1.sql
start /tmp/emp1.sql;

六、闪回技术归档

FDA=Flashback Data Archive,返回数据归档

create tablespace fda datafile '/u01/oracle/oradata/wyzc/fda01.dbf'  size 10m autoextend on;  //创建表空间

create flashback archive fda  tablespace fda quota 10m retention 1year;

select * from system_privilege_map where name like '%FLASH%';  //查询权限信息
grant flashback archive administer to scott;  //给scott用户赋予权限

conn scott/tiger;
alter table emp flashback archive fda;
select * from user_flashback_archive_tables where table_name 'EMP';//查看表是否打开了数据归档

update emp set sal=sal+1;
commit;
truncate table emp;  //截断数据表,还能通过闪回查询查出
select * from emp as of timestamp sysdate-1;  //闪回查询昨天的数据
insert into emp select * from emp as of timestamp sysdata-1;  //插入闪回查询的数据
select * from emp versions between scn minvalue and maxvalue;

drop table emp;  //不能删除,因为存在数据归档。删除、重命名、或修改某一列会出错
alter table emp no flashback archive;
drop table emp;
flashback table emp to before drop;

//关闭数据归档之后再从truncate执行,到闪回查询那一步会出错

七、闪回删除的对象和回收站

show parameter recycle;  //dba用户查看数据库回收站是否打开
conn scott/tiger;
drop table emp;
show recyclebin;  //查看回收站信息(非dba用户)
select * from tab;

desc "BIN...."; //和emp一样的结构信息
flashback table "BIN..." to before drop;
select * from emp;

//如果有两个重新的emp,用上一个语句恢复会出错,需要重命名
flashbacktable "BIN..."  to before drop rename to empold;

purge recyclebin;  //清空回收站
select count(*) from dba_recyclebin;
drop table emp; purge table emp;
//清空回收站里的某一张表

八、闪回数据库(尽量少用,可以在备库使用)

select flashback_on from v$database;  //查看数据库闪回是否启动
shutdown immediate;  //关闭数据库,打开归档模式
startup mount;
alter database archivelog;
alter database flashback on;  //必须先归档之后再设置,否则会出现错误
alter database open;

show parameter flashback;  //得到最长的数据库返回时间,一般是1440min
show parameter db_re;//返回数据存放路径
drop table scott.emp purge;

//日志挖掘查找删除时间点
select group#,member,a.status from v$log a join v$logfile using(group#);
exec dbms_logmnr.add_logfile('/u01/oracle/oradata/cmh/redo02.log');
exec dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catatlog);
select scn,to_char(timestamp,'yyyy-mm-dd hh24:mi:ss'),sql_redo from v$logmnr_contents where table_name='EMP';
exec dbms_logmnr.end_logmnr;

shutdown immediate;
startup mount;
flashback database to scn 1342774;
alter database open read only;  //这时候修改数据会出错,read-only access
startup force; //强制启动也会出错
alter database open resetlogs;

参考连接:https://blog.csdn.net/javahelpyou/article/details/123946465