Oracle数据库的闪回个性为数据的迅速批复制某一对象的特定数据提供了方便。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 salsal=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数据库的闪回个性的知识就介绍到这里了,希望本次的介绍能够对您有所收获!
【编辑推荐】