最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

【赵渝强老师】Oracle的闪回事务查询

网站源码admin2浏览0评论

【赵渝强老师】Oracle的闪回事务查询

Oracle数据库的闪回事务查询(Flashback Transaction Query)实际上闪回版本查询的一个扩充,通过它可以审计某个事务甚至撤销一个已经提交的事务。

视频讲解如下:

一、 闪回事务查询简介

闪回事务处理查询是一种诊断工具,可以用来查看在事务处理级对数据库所做的更改。通过这样的方式,可以诊断数据库中的问题并对事务处理执行分析和审计,甚至撤销一个已经提交了的事务。

闪回事务查询的核心是使用flashback_transaction_query视图来确定所有必要的SQL 语句。这些语句可以用来还原特定事务处理或特定时间段内所做的修改。通过下面的语句可以查看flashback_transaction_query视图的结构。

代码语言:sql复制
SQL> desc flashback_transaction_query

# 输出的信息如下:
 Name						Null?	Type
 ------------------------ -------- --------
 XID								RAW(8)
 START_SCN							NUMBER
 START_TIMESTAMP					DATE
 COMMIT_SCN							NUMBER
 COMMIT_TIMESTAMP					DATE
 LOGON_USER							VARCHAR2(128)
 UNDO_CHANGE#						NUMBER
 OPERATION							VARCHAR2(32)
 TABLE_NAME							VARCHAR2(256)
 TABLE_OWNER						VARCHAR2(386)
 ROW_ID								VARCHAR2(19)
 UNDO_SQL							VARCHAR2(4000)

二、 【实战】在事务中使用闪回事务查询

在了解到了什么是Oracle数据库的闪回事务查询后,下面将通过一个具体是示例来演示如何使用闪回事务查询撤销一个已经提交了的事务。

(1)使用管理员登录数据库,并授权c##scott用户执行事务查询的权限。

代码语言:sql复制
SQL> conn / as sysdba
SQL> grant select any transaction to c##scott;

# 执行事务查询查看flashback_transaction_query视图,
# 需要select any transaction的权限。

(2)开启UNDO数据的增强信息。

代码语言:sql复制
SQL> alter database add supplemental log data;
SQL> alter database add supplemental log data (primary key) columns;

(3)切换到c##scott用户,并创建一张新表flashback4。

代码语言:sql复制
SQL> conn c##scott/tiger
SQL> create table flashback4(tid number, tname varchar2(20));

(4)使用c##scott用户执行第一个事务。

代码语言:sql复制
SQL> insert into flashback4 values(1,'Tom');
SQL> insert into flashback4 values(2,'Mary');
SQL> insert into flashback4 values(3,'Mike');
SQL> commit;

(5)使用c##scott用户执行第二个事务。

代码语言:sql复制
SQL> update flashback4 set tname='Mary123' where tid=2;
SQL> delete from flashback4 where tid=1;
SQL> commit;

# 当第二个事务执行完成后,如何撤销第二个事务呢?
# 由于该事务已经提交,因此不可能再通过执行rollback语句来撤销了。
# 但是可以通过闪回事务查询来获取撤销事务的SQL语句,最终达到撤销事务的目的。

(6)通过使用闪回版本查询,获取表flashback4上的事务信息。

代码语言:sql复制
SQL>select tid,tname,versions_operation,versions_xid
    from flashback4
    versions between timestamp minvalue and maxvalue
    order by versions_xid;

# 输出的信息如下:
TID			TNAME		V	VERSIONS_XID
------ --------------- --- -----------------
	 3 		Mike 		I 	03001A0009030000
	 2 		Mary 		I 	03001A0009030000
	 1 		Tom			I 	03001A0009030000
	 2 		Mary123		U 	0700210004030000
	 1 		Tom			D 	0700210004030000

# 这里的VERSIONS_XID表示事务的ID号。
# 从输出的信息中可以看出第二个事务的ID为0700210004030000。

(7)查询视图flashback_transaction_query以获取撤销第二个事务的SQL语句。

代码语言:sql复制
SQL>select undo_sql 
    from flashback_transaction_query
    where xid='0700210004030000';

# 输出的信息如下:
UNDO_SQL
---------------------------------------------------------------------------------------
insert into "C##SCOTT"."FLASHBACK4"("TID","TNAME") values ('1','Tom');
update "C##SCOTT"."FLASHBACK4" set "TNAME" = 'Mary' where ROWID = 'AAATIvAAHAAAAIWAAB';

(8)执行第(7)步中输出的UNDO_SQL语句。

代码语言:sql复制
SQL> insert into "C##SCOTT"."FLASHBACK4"("TID","TNAME") values ('1','Tom');
SQL> update "C##SCOTT"."FLASHBACK4" set "TNAME" = 'Mary' where ROWID = 'AAATIvAAHAAAAIWAAB';

(9)验证第二个事务是否撤销,查询表flashback4的数据。

代码语言:sql复制
SQL> select * from flashback4;

# 输出的信息如下:
TID 	TNAME
---------- --------------------
	 2 	Mary
	 3 	Mike
	 1 	Tom

# 此时表flashback4便恢复到了第一个事务结束的状态。

(10)提交UNDO_SQL产生的事务。

代码语言:sql复制
SQL> commit;
发布评论

评论列表(0)

  1. 暂无评论