0

我正在运行一个大型查询(600 万条记录),它与其他表有很多 INNER JOINS,但是当我尝试在 CSV 上导出查询结果时,我得到以下结果。我用谷歌搜索了一段时间,但没有得到任何结果。

ORA-01555: snapshot too old: rollback segment number 69 with name
"_SYSSMU69_2356811035$" too small
ORA-0263: "snapshot too old: rollback segment number %s with name \"%s\" too small" 
*Cause: rollback records needed by a reader for consistent read are overwritten by other writers
*Action:  If in Automatic Undo Management mode, increase undo_retention setting. Otherwise, rollback segments 
Vendor code 1555
4

1 回答 1

4

让我解释一下会发生什么。当 Oracle 执行查询时,无论查询花费多少时间,查询的结果都必须与发起查询时该数据的图片一致。

ORA-1555 错误可能发生在查询开始时,查询无法访问足够的撤消来构建数据副本。已提交的块“版本”与这些块的较新的未提交“版本”一起维护,以便查询可以访问查询时数据库中存在的数据。这些被称为“一致读取”块,并使用 Oracle 撤消管理进行维护。

这种一致性由 UNDO 表空间处理。在您的情况下,最可能的情况如下:

  • 运行 csv 的查询在某一时刻启动。Oracle 运行查询以获取当时这些表中的 600 万行。
  • 在查询执行期间,其他几个进程正在对受影响的记录运行 DML 操作,因此之前的数据被移动到 UNDO 表空间(回滚段是存储在 UNDO 表空间上的段的类型)
  • 但是,如果您的 undo 很小或您的 undo_retention 不够,为了保持数据库的完整性,如果该表空间上没有足够的空间,Oracle 将用新的回滚段覆盖这些回滚段。

尝试以下操作:

  • 增加撤消表空间
  • 增加 undo_retention 参数。

与 ORA-1555 相关的旧 Oracle 版本中存在大量错误,以及当 undo 数据是 lob 段等时的其他可能性。如果您有权访问 Support,您将在此处找到主注释

ORA-1555 主笔记

ORA-1555 诊断和故障排除

于 2020-08-29T07:46:03.840 回答