侧边栏壁纸
博主头像
与晚风述往事博主等级

万般皆下品,唯有读书高。

  • 累计撰写 149 篇文章
  • 累计创建 29 个标签
  • 累计收到 7 条评论

目 录CONTENT

文章目录

Flashback Transaction Query

与晚风述往事
2022-01-04 / 0 评论 / 0 点赞 / 135 阅读 / 1,448 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-01-04,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

介绍

虽然我们可以使用闪回查询或闪回版本查询快速定位到错误的行或数据,但还是无法看到Oracle的事务执行的SQL。那么,有没有一种方法能够看到执行了哪些SQL呢?

答案是有,它就是Oracle提供的另一种闪回技术,叫做Flashback Transaction Query(闪回事务查询)。使用Flashback Transaction Query(闪回事务查询)技术能够让我们查询到某事务或某个时间段内的所有事务的元数据和历史数据。

闪回事务查询虽然也是使用了UNDO的特性,但是比其他两个闪回查询还多了补充日志记录。它利用归档日志中的补充日志记录,能够直接在FLASHBACK_TRANSACTION_QUERY视图中查询到事务执行的SQL。不过要注意的是,它的UNDO_SQL字段会显示将数据还原到SQL执行前的数据的SQL语句。例如,testa表的字段a的值是1,执行SQL后将aa字段的值更新为2,查询UNDO_SQL会显示“UPDATE testa set a=1 where rowid='AAABhyAABAAADPJAAB'”,ROWID是更新行的唯一标识符。

语法

闪回事务查询的语法不需要使用特定的关键字,直接查询FLASHBACK_TRANSACTION_QUERY视图就可以使用。例如,使用START_TIMESTAMP字段去查询一段时间内的事务执行情况。

先决条件

如果要使用闪回事务查询(flashback transaction query),则必须要启用以下参数:

  • 必须具有FLASHBACK_TRANSACTION_QUERY视图的查询(select)权限
  • 启用数据库归档模式
  • 必须至少启用最少的补充日志记录

案例

根据XID查询

首先是开启数据库归档模式和最小补充日志记录,由于是测试案例,我就不再设置归档文件的目录。生产环境中需要设置目录或最大闪回区限制,避免因文件太大导致数据库无法正常使用。
脚本如下:

SQL> shutdown immediate
SQL> startup mount
SQL> alter database archivelog;
SQL> alter database add supplemental log data;
SQL> alter database open;

数据库启动完毕后,开始模拟使用闪回事务查询。
已启用归档模式和最小补充日志的数据库中有这样一张表testa,它的数据如下图所示:
image.png

我们执行了一个事务,它将id为2的姓名字段name更新了两次,第一次更新成了王五,第二次更新成了赵六。SQL如下图所示:
image.png

我首先使用闪回版本查询,获得行版本的事务标识符XID。

SELECT versions_xid XID, versions_startscn START_SCN,
  versions_endscn END_SCN, versions_operation OPERATION,
  id,name,sex
FROM testa
VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE
WHERE id = 2;

查询结果如下图:
image.png
从上图得到XID后,我们再使用闪回事务查询事务ID。

select * from flashback_transaction_query
where xid=HEXTORAW('04001400D2020000');

查询结果如下图:
image.png
image.png
image.png
从上图中就能看到事务执行的操作、事务开始时间、事务提交时间、执行事务的用户、事务执行的操作、行的ROWID,以及要回滚事务需要执行的SQL语句。

0

评论区