Flashback Version Query 闪回版本查询

使用Flashback Version Query  返回在指定时间间隔或SCN间隔内的所有版本,一次commit命令就会创建一个版本。

语法如下:

SELECT .....FROM tablename VERSIONS {BETWEEN {SCN | TIMESTAMP} start AND end}

--start,end可以是时间也可以是scn

Flashback Version Query伪列说明

versions_start{scn|time}  版本开始的scn或时间戳

versions_end{scn|time}  版本结束scn或时间戳,如果有值表明此行后面被更改过是旧版本,如果为null,则说明行版本是当前版本或行被删除(即versions_operation值为D)。

versions_xid 创建行版本的事务ID

versions_operation  在行上执行的操作(I=插入,D=删除,U=更新)

示例说明:

SQL> create table xyc_t1 as select * from emp where 1=2;  --创建表xyc_t1

Table created.

SQL> select to_date(sysdate,'YYYY-MM-DD HH24:MI:SS') from dual; --查询时间作为timestamp开始时间

TO_DATE(SYSDATE,'YY
-------------------
2013-10-06 08:17:58

SQL> insert into xyc_t1 select * from emp where empno=7902;   --插入empno=7902

1 row created.

SQL> commit;                                                                               --插入一行提交作为一个版本

Commit complete.

SQL> insert into xyc_t1 select * from emp where empno=7788;

1 row created.

SQL> insert into xyc_t1 select * from emp where empno=7698;

1 row created.

SQL> commit;                                                                             --插入两行提交作为一个版本

Commit complete.

SQL> update xyc_t1 set sal=8888 where empno=7788;

1 row updated.

SQL> commit;                                                                          --再次更改empno=7788的行提交,使这行有旧版本

Commit complete.

SQL> select to_date(sysdate,'YYYY-MM-DD HH24:MI:SS') from dual; --查询时间作为timestamp结束时间

TO_DATE(SYSDATE,'YY
-------------------
2013-10-06 08:20:01

/*

select versions_startscn,versions_starttime,versions_endscn,versions_endtime,versions_xid,versions_operation,empno
from xyc_t1 versions between timestamp to_timestamp('2013-10-06 10:14:04','YYYY-MM-DD HH24:MI:SS') and to_timestamp('2013-10-06 10:14:23','YYYY-MM-DD HH24:MI:SS');

*/

SQL> select versions_startscn,versions_starttime,versions_endscn,versions_endtime,versions_xid,versions_operation,empno
  2  from xyc_t1 versions between timestamp to_timestamp('2013-10-06 08:17:58','YYYY-MM-DD HH24:MI:SS') and to_timestamp('2013-10-06 08:20:01','YYYY-MM-DD HH24:MI:SS');

VERSIONS_STARTSCN VERSIONS_STARTTIME             VERSIONS_ENDSCN VERSIONS_ENDTIME               VERSIONS_XID     VERSIONS_OPERATION        EMPNO
----------------- ------------------------------ --------------- ------------------------------ ---------------- -------------------- ----------
          1032654              06-OCT-13 08.19.51 AM                                                                                            08000E0016030000       U                                   7788
          1032637              06-OCT-13 08.19.14 AM                                                                                            0600180017030000        I                                    7698
          1032637              06-OCT-13 08.19.14 AM             1032654                06-OCT-13 08.19.51 AM          0600180017030000        I                                    7788
          1032628              06-OCT-13 08.18.47 AM                                                                                            090014002C030000        I                                    7902

--可以看出,一次commit是一个版本,当前版本的versions_endscn和versions_endtime值为空,旧版本则有值。

Flashback Transaction Query闪回事务查询

Flashback Transaction Query实际上是查询的数据字典flashback_transaction_query。可以根据flashback_transaction_query 的undo_sql列值返回数据以前版本。

flashback_transaction_query 列说明:

SQL> desc flashback_transaction_query
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 XID                                                       RAW(8)                 --事务ID
 START_SCN                                          NUMBER                --事务起始SCN,即第一个dml的SCN
 START_TIMESTAMP                             DATE                      --事务其实时间戳,即第一个dm的时间戳
 COMMIT_SCN                                      NUMBER                --提交事务时的SCN
 COMMIT_TIMESTAMP                         DATE                      -- 提交事务时的时间戳
 LOGON_USER                                      VARCHAR2(30)       --本次事务的用户
 UNDO_CHANGE#                                NUMBER                --撤销SCN
 OPERATION                                         VARCHAR2(32)       --执行的dml操作:DELETE,INSERT,UPDATE,BEGIN,UNKNOWN
 TABLE_NAME                                       VARCHAR2(256)     --dml更改的表
 TABLE_OWNER                                     VARCHAR2(32)      --表的所有者
 ROW_ID                                                VARCHAR2(19)       --修改行的ROWID
 UNDO_SQL                                           VARCHAR2(4000)   -‍-撤销dml的sql语句

--使用闪回事务查询前,必须启用重做日志流的其他日志记录,重做日志流与Log Miner使用的数据相同,只是接口不同。

示例说明:

SQL> conn / as sysdba;

SQL> alter database add supplemental log data;

Database altered.

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

Database altered.

SQL> grant select any transaction to scott;

Grant succeeded.

SQL> conn scott/xyc

SQL> update xyc_t1 set sal=9999 where empno=7902;     --更改值sal=9999

1 row updated.

SQL> commit;

Commit complete.

SQL> select to_date(sysdate,'YYYY-MM-DD HH24:MI:SS') from dual;

TO_DATE(SYSDATE,'YY
-------------------
2013-10-06 10:14:04

SQL> update xyc_t1 set sal=99999 where empno=7902;  --更改值sal=99999

1 row updated.

SQL> commit;

Commit complete.

SQL> select to_date(sysdate,'YYYY-MM-DD HH24:MI:SS') from dual;

TO_DATE(SYSDATE,'YY
-------------------
2013-10-06 10:14:23

SQL> select versions_startscn,versions_starttime,versions_endscn,versions_endtime,versions_xid,versions_operation,empno
  2  from xyc_t1 versions between timestamp to_timestamp('2013-10-06 10:14:04','YYYY-MM-DD HH24:MI:SS') and to_timestamp('2013-10-06 10:14:23','YYYY-MM-DD HH24:MI:SS');

VERSIONS_STARTSCN VERSIONS_STARTTIME             VERSIONS_ENDSCN VERSIONS_ENDTIME               VERSIONS_XID     VERSIONS_OPERATION        EMPNO
----------------- ------------------------------ --------------- ------------------------------ ---------------- -------------------- ----------
   1035726                     06-OCT-13 10.14.17 AM                                                                                             0400040097020000 U                                        7902
                                                                                                                                                                                                                                                      7698
                                                                                      1035726                    06-OCT-13 10.14.17 AM                                                                                        7902

--查询事务id

SQL> select start_scn,commit_scn,logon_user,operation,table_name,undo_sql
  2  from flashback_transaction_query
  3  where xid=hextoraw('0400040097020000');

START_SCN COMMIT_SCN LOGON_USER           OPERATION            TABLE_NAME           UNDO_SQL
---------- ---------- -------------------- -------------------- -------------------- --------------------------------------------------
   1035724    1035726           SCOTT                                   UPDATE       XYC_T1               update "SCOTT"."XYC_T1" set "SAL" = '9999' where R
                                                                                                                              OWID = 'AAASNYAAEAAAAIVAAD';

--查出undo sql

SQL> update "SCOTT"."XYC_T1" set "SAL" = '9999' where ROWID = 'AAASNYAAEAAAAIVAAD';

1 row updated.

SQL> select * from xyc_t1;
select * from xyc_t1;

EMPNO ENAME                JOB                       MGR HIREDATE                   SAL       COMM     DEPTNO
---------- -------------------- ------------------ ---------- ------------------- ---------- ---------- ----------
      7698 BLAKE                MANAGER                  7839 1981-05-01 00:00:00       2850                    30
      7902 FORD                 ANALYST                    7566 1981-12-03 00:00:00       9999                    20

--返回到上一版本,即sal值为9999

Flashback Version Query、Flashback Transaction Query快速闪回细粒度数据的更多相关文章

  1. oracle_利用闪回功能恢复数据

    方便起见一般:执行如下即可不用往下看: ① 启用行移动功能 alter table tbl_a enable row movement; ② 闪回表数据到某个时间点 flashback table t ...

  2. Oracle 闪回 找回数据的实现方法

    Oracle 闪回 找回数据的实现方法 闪回技术是Oracle强大数据库备份恢复机制的一部分,在数据库发生逻辑错误的时候,闪回技术能提供快速且最小损失的恢复.这篇文章主要介绍了Oracle 闪回 找回 ...

  3. Flashback Query、Flashback Table(快速闪回查询、快速闪回表)

    Flashback Query闪回查询 flashback query是基于undo表空间的闪回,与之相关的参数如下: SQL> show parameter undo NAME         ...

  4. oracle flashback data archive闪回数据归档天坑之XID重用导致闪回查询数据重复

    我们有个系统使用了Oracle flashback data archive闪回数据归档特性来作为基于时间点的恢复机制,在频繁插入.更新期间发现SYS_FBA_HIST_NNNN表中的XID被两个事务 ...

  5. binlog2sql快速闪回

    https://github.com/danfengcao/binlog2sql 一.说明: DML(data manipulation language):       它们是SELECT.UPDA ...

  6. 利用MyFlash闪回丢失数据

          MyFlash is an open source tool released by Meituan-Dianping which can be used to flashback MyS ...

  7. binlog2sql闪回恢复数据

    用途: .数据快速回滚 .从binlog生成标准sql 使用限制: .必须设置binlog_format=ROW .binlog_row_image=full,该参数默认为FULL .恢复用户拥有的最 ...

  8. Oracle 闪回 找回数据

    使用闪回技术,实现基于磁盘上闪回恢复区的自动备份与还原. 一.恢复表对象 1.创建学生表 create table STUDENT ( idno INTEGER, name VARCHAR2(30), ...

  9. Orcale-利用闪回恢复数据方法

    一.delete误删 方法1:如果表结构没有改变,直接闪回整个表,具体步骤: --首先需要表闪回权限,开启行移动功能 alter table 表名 enable row movement; --执行闪 ...

随机推荐

  1. 遍历aspx页面中所有的指定控件

    //1.遍历页面中所有的TextBox,并将值设置成String.Empty for (int j = 0; j < this.Controls.Count; j++){      foreac ...

  2. oracle批量转库工作,比较快捷的方式

    select 'create table '  || t.TABLE_NAME ||  ' as select * from ODS_ZMGLXT.'|| t.TABLE_NAME ||'; ' fr ...

  3. 使用<span>标签为文字设置单独样式

    这一小节讲解<span>标签,我们对<em>.<strong>.<span>这三个标签进行一下总结: 1. <em>和<strong& ...

  4. iOS开发: 向右滑动手势功能实现

    在navigationController中实现向右滑动 返回功能 系统提供的backbarbuttonitem,不用添加任何代码即可实现向右滑动后退功能,但是往往要对按钮修改样式等时,就需要自定义l ...

  5. 【windows开发实现记事本程序——逻辑篇1】

    1. 主要内容 从本节开始介绍windows开发实现记事本程序的逻辑实现部分.本节的主要内容有以下3点: 1. 主窗口定义  -- 主要介绍记事本主界面窗口对应的窗口类及实现方案 2. RichEdi ...

  6. cocos2d-x 实现粒子飞行特效

    效果图 说明 实现效果: 按下鼠标并且移动, 所到之处产生光圈 光圈会以窗口中心为终点, 并且会偏移自身角度对准终点, 然后持续飞行, 直到终点. 附件 下载源码, 请猛击这里!

  7. C++ 性能剖析 (四):Inheritance 对性能的影响

    (这个editor今天有毛病,把我的format全搞乱了,抱歉!) Inheritance 是OOP 的一个重要特征.虽然业界有许多同行不喜欢inheritance,但是正确地使用inheritanc ...

  8. CentOS7 开启关闭网卡

    ifdown ifcfg-enp7s0 关闭网卡 ifup ifcfg-enp7s0 开启网卡

  9. APP的测试过程和重点

    APP的测试过程和重点 1.首先是测试资源确认及准备 (1)产品需求文档.产品原型图.接口说明文档以及设计说明文档等应齐全: (2)测试设备及工具的准备:IOS和andriod不同版本的真机,以及相关 ...

  10. PHP简单获取数据库查询结果并返回JSON

    <?php header("Content-type:text/html;charset=utf-8"); //连接数据库 $con = mysql_connect(&quo ...