gpt4 book ai didi

oracle - ORA_ROWSCN - 旧的/恢复的 block 没有分配真正的SCN?

转载 作者:行者123 更新时间:2023-12-03 05:01:23 24 4
gpt4 key购买 nike

我们使用 ORA_ROWSCN 伪列来定位最近修改的行,以便将所选详细信息复制到不同的数据源。我们知道该列的“近似”性质,如果 block 中只有一行发生更改,则 block 中的整批行都会用 SCN 进行标记,并且我们可以接受相对较小批处理的误报不是问题。

然而,我们观察到大量行似乎具有“ float ”ORA_ROWSCN 值。这些行数以百万计,当然根本不会改变,但是每次我们开始与 Oracle 的新控制台 session 时,行 block 每次都会获得一个全新的、最新的 SCN。下面说明了几分钟内的三个单独的控制台 session :

session #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

session #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

session #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

这是一个测试数据库,没有其他进程正在修改行。我们的理论是,由于某种原因,这个 400 万 block 中的行没有专用的“SCN”,因为这些行是使用 Oracle Data Pump 工具传输到此数据库中的,也许包含它们的 block 没有正确的“SCN”。分配的SCN。然后,Oracle 别无选择,只能为这些行提供尽可能高的 SCN,可能对应于当前的 SCN 值,因为没有其他可用值。当我们更新这些行时,即使毫无意义,它们也会从 400 万个“ float ”SCN 的 block 中移出,并获得固定的 SCN 号。剩余的行继续移动。

有人可以确认 A. 这实际上是我们所看到的,B. 也许这是 Oracle Pump 实用程序的已知效果,以及 C. 如果我们只是用新的 UPDATE 标记这些行,它们'会永久移出“ float ”SCN 从而解决我们的问题吗?

注释:

  1. 我们知道 SCN 并不准确,并且是针对每个 block 的。

  2. 我们对“为什么不使用替代技术 X?”不感兴趣。答案,我们知道其他技术,如果我们决定,我们就会使用它们,我们只是试图理解这种确切的行为。

最佳答案

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

ORA_ROWSCN 既不准确又不一致。而且10g documention仅提及不准确之处。 11g documentation清楚地表明 ORA_ROWSCN 是多么不适合您尝试执行的操作:

If a block is queried twice, then it is possible for the value of ORA_ROWSCN to change between the queries even though rows have not been updated in the time between the queries.

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

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

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

关于oracle - ORA_ROWSCN - 旧的/恢复的 block 没有分配真正的SCN?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23543318/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com