所以我有一个定义如下的表:
`create table test.test as (select * from dual);
并运行以下更新语句:
update test.test set dummy = '1' where dummy = 'X';
commit;
我想找到上面事务的undo_sql,所以我运行了下面的语句来查找事务id
SQL> select dummy, versions_xid, versions_startscn, versions_endscn from test.test
versions between scn minvalue and maxvalue ;
D VERSIONS_XID VERSIONS_STARTSCN VERSIONS_ENDSCN
- ---------------- ----------------- ---------------
1 0A000500B00A0000 2802291
X 2802291
并运行以下语句以找到 undo_sql 语句
SQL> select undo_sql from flashback_transaction_query
where xid = (select versions_xid from test.test versions
between scn minvalue and maxvalue where versions_xid is not null);
UNDO_SQL
--------------------------------------------------------------------------------
如您所见,我什么也没有,如果我运行以下语句,我也什么也没有。
SQL> select undo_sql from flashback_transaction_query where undo_sql is not null;
no row selected
看起来 undo_sql 总是为空;
有什么我没有配置的吗?这是来自 v$system_parameter 的值
SQL> select name, value from v$system_parameter where name like '%undo%';
NAME VALUE
---------------- ----------------
undo_management AUTO
undo_tablespace UNDOTBS1
undo_retention 18000
据我记得,您应该启用补充日志记录,以便数据库可以收集重建用于闪回事务查询的撤消语句所需的数据:
有关启用补充日志记录的更多信息,请阅读Advanced Application Developer's Guide 中的“Configuring Your Database for Oracle Flashback Transaction Query”部分和 Database Utilities 中的“Supplemental Logging”部分(LogMiner 是另一个依赖于补充日志记录的实用程序)。