Oracle闪回Flashback详解

一、闪回数据查询:

数据来源于UNDO表空间,数据库能保留多少撤销数据决定了闪回查询的时间窗口大小。

UNDO数据的保留策略取决于4个因素:

1、初始化参数undo_retention的值,默认为900秒,但默认情况下这只是一个建议值,能否落实还得看下面的参数

SQL>show parameter undo_retention    ---查看
SQL>alter system set undo_retention=3600   ---修改   

2、开启UNDO表空间的数据文件自动增长。如不开启,当空间不足时数据库照样会覆盖没有满足undo_retention的撤销数据。不得不说在一个事务量很大的数据库上开启这个功能是非常危险的,因为UNDO表空间的数据文件会变得很大

SQL> show parameter undo_tablespace   --查看表空间名字
SQL> select autoextensible from dba_data_files where tablespace_name=(select value from v$parameter where name='undo_tablespace');  ---是否开启
SQL> alter tablespace undostb1 autoextent on next 50m maxsize unlimited;    

3、使undo_retention成为绝对值---------GUARANTEE 保证,NOGUARANTEE 不保证

SQL> select retention from dba_tablespaces where tablespace_name='UNDOTBS1';
SQL> alter tablespace undotbs1 retention guarantee;  

4、数据库的事务量。如果数据库的事物量特别的大,还是考虑以下上面的设置会不会带来负面的影响。

闪回时间点查询:

select * from emp as of timestamp[scn] to_timestamp('','') ;
开启闪回模式:exec dbms_flashback.enbale_at_time()[enable_at_scn]
关闭闪回模式: exec dbms_flashback.disable

闪回版本查询:

select versions_xid,versions_startscn,versions_endscn,versions_starttime,versions_endtime from emp versions between timestamp(systimestamp - interval '15' minute)

二、闪回数据:

利用UNDO表空间的撤销数据

alter table emp enable row movement 
flashback table emp to timestamp(systimestamp - interval '10' minute) | to scn 1080318
执行flashback table命令必须有flashback  any table的权限 或者对该对表的flashback 权限,truncate删除数据,无法闪回

三、闪回数据归档:

将原来只保存在UNDO表空间的撤销数据额外的以一种历史表的形式保存在指定的普通表空间(permanent类型的表空间)中,且可以只为特定的表服务(Automatic undo management 必须开启;所依附的表空间必须开启自动段空间管理)

grant flashback archive administer to hr; ----执行以下语句需要该权限
create flashback archive [default] fda1 tablespace users retention 1 year;
grant flashback archive on fda1 to scott;  ----执行下面语句需要该权限
alter table emp flashback archive fda1; ---如果上面创建的是默认的闪回数据归档,这里就不用指定闪回数据归档的名称,即fda1

或者在创建表时就指定: create table t (id number) flashback archive fda1; 
关闭表上的数据归档功能:alter table t no flashback archive;
查询闪回数据归档:select * from t as of timestamp (systemstamp -  interval '7' month);
清除归档:alter flashback archive fda purage before timestamp timestamp (systimestamp - interval '1' month);
或清除全部:alter flashback archive fda purage all

 四、闪回事务查询 (DML):

区别于闪回查询:1)不但需要撤销数据,还需要事先启用最小补充日志;2)返回的是SQL语句;3)通过表flashback_transaction_query查询

grant select any transaction to scott;
alter database add supplemental log data;
--查出XID,即事务号
select versions_xid,versions_starttime,versions_endtime,versions_operation,[versions_startscn,versions_endscn] from emp versions between timestamp minvalue and maxvalue;   
          
**** versions between timestamp minvalue and maxvalue 显示出所有值,因为versions between timestamp后必须有范围,就用minvalue and maxvalue 代替.这里有多种组合,minvalue and maxvalue 、SCN、to_date这三种组合
select undo_sql from flashback_transaction_query where xid='1234567890'; 

下面是一个PL/SQL匿名块来执行UNDO_SQL:

begin 
for rec in (select undo_sql from flashback_transaction_query where xid='1234567890') loop 
  if rec.undo_sql is not null then 
	 execute immediate substr (rec.undo_sql,1,length(rec.undo_sql)-1); 
  end if; 
end loop; 
commit; 
end; 
/

五、闪回事务:

自动分析重做日志,挖掘出变更前的值用以构建撤销SQL,然后执行撤销。要启用主键补充日志和外键补充日志

            事务依赖性:WAW依赖、主键依赖、外键依赖三种。

            WAW依赖即Write After Write,事务1先修改了一行,事务紧接又修改了同一行。

            主键依赖即在事务1在一张拥有主键的表上删除一行,事务2又插入了具有相同主键值的另一行,即两次事务的主皱键值相同

            外键依赖即事务1修改(insert or update)了而产生了新的可被外键参考的字段值,之后事务2修改(insert or update)外键字段时利用了事务1所产生的字段值

       nocascade, 事务1不可被任何其它事务依赖,否则撤销操作报错

       cascade,将事务1同事务2一起撤销。

       nocascade_force,忽略事务2,直接执行事务1的撤销SQL,如果没有约束冲突,操作成功,否则约束报错导致撤销操作失败

       nonconfilict_only,在不影响事务2的前提下,撤销事务1的修改。与nocascade_force的不同在于首先过滤一下事务1的撤销SQL,确保他们不会作用在事务2的修改的行上

select distinct xid,commit_scn,undo_sql from flashback_transaction_query  where table_owner='SCOTT' and table_name='EMP' and commit_timestamp > systimestamp - interval '15' minute order by commit_scn;       

------------------------

declare
 xids sys.xid_array;
   begin
	  xids :=sys.xid_array('0A00160094020000');
	  dbms_flashback.transaction_backout(1,xids,options=>dbms_flashback_nocascade);
   end;
 /
********transaction_backout的第一参数是VARRAY内事务号的数量,第二个参数是容纳事务事号的VARRAY集合变量

注意四个权限:

alter database add supplemental log data;

alter database add supplemental log data (primary key) columns;

grant execute on dbms_flashback to hr;

grant select any transaction to hr;

如果hr用户需要对其它用户下的对象的事务进行闪回,还必须具有对该用户下的所有表具有DML操作的权限

6、闪回删表(Flashback drop):

当DROP时,表及索引并没有真正删除,其所占空间(称为段)只是分配给了另一种对象:回收站,并且这种分配使数据和数据块没有发生任何移动,还是待在原来的数据文件及表空间中。

flashback table emp to before drop [rename to empold]
flashback table "BIN$pseZ0Q66QY60DQn8jHaAxA==$0" to before drop [rename to  empold]; 

7、闪回数据库:

利用闪回日志、重做日志。

闪回数据库方式有两种:如当前时间点为TC,数据库要闪回到T1(TC>T1)。 flashback database to <PIT>   ----PIT可以是SCN、时间或还原点

   一、先用闪回日志回退到T2(T2<T1),再利用重做日志前滚到T1

   二、确定一个比T1更旧的某时刻T2,对于闪回日志无法恢复的对象或数据(比如删除了100W条记录,闪回日志不可能记录这些数据),数据库回退到创建些对象的时间点T3(T3<T2),利用重做日志将其恢复,再利用闪回日志将数据库从TC回退到T2,利用重做日志将数据从T2前滚至T1。

-----------------------------------------------------------------------------------------------

查看最远的闪回点
select oldest_flashback_scn,to_char(oldest_flashback_scn,'YYYY-MM-DD HH24:MI:SS') from v$flashback_database_log; 
强制启动到mount下
startup force mount
闪回到指定的SCN
flashback database to scn 1234567    
查看数据是否闪回到想要的那个时间点
alter database open read only;  
如果还没有闪回到指定的还原点,重复执行直到闪回到对应的时间点在mount下执行

   

闪回日志的路径必须是快速恢复区的子目录,保存的期限则由参数db_flashback_retention_target控制

必须开启闪回日志功能,闪回查询、闪回事务查询、闪回表均依赖ROWID定位“过去”和“现在”的行,如果执行过导致行移动的命令,如alter table ... move、alter table ... shrink space;

dbms_flashback.transaction_backout时所需日志不存在,将报告类型ORA-00308:cannot open archived log;若撤销数据已不存在,将报告ORA-01555:snapshot too old错误

由于默认情况下,闪回日志没有启用,闪回数据库功能没有关闭的;由于最小补充日志没有启用,闪回事务查询功能是关闭的;由于主键补充日志没有启用,闪回事务功能是关闭的,其它闪回功能默认可使用的

SQLPLUS下的闪回数据库方式:

FLASHBACK [STANDBY] DATABASE [<database_name>]  TO [BEFORE] SCN <system_change_number>   --基于SCN闪回
FLASHBACK [STANDBY] DATABASE [<database_name>]  TO [BEFORE] TIMESTMP <system_timestamp_value>--基于时间戳闪回
FLASHBACK [STANDBY] DATABASE [<database_name>]  TO [BEFORE] RESTORE POINT <restore_point_name>--基于时点闪回
例句:
flashback database to timestamp('2010-10-24 13:04:30','yyyy-mm-dd hh24:mi:ss');
flashback database ro restore point b1_load;

RMAN下闪回数据库方式:

RMAN> flashback database to scn=918987;
RMAN> flashback database to sequence=85  thread=1;
RMAN> flashback database to time="to_date('2010-10-24 13:59:00','yyyy-mm-dd hh24:mi:ss')";

闪回情况查看:

v$flashback_database_log;
v$recovery_file_dest;

2

热门评论