几种Oracle事务闪回方式



一、Flashback Version Query(闪回版本查询)
    闪回版本查询指的是Oracle可以针对特定的对象来查询某一特定段内该对象的变化的所有情况,可以对此跟踪该对象的变更情况。也可以根据特定的需要来将该对象修正到特定的时刻。闪回版本查询同闪回查询,闪回表一样,同样是使用了UNDO段的数据,即数据变更的多次镜像,当UNDO段的数据由于空间压力而被清除,则产生无法闪回的情况。

SQL> select emp.*,versions_xid xid,versions_startscn v_stcn,versions_endscn v_edcn,versions_operation v_ops from emp versions between scn minvalue and maxvalue where empno=7788 order by v_stcn;


     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO XID                  V_STCN     V_EDCN V
---------- ---------- --------- ---------- -------------- ---------- ---------- ---------- ---------------- ---------- ---------- -
      7788 SCOTT      ANALYST         7566 19-4月 -87           9000                    20 0A001C00EE070000    5406497    5406520 U
      7788 SCOTT      ANALYST         7566 19-4月 -87           8888                    20 0A001700F0070000    5406520    5406524 U
      7788 SCOTT      ANALYST         7566 19-4月 -87           7777                    20 0600100086080000    5406524    5406552 U
      7788 SCOTT      ANALYST         7566 19-4月 -87           7777                    20 010002000E080000    5406552            D
      7788 SCOTT      ANALYST         7566 19-4月 -87           3000                    20                                5406497


SQL> select scn_to_timestamp('5406497') from dual;


SCN_TO_TIMESTAMP('5406497')
---------------------------------------------------------------------------
20-8月 -15 02.19.58.000000000 下午


select empno,ename,job,versions_xid xid,versions_startscn v_stcn,versions_endscn v_edcn,versions_operation v_ops
 from tb1 versions between timestamp to_timestamp(systimestamp-1/24) and systimestamp where empno=7788;  




二、Flashback Transaction Query(闪回事务查询)
    闪回事务查询是对闪回版本查询的扩展。从某种程度上来说,闪回版本查询通常用于更细粒度的查询,如针对特定的记录。而闪回事务则是针对某一事务进行闪回,是基于事务级别的。闪回事务查询通过查询视图flashback_transaction_query来获得某个或多个特定事务信息,同时可以根据该视图中提供的undo_sql 列中的语句来反转事务,从而保证数据的完整性。
    查询该视图需要具有select any transaction权限,默认情况下sys用户和DBA角色具有该权限
SQL> select emp.*,versions_xid,versions_operation from emp versions between scn minvalue and maxvalue where empno=7788;
    EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO VERSIONS_XID     V
---------- ---------- --------- ---------- -------------- ---------- ---------- ---------- ---------------- -
      7788 SCOTT      ANALYST         7566 19-4月 -87           7777                    20 010002000E080000 D
      7788 SCOTT      ANALYST         7566 19-4月 -87           7777                    20 0600100086080000 U
      7788 SCOTT      ANALYST         7566 19-4月 -87           8888                    20 0A001700F0070000 U
      7788 SCOTT      ANALYST         7566 19-4月 -87           9000                    20 0A001C00EE070000 U
      7788 SCOTT      ANALYST         7566 19-4月 -87           3000                    20
查出需要闪回的VERSIONS_XID,然后根据VERSIONS_XID生成语句:
select operation,undo_sql from flashback_transaction_query where xid=hextoraw('02002000BC080000');  


闪回中不能对DDL语句进行闪回,即闪回仅仅支持DML语句


其他:
SQL> select * from emp as of timestamp to_timestamp('2011-11-11 22:22:22','yyyy-mm-dd hh24:mi:ss');
SQL> select * from emp as of timestamp to_timestamp('2011-11-11 22:22:22','yyyy-mm-dd hh24:mi:ss')
minus select * from emp;
     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
      7788 SCOTT      ANALYST         7566 19-4月 -87           3000                    20


SQL> flashback table emp to scn 888888888
SQL> flashback table emp to timestamp to_timestamp('2011-11-11 22:22:22','yyyy-mm-dd hh24:mi:ss')






三、flashbackup Drop
SQL> select object_name,original_name,can_undrop,base_object from user_recyclebin;


OBJECT_NAME                    ORIGINAL_NAME                    CAN BASE_OBJECT
------------------------------ -------------------------------- --- -----------
BIN$R+7H89/oTnGvqmWpAFZaSA==$0 PK_EMP                           NO        73196
BIN$N3axp9c7R1quSwqwIzgecw==$0 EMPL                             YES       73196


SQL> show recyclebin;
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
EMPL             BIN$N3axp9c7R1quSwqwIzgecw==$0 TABLE        2010-08-20:14:49:41


SQL> flashback table empl to before drop;
SQL> select index_name,index_type from user_indexes where table_name='EMPL'
union all
select constraint_name,constraint_type from user_constraints where table_name='EMPL'; 


INDEX_NAME                     INDEX_TYPE
------------------------------ ---------------------------
BIN$v8gKmZi5Quqlm6N3VAZSBQ==$0 P
此时,索引名称仍然为回收站里的名称,需要手工恢复:
SQL> alter index "BIN$v8gKmZi5Quqlm6N3VAZSBQ==$0" rename to PK_EMP;
SQL> select index_name,index_type from user_indexes where table_name='EMPL'
union all
select constraint_name,constraint_type from user_constraints where table_name='EMPL'; 


INDEX_NAME                     INDEX_TYPE
------------------------------ ---------------------------
PK_EMP                         NORMAL

注意:当表空间不足时,回收站里的表会被删除。flashback drop 不能闪回truncate命令截断的表,而是只能恢复drop 之后的表。不能闪回drop user scott cascade删除方案的操作,此只能用flashback database,在system表空间中存储的表无法启用flashback drop,且这些表会被立即删除



四、flashback database
闪回技术通常用于快速简单恢复数据库中出现的认为误操作等逻辑错误,从闪回的方式可以分为基于数据库级别闪回、表级别闪回、事务级别闪回,根据闪回对数据的影响程度又可以分为闪回恢复,闪回查询。闪回恢复将修改数据,闪回点之后的数据将全部丢失。而闪回查询则可以查询数据被DML的不同版本,也可以在此基础之上确定是否进行恢复等。


flashback data1base闪回到过去的某一时刻,闪回点之后的工作全部丢失,使用resetlogs创建新的场景并打开数据库(一旦resetlogs之后,将不能再flashback至resetlogs之前的时间点)


    常用的场景:truncate table、多表发生意外错误等
   


 flashback database的组成:
    闪回缓冲区:当启用flashback database,则sga中会开辟一块新区域作为闪回缓冲区,大小由系统分配
    启用新的rvwr进程:rvwr进程将闪回缓冲区的内容写入到闪回日志中,注意闪回日志不同于联机重做日志,闪回日志在联机重做日志基础之上生成,是完整数据块映像的日志。联机日志则是变化的日志。闪回日志不能复用,也不能归档。闪回日志使用循环写方式。


 flashback database的配置:
    1、flashback database要求数据库必须处于归档模式,且闪回之后必须使用resetlogs打开数据库
    2、需设置db_recovery_file_dest、db_recovery_file_dest_size
    3、需设置db_flashback_retention_target
    4、需在mount下启用:
    SQL> startup mount exclusive;
    SQL> alter database flashback on;
    查看闪回区配置
    SQL> select oldest_flashback_scn old_flhbck_scn,oldest_flashback_time old_flhbck_tim,retention_target rete_trgt,flashback_size/1024/1024 flhbck_siz,estimated_flashback_size/1024/1024 est_flhbck_size from v$flashback_database_log;


SQL> shutdown immeidate;
SQL> statup mount;
SQL> flashback database to timestamp('2010-10-24 13:04:30','yyyy-mm-dd hh24:mi:ss'); 
SQL> flashback database to scn 888888;
SQL> flashback database ro restore point b1_load;
SQL> alter database open resetlogs;


可以针对表空间是否闪回进行设置:
SQL> alter tablespace users flashback off;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值