【问题标题】:ORA-1555: snapshot too old: rollback segment numberORA-1555: 快照太旧: 回滚段号
【发布时间】:2010-12-13 18:44:44
【问题描述】:

关于 ORA-1555: 快照太旧: 回滚段号 我收到此错误,似乎没有任何问题。请说明在什么情况下可能发生以及如何避免?

【问题讨论】:

  • 请告诉我 - 谁对我投了反对票以及为什么
  • -1 表示没有添加你想要做的事情
  • 当然,该错误可能还有更多其他详细信息(而不是下面提到的唯一一个)。你想做什么?
  • 这个问题经常出现。我只是想总结一下应该注意的所有情况。

标签: oracle


【解决方案1】:

频繁提交可能是 ORA-1555 的原因。 这都是关于读取一致性的。启动查询的时间,oracle 记录了之前的图像。因此,您的查询结果不会被同时发生的 DML 更改(您的大交易)。前图像使用回滚段来获取在拍摄前图像后更改的数据的值。 通过在您的大事务中提交,您告诉 oracle 该事务的回滚数据可以被覆盖。 如果您的查询需要来自被覆盖的回滚段的数据,则会出现此错误。您提交的越少,您需要的回滚数据被覆盖的机会就越小。

ORA-1555 的一个常见原因是一个过程本身就完成了这一切:表上的游标、循环遍历记录、更新/删除同一个表并提交每 x 条记录。

正如 guigui 所说:让回滚段增长以包含您的整个事务

【讨论】:

    【解决方案2】:

    我建议你阅读汤姆的回答: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1441804355350

    “ORA-1555 通常发生在人们试图节省空间时。他们将有 如果需要,回滚段可能会增长(并且会使用 OPTIMAL 缩小)。所以, 他们将从 10 个左右的 1meg 回滚段开始。这些回滚段可以 如果我们让它们(在这个例子中)增长到每个 100meg 但是,它们永远不会增长,除非 你得到了一笔大交易。
    "

    【讨论】:

    • 链接非常有用,但我需要更多信息
    • 再次,我只引用链接:“你需要做的是大小回滚,以便它不那么频繁地包装(比你的长时间运行的查询更频繁)”你需要更多信息,但我们也需要从您正在尝试做的事情中获得更多信息,以及何时发生...
    【解决方案3】:

    这通常发生在代码在游标内提交时。

    例如。

    for x in (select ... from ...)
    loop
       do something
       commit;
    end loop;
    

    有关其他示例,请参阅 AskTom 链接表单 guigui42。

    【讨论】:

    • 只在最后提交。提交不会像在其他一些系统中那样释放 oracle 中的资源,因为锁是非常轻量级的,并且读取器和写入器不会相互阻塞。在使用 Oracle 时,比需要更频繁地提交是常见的设计错误。
    • 或者你可以试试受控提交。每 100 行或更多行提交一次。
    • 仍然效率低下。为什么要在交易完成之前提交?
    猜你喜欢
    • 1970-01-01
    • 2020-07-05
    • 2012-08-11
    • 2015-07-27
    • 2015-06-17
    • 1970-01-01
    • 2016-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多