Oracle 的 V$LOGMNR_CONTENTS 用于带有 UDT 的表 - 连接更新和内部操作



我正在用UDT(用户定义的类型(更新一个oracle表,然后查询V$LOGMNR_CONTENTS视图。我看到每更新一行都有2条记录——UPDATE和INTERNAL。我需要弄清楚如何在它们之间链接,因为UPDATE操作在ROW_ID中有一个临时值,而正确的值只出现在INTERNAL操作中,我不确定它们的SCN编号是如何关联的。我想的方法是为每个DATA_OBJ#创建一个UPDATE队列,并将它们链接到INTERNAL的FIFO。有什么更好的东西我错过了吗?

脚本:

CREATE TYPE srulon AS OBJECT (name VARCHAR2(30),phone VARCHAR2(20) );
create table root.udt_table (myrowid rowid, myudt srulon);
BEGIN rdsadmin.rdsadmin_util.switch_logfile;END;
insert into root.udt_table values (null, srulon('small', '1234'));
commit;
BEGIN rdsadmin.rdsadmin_util.switch_logfile;END;
insert into root.udt_table values (null, srulon('small', '1234'));
update root.udt_table set myrowid=rowid, myudt = srulon('smaller', rowid);
commit;
BEGIN rdsadmin.rdsadmin_util.switch_logfile;END;

查询(在START_LOGMNR之后查找最后一个日志(:

select scn, SEQUENCE#,operation, SQL_REDO, ROW_ID from  V$LOGMNR_CONTENTS
where session# = 6366 and not operation like '%XML%'
order by scn, SEQUENCE#;

结果:

| SCN | SEQUENCE# | OPERATION | ROW_ID | SQL_REDO |
| :--- | :--- | :--- | :--- | :--- |
| 240676056 | 1 | INTERNAL | AAB1avAAAAAAwT7AAA | NULL |
| 240676056 | 1 | UPDATE | AAAAAAAAAAAAAAAAAA | update "ROOT"."UDT_TABLE" a set a."MYROWID" = 'AAB1avAAAAAAwT7AAA' where a."MYROWID" IS NULL; |
| 240676057 | 5 | INTERNAL | AAB1avAAAAAAwT7AAA | NULL |
| 240676058 | 1 | UPDATE | AAAAAAAAAAAAAAAAAA | update "ROOT"."UDT_TABLE" a set a."MYROWID" = 'AAB1avAAAAAAwT7AAB' where a."MYROWID" IS NULL; |
| 240676059 | 5 | INTERNAL | AAB1avAAAAAAwT7AAB | NULL |
| 240676069 | 1 | COMMIT | AAAAAAAAAAAAAAAAAA | commit; |

系统更改编号(SCN(是用于跟踪数据库事务活动的主要控制功能。SCN是一个戳,用于定义在特定时间点提交的数据库版本。每个提交的事务都会分配一个唯一的SCN。DB在SCN号码的帮助下保存所有数据库更改的记录。SCN是数据库更改的运行编号

要获取当前SCN,请使用

DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER((

因此,在UPDATE和INTERNAL Operation之间没有其他连接,UPDATE SCN低于INTERNAL SCN,但没有计算或逻辑连接

错误在于order by scn, SEQUENCE#。删除order by子句后,每个INTERNAL语句都会跟随相应的UPDATE。这要归功于srulon。

最新更新