SQL -----尝试将查询结果导出为CSV时出错

问题描述

我正在运行一个大型查询(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

解决方法

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

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

此一致性由UNDO表空间处理。就您而言,最可能的情况是:

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

尝试以下操作:

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

在旧的Oracle版本中,与ORA-1555相关的错误很多,在撤消数据为lob段等情况下,还有许多其他可能性。如果可以访问支持,请在此处找到主要说明

ORA-1555 Master Note

ORA-1555 Diagnosis and Troubleshooting