我正在开发基于 LogMiner 的解决方案来捕获更改,并且在尝试挖掘与 CLOB 或 BLOB 操作相关的重做事件时,我发现了一组不寻常的期望。
在我的用例中,我已将记录插入到包含 3 个 CLOB 字段的表中,其中一个 CLOB 字段值很小,而其他两个 CLOB 字段必须使用 LOB_WRITE 操作进行设置。
当我设置在事务提交之前和之后开始的起始 LogMiner SCN 范围时,我得到了完整的预期行V$LOGMNR_CONTENTS
,它们是:
0a00070084220000 37717288 START
0a00070084220000 37717288 INSERT
0a00070084220000 37717312 SEL_LOB_LOCATOR
0a00070084220000 37717312 LOB_WRITE (several of these as expected)
0a00070084220000 37717331 SEL_LOB_LOCATOR
0a00070084220000 37717331 LOB_WRITE (several of these as expected)
0a00070084220000 37717332 INSERT (sets the smaller clob data values)
0a00070084220000 37717334 COMMIT
当以特定的开始/结束 SCN 范围开始挖掘会话时,会出现异常位。
比如我从 37717239 挖到 37717289 时,我期望 LogMiner 同时提供表中的 theSTART
和 the INSERT
;但是只有START
操作存在。
此外,当我从 37717290 挖掘到 37717340 时,我希望 LogMiner 提供所有的SEL_LOB_LOCATOR
,LOB_WRITE
和后续INSERT
以及COMMIT
; 然而,只有随后的INSERT
和COMMIT
在场。
我可以从中做出的唯一断言是,当您拆分事务时,LogMiner 似乎遇到了麻烦,其中某些重做事件表示各种合成操作,因为它们与 LOB 操作相关,因此我能够真正始终重建系列的唯一方法事件已从 37717288 向前挖掘,以强制 LogMiner 在实现内容视图中的行时拥有可用事务的全部范围。
为什么 LogMiner 会这样?为什么在使用我上面介绍的 SCN 范围拆分交易时它没有正确实现?