ORA_ROWSCN - 旧/已恢复的块没有分配真正的SCN?

zzz*_*eek 12 oracle datapump

我们使用ORA_ROWSCN伪列来定位最近修改的行,以便将所选细节复制到不同的数据源.我们知道这一列的"近似"性质,如果块中只有一行发生变化,则块内的整批行都用SCN标记,我们对此很好,相对较小批量的误报不是问题.

然而,我们观察到的是大量行似乎具有"浮动"ORA_ROWSCN值.这些数百万行当然没有变化,但每次我们开始与Oracle进行新的控制台会话时,行块每次都会获得一个全新的,最新的SCN.下面说明了几分钟内三个独立的控制台会话:

会议#1 - SCN 27501512下的400万行:

SQL> SELECT count(*), ORA_ROWSCN FROM our_table GROUP BY ORA_ROWSCN ORDER BY ORA_ROWSCN;

  COUNT(*) ORA_ROWSCN
---------- ----------
    12   27323587
    12   27415360
    20   27431509
   4057846   27501512
Run Code Online (Sandbox Code Playgroud)

会议#2 - SCN 27501522下的400万行:

SQL> SELECT count(*), ORA_ROWSCN FROM our_table GROUP BY ORA_ROWSCN ORDER BY ORA_ROWSCN;

  COUNT(*) ORA_ROWSCN
---------- ----------
    12   27323587
    12   27415360
    20   27431509
   4057846   27501522
Run Code Online (Sandbox Code Playgroud)

会议#3 - SCN 27501528下的400万行:

SQL> SELECT count(*), ORA_ROWSCN FROM our_table GROUP BY ORA_ROWSCN ORDER BY ORA_ROWSCN;

  COUNT(*) ORA_ROWSCN
---------- ----------
    12   27323587
    12   27415360
    20   27431509
   4057846   27501528
Run Code Online (Sandbox Code Playgroud)

这是一个测试数据库,没有其他进程正在修改行.我们的理论是,由于某种原因,这个四百万块的行没有专用的"SCN",因为这些行使用Oracle Data Pump工具传输到这个数据库中,也许包含它们的块没有正确的指定SCN.然后,Oracle别无选择,只能为这些行提供最高可能的SCN,这可能与当前的SCN值相对应,因为没有其他值可用.当我们更新这些行时,甚至毫无意义,它们会移出 400万个"浮动"SCN块并获得固定的SCN数.其余的行继续移动.

有人可以确认A.这实际上是我们所看到的,B.也许如果这是Oracle Pump实用程序和C的已知效果,如果我们只是用新UPDATE标记这些行,它们将永久移动出于"浮动"的SCN从而解决了我们的问题?

笔记:

  1. 我们知道SCN不准确且是按块进行的.

  2. 我们对"为什么不使用替代技术X?"毫无兴趣.答案,我们知道其他技术,如果我们决定使用它们,我们只是想了解这种确切的行为.

Jon*_*ler 3

A) 您所看到的是其他人也遇到过的真实问题。B) 这个问题不仅仅是Data Pump造成的。C) 更新可以解决问题,但你不能指望它总是有效。

ORA_ROWSCN 既不准确不一致。10g 文档仅提到了不准确之处。11g 文档清楚地表明了它是多么不适合ORA_ROWSCN您尝试做的事情:

如果一个块被查询两次,则 ORA_ROWSCN 的值可能会在两次查询之间发生变化,即使在两次查询之间的时间内行尚未更新。

我不确定ORA_ROWSCN会话之间发生变化的原因是什么,但我认为这不仅仅与数据泵有关。大约 5 年前,当我第一次遇到这个问题时,我们从未找到任何模式,如果我没记错的话,我们甚至没有使用数据泵。

我们的问题具体在于 Oracle SQL Developer,它使用ORA_ROWSCN乐观锁定。 这个错误非常烦人。用户会进行更改,当他们去提交更改时,他们会被错误地告知其他人已经更改了该行。就像您现在所做的那样,我们发现如果对行应用任何类型的更改,问题就会消失。我不记得它的效果如何,但你不应该假设它 100% 都有效。

据我所知,没有人能准确解释 ORA_SCN 是如何设置的以及它将返回什么。当您需要准确或可重复的结果时,不应使用它。