【问题标题】:FLASHBACK_TRANSACTION_QUERY View in Oracle 12c returning no rowsOracle 12c 中的 FLASHBACK_TRANSACTION_QUERY 视图不返回任何行
【发布时间】:2019-03-12 08:22:25
【问题描述】:

我正在学习 Oracle 12c 中的闪回事务查询。 我执行了一些 DDL 和 DML 语句。 最后,我在 FLASHBACK_TRANSACTION_QUERY 视图上执行了一条 select 语句以查看 UNDO_SQL 值,但它没有返回任何行。 我很想知道为什么它没有给我任何行。 我研究并发现必须首先启用补充日志记录 (SELECT SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;)。 此值为 YES。

查询如下:-

CREATE TABLE TestAgain
(
   Fld1 VARCHAR2(3),
   Fld2 NUMBER(3)
);

INSERT INTO TestAgain values ('XYZ', 1);
INSERT INTO TestAgain VALUES ('PQR', 2);

COMMIT;

DELETE FROM TestAgain;

SELECT UNDO_SQL FROM FLASHBACK_TRANSACTION_QUERY
WHERE XID = (SELECT DISTINCT(RAWTOHEX(VERSIONS_XID))
FROM TestAgain VERSIONS BETWEEN TIMESTAMP MINVALUE AND MAXVALUE);

最后一个查询没有返回任何行。 请帮我弄清楚我在这里缺少什么。 P.S.:我只是一个 SQL 初学者。

【问题讨论】:

    标签: sql oracle transactions flashback


    【解决方案1】:

    将您的查询分解到下面,这将为您提供您遇到问题的痛点。如果您在开始事务之前和开始事务之后尝试使用以下 sqls。

    SQL> select current_scn,systimestamp from v$database;
    

    这将为您提供 SCN。用它来获取XID的值

     select descr,versions_xid from TestAgain
     versions between scn pre and post;
    

    在 flashback_transaction_query 中使用这个 XID 值

     select xid, undo_sql from flashback_transaction_query
     where xid = hextoraw('03000100EE0A0000');
    

    【讨论】:

      【解决方案2】:

      您必须在使用闪回事务查询之前启用最小补充日志 sys> alter database 添加补充日志数据;

      除了闪回查询的最小补充日志外,您还需要添加主键和外键的补充日志,以便在闪回事务查询中跟踪它们的变化。

      SYS> alter database 添加补充日志数据(主键)列; SYS> alter database 添加补充日志数据(外键)列;

      【讨论】:

        猜你喜欢
        • 2017-10-08
        • 1970-01-01
        • 1970-01-01
        • 2017-04-27
        • 2012-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多