ORACLE闪回----flashback version query/transaction

本文深入介绍了Oracle的闪回技术,包括闪回查询、闪回版本查询和闪回事务。通过示例展示了如何使用闪回查询查看历史数据版本,以及如何利用闪回事务回滚特定操作。此外,还强调了闪回查询不适用于外部表、临时表和V$视图,并解释了未提交事务不会出现在闪回版本中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 1)flashback drop

   2)flashback query

   3)flashback data archive

   4)flashback table

   5)flashback version query

   6)flashback transaction

   7)flashback database

 

闪回版本和事务

1.要点:

闪回查询仅仅能够得到过去某个时间点上的数据,但是无法反映出一段时间内数据表中数据变化的细节,10g的闪回版本查询可以对时间段内数据表的每行变化(不同版本)进行查询。

2.语法:

select   …  from  …   versions  between

其中,select后面可以选择伪列,来获得事务的开始、结束时间、SCN号、事务XID号等。

①闪回版本查询不能用于外部表、临时表或V$视图。原因是这些对象都不生成撤销数据。(临时表的撤销是基于session的)。

②闪回版本中的内容不包括未提交的DML语句。

追加日志:
SYS@ prod>ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;

数据库已更改。

SYS@ prod>create table t3 (id int, name char(10));

表已创建。

SYS@ prod>insert into t3 values(1,'tim');

已创建 1 行。

SYS@ prod>insert into t3 values(2,'mike');

已创建 1 行。

SYS@ prod>insert into t3 values(3,'brain');

已创建 1 行。

SYS@ prod>insert into t3 values(4,'cade');

已创建 1 行。

SYS@ prod>commit; 

提交完成。

SYS@ prod>update t3 set name='nelson' where id=4;

已更新 1 行。

SYS@ prod>commit;

提交完成。

SYS@ prod>delete t3 where id=2;

已删除 1 行。

SYS@ prod>commit;

提交完成。

SYS@ prod>update t3 set id=id+100;

已更新3行。

SYS@ prod>commit;

提交完成。


VER字段就是所作的操作。
顺序要从下往上看。所有的操作都是倒叙。

SYS@ prod>select versions_startscn, versions_endscn, versions_xid, versions_operation,id,name from t3 versions between scn minvalue and maxvalue;

VERSIONS_STARTSCN VERSIONS_ENDSCN VERSIONS_XID     VER         ID NAME
----------------- --------------- ---------------- --- ---------- ------------------------------
          2069447                 07001F0054060000 U          104 nelson
          2069447                 07001F0054060000 U          103 brain
          2069447                 07001F0054060000 U          101 tim
          2069444                 03001C002E070000 D            2 mike
          2069441         2069447 0200120031070000 U            4 nelson
                          2069447                               1 tim
                          2069444                               2 mike
                          2069447                               3 brain
                          2069441                               4 cade

已选择9行。

SYS@ prod>select versions_xid, versions_operation,id, name from t3 versions between scn minvalue and maxvalue;

VERSIONS_XID     VER         ID NAME
---------------- --- ---------- ------------------------------
07001F0054060000 U          104 nelson
07001F0054060000 U          103 brain
07001F0054060000 U          101 tim
03001C002E070000 D            2 mike
0200120031070000 U            4 nelson
                              1 tim
                              2 mike
                              3 brain
                              4 cade

已选择9行。

闪回事务

SYS@ prod>select * from t3;

        ID NAME
---------- ------------------------------
       101 tim
       103 brain
       104 nelson

SYS@ prod>select undo_sql from flashback_transaction_query where xid=hextoraw('03001C002E070000');

UNDO_SQL
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
insert into "SYS"."T3"("ID","NAME") values ('2','mike      ');


SYS@ prod>select undo_sql from flashback_transaction_query where xid=hextoraw('07001F0054060000');

UNDO_SQL
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
update "SYS"."T3" set "ID" = '4' where ROWID = 'AAAVtKAABAAAXoBAAD';
update "SYS"."T3" set "ID" = '3' where ROWID = 'AAAVtKAABAAAXoBAAC';
update "SYS"."T3" set "ID" = '1' where ROWID = 'AAAVtKAABAAAXoBAAA';


SYS@ prod>

执行相应的SQL就能回退道原来表的版本


SYS@ prod>update "SYS"."T3" set "ID" = '4' where ROWID = 'AAAVtKAABAAAXoBAAD';

已更新 1 行。

SYS@ prod>update "SYS"."T3" set "ID" = '3' where ROWID = 'AAAVtKAABAAAXoBAAC';

已更新 1 行。

SYS@ prod>update "SYS"."T3" set "ID" = '1' where ROWID = 'AAAVtKAABAAAXoBAAA';

已更新 1 行。

SYS@ prod>
SYS@ prod>
SYS@ prod>commit;

提交完成。

SYS@ prod>select * from t3;

        ID NAME
---------- ------------------------------
         1 tim
         3 brain
         4 nelson

SYS@ prod>insert into "SYS"."T3"("ID","NAME") values ('2','mike      ');

已创建 1 行。

SYS@ prod>commit;

提交完成。

SYS@ prod>select * from t3;

        ID NAME
---------- ------------------------------
         1 tim
         2 mike
         3 brain
         4 nelson

SYS@ prod>

本例子我没有回退所有的操作。

 

Jrojyun 

2021-03-29

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值