Oracle 闪回特性(Flashback Version、Flashback Transaction)

--==========================================================

-- Oracle 闪回特性(Flashback Version、Flashback Transaction)

--==========================================================

Oracle闪回特性为数据的快速回复某一对象的特定数据提供了更多的便利。前面介绍了闪回的几种特性,包括flashback database,

flashback drop ,flashback query ,flashback table 。接下来本文将介绍Flashback Version与Flashback Transaction。

一、Flashback Version Query(闪回版本查询)

闪回版本查询指的是Oracle可以针对特定的对象来查询某一特定段内该对象的变化的所有情况,可以对此跟踪该对象的变更情况。也可以根

据特定的需要来将该对象修正到特定的时刻。闪回版本查询同闪回查询,闪回表一样,同样是使用了UNDO段的数据,即数据变更的多次镜像

,当UNDO段的数据由于空间压力而被清除,则产生无法闪回的情况。

1.闪回版本查询语法,使用VERSIONS BETWEEN 关键字

SELECT <columns>

FROM <schema_name.table_name>

VERSIONS BETWEEN SCN <minimum_scn> AND <maximum_scn> --基于SCN的版本查询

[WHERE <column_filter>]

[GROUP BY <non-aggregated_columns>]

[HAVING <group filter>

[ORDER BY <position_numbers_or_column_names>]

SELECT <columns>

FROM <schema_name.table_name>

VERSIONS BETWEEN timestamp to_timestamp('start_timestamp') and to_timestamp('end_timestamp') --基于TIMESTAMP的版本查询

[WHERE <column_filter>]

[GROUP BY <non-aggregated_columns>]

[HAVING <group filter>

[ORDER BY <position_numbers_or_column_names>]

2.创建演示环境

--对表tb1作如下操作,插入empno为的记录后,更新其职务,然后再删除该记录,最后再次插入该记录

flasher@ORCL>create table tb1 tablespace users as select empno,ename,job,deptno from scott.emp; --创建表tb1

flasher@ORCL> insert into tb1 values(1000,'Jack','Clerk',20); --插入记录

flasher@ORCL> commit; --提交事务

flasher@ORCL> update tb1 set job='Manager' where empno=1000; --将职务更新为Manager

flasher@ORCL> commit; --提交事务

flasher@ORCL> delete from tb1 where empno=1000; --删除该记录

flasher@ORCL> commit; --提交事务

flasher@ORCL> insert into tb1 values(1000,'Jack','President',20); --重新插入该记录

flasher@ORCL> commit; --提交事务

3.使用Version Query(闪回版本查询)

--通过使用versions关键字来获得版本信息

flasher@ORCL> select empno,ename,job,versions_xid xid,versions_startscn v_stcn,

2 versions_endscn v_edcn,versions_operation v_ops

3 from tb1 versions between scn minvalue and maxvalue where empno=1000;

EMPNO ENAME JOB XID V_STCN V_EDCN V_OPS

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

1000 Jack President 0A000C007E010000 1124320 I

1000 Jack Manager 09000C00EE010000 1124301 D

1000 Jack Manager 0A0009007E010000 1124282 1124301 U

1000 Jack Clerk 06000E00A9010000 1124245 1124282 I

上面的示例通过为表tb1中插入一条empno=1000记录,并更新其职务,接下来对该记录进行删除,最后再次添加empno=1000,且职务不

同的记录,可以看出对empno=1000所作的不同的修改被全部记录下来。

注意,一个事务中,如果多次对该记录进行了修改,则查询中仅仅显示最后一次提交的状态,我们可以通过使用versions between关键

字来查询对该表中的某条特定记录修改的不同版本

查看不同的版本使用了类似于rowid的伪列

versions_xid --记录指定版本的事务的唯一标识符

versions_startscn --记录的起始SCN号

versions_endscn --记录的终止SCN号

versions_operation --记录的操作类型(DML操作,I表示插入,U表示更新,D表示删除)

versions_starttime --记录被修改的起始时间

versions_endtime --记录被修改的终止时间

--也可以修改查询的条件来获取更多不同的版本,如下查询则为查询该记录一个小时以内的不同版本

flasher@ORCL> select empno,ename,job,versions_xid xid,versions_startscn v_stcn,

2 versions_endscn v_edcn,versions_operation v_ops

3 from tb1 versions between timestamp

4 to_timestamp(systimestamp-1/24) and systimestamp where empno=1000;

二、Flashback Transaction Query(闪回事务查询)

闪回事务查询是对闪回版本查询的扩展。从某种程度上来说,闪回版本查询通常用于更细粒度的查询,如针对特定的记录。而闪回事务则是

针对某一事务进行闪回,是基于事务级别的。闪回事务查询通过查询视图flashback_transaction_query来获得某个或多个特定事务信息,

同时可以根据该视图中提供的undo_sql 列中的语句来反转事务,从而保证数据的完整性。

查询该视图需要具有select any transaction权限,默认情况下sys用户和DBA角色具有该权限

下面演示基于事务的闪回示例

flasher@ORCL> create table tb2 tablespace users as select empno,ename,sal,deptno from scott.emp; --创建表tb2

flasher@ORCL> insert into tb2 select 9999,'Robinson',3000,50 from dual; --插入新记记录

flasher@ORCL> commit --提交事务一

flasher@ORCL> select * from tb2 where empno=9999;

EMPNO ENAME SAL DEPTNO

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

9999 Robinson 3000.00 50

flasher@ORCL> update tb2 set sal=sal+500 where empno=9999; --更新记录

flasher@ORCL> commit; --提交事务二

flasher@ORCL> update tb2 set deptno=20 where empno=9999; --再次更新记录

flasher@ORCL> commit; --提交事务三

flasher@ORCL> select empno,ename,sal,deptno,versions_xid,versions_operation

2 from tb2 versions between scn minvalue and maxvalue --使用Version Query查询从中看到了三个事务

3 where empno=9999;

EMPNO ENAME SAL DEPTNO VERSIONS_XID V

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

9999 Robinson 3500 20 08000400C9010000 U

9999 Robinson 3500 50 09001600BE010000 U

9999 Robinson 3000 50 04002C00CA010000 I -- I为最早的事务

flasher@ORCL> select operation,undo_sql from flashback_transaction_query

2 where xid=hextoraw('09001600BE010000'); --根据事务号获得一个反转该事务的DML语句

OPERATION UNDO_SQL

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

UPDATE update "FLASHER"."TB2" set "SAL" = '3000' where ROWID = 'AAANUPAAGAAAAAkAAN';

flasher@ORCL> select operation,undo_sql from flashback_transaction_query

2 where xid=hextoraw('08000400C9010000'); --根据事务号获得一个反转该事务的DML语句

OPERATION UNDO_SQL

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

UPDATE update "FLASHER"."TB2" set "DEPTNO" = '50' where ROWID = 'AAANUPAAGAAAAAkAAN';

从上面的两个查询中可以得到反转事务的DML语句,直接执行相应的反转语句,即可将事务变更到特定的状态,有点类似于回滚,但不

是执行了回滚操作。

三、总结

1.Flashback Version 多用于查看某条特定记录所有已提交的版本,包括每个版本的创建时间以及结束时间。

2.Flashback Transaction Query 多用于查看某个事务内的特定对象,可以通过视图flashback_transaction_query构造倒退事务的DML语句。

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

四、更多参考

有关闪回特性请参考

Oracle 闪回特性(FLASHBACK DATABASE)

Oracle 闪回特性(FLASHBACK DROP & RECYCLEBIN)

Oracle 闪回特性(Flashback Query、Flashback Table)

有关基于用户管理的备份和备份恢复的概念请参考:

Oracle 冷备份

Oracle 热备份

Oracle 备份恢复概念

Oracle 实例恢复

Oracle 基于用户管理恢复的处理(详细描述了介质恢复及其处理)

有关RMAN的恢复与管理请参考:

RMAN 概述及其体系结构

RMAN 配置、监控与管理

RMAN 备份详解

RMAN 还原与恢复

有关Oracle体系结构请参考:

Oracle 实例和Oracle数据库(Oracle体系结构)

Oracle 表空间与数据文件

Oracle 密码文件

Oracle 参数文件

Oracle 数据库实例启动关闭过程

Oracle 联机重做日志文件(ONLINE LOG FILE)

Oracle 控制文件(CONTROLFILE)

Oracle 归档日志

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏james大数据架构

SQL之收集SQL Server线程等待信息

要知道线程等待时间是制约SQL Server效率的重要原因,这一个随笔中将学习怎样收集SQL Server中的线程等待时间,类型等信息,这些信息是进行数据库优化...

20770
来自专栏杨建荣的学习笔记

MySQL中GTID的几个限制和解决方案

现在我看待一个技术,总是会换一种角度来看,在他能实现什么的基础上,我更喜欢看他不能做什么,为什么不能这么做。 比如MySQL GTID在5.6试水,...

78560
来自专栏C/C++基础

MySQL入门常用命令大全

SQL(Structured Query Language)是结构化查询语言,也是一种高级的非过程化编程语言。SQL语句可用于增删查改数据以及管理关系型数据库,...

12720
来自专栏乐沙弥的世界

表段、索引段上的LOGGING与NOLOGGING

在有些情况下,对于表段和索引段可以采用记录日志的模式,也可以使用不记录日志的模式。如在对表段、索引段使用数据泵导入时,可以

11220
来自专栏清风

Oracle 常用查询语句 原

7520
来自专栏王磊的博客

Microsoft SQL Server 2005 提供了一些工具来监控数据库

--WL 09-07-03 /*Microsoft SQL Server 2005 提供了一些工具来监控数据库。方法之一是动态管理视图。动态管理视图 (DMV)...

35450
来自专栏逸鹏说道

程序猿是如何解决SQLServer占CPU100%的

文章目录 遇到的问题 使用SQLServer Profiler监控数据库 SQL1:查找最新的30条告警事件 SQL2:获取当前的总报警记录数 有哪些SQL语句...

38480
来自专栏沃趣科技

MVCC原理探究及MySQL源码实现分析

目录预览 数据库多版本读场景 MVCC实现原理 1、通过DB_ROLL_PT 回溯查找数据历史版本 2、通过read view判断行...

63580
来自专栏社区的朋友们

MySQL 入门常用命令大全(上)

作为一个 MySQL 的初学者,在短短的几个月中接触了一下,记录了一下工作中用到的 SQL 语句以及未来可能会用到的 MySQL 知识点,作为日后的参考手册。因...

1K10
来自专栏唐郑望的专栏

Django数据处理的一些实践

提到 Django 肯定避不开 MVC 模式,即模型(Model)-视图(View)-控制器(Controller),通过将业务逻辑、数据、界面显示分离的方法组...

33810

扫码关注云+社区

领取腾讯云代金券