Oracle ORA-03113和ORA-07445 ACCESS_VIOLATION

时间:2010-09-01 05:44:13

标签: oracle odp.net

环境

  • Oracle 10g
  • Windows 2003服务器
  • IIS 6
  • .NET 3.5
  • Oracle客户端10.2.0.1.0
  • ODAC 10.2.0.2.21
  • odp.net 2.102.2.20

  • 验证Connection = true;连接字符串中的Min Pool Size = 0

  • 所有odp.net连接,命令和参数对象在使用后都会关闭/处理。

问题:

  1. ORA-03113返回asp.net。
  2. ORA-07445在数据库端记录ACCESS_VIOLATION。 (见下文)
  3. 它始终是相同的选择查询(在存储过程中)。
  4. 这不是一个沉重的查询。整个表只有20K行。
  5. 其他网络应用程序未受影响。 oracle连接和查询正常工作。
  6. w3wp.exe使用的内存和线程正常
  7. 我们唯一的解决方案是DBA在数据库服务器上重新分配表。 DBA说这是应用程序问题,我不太确定但是......

    我已阅读SO 上的所有相关帖子,但欢迎任何建议!

    谢谢, P

    ORA-07445:遇到异常:核心转储[ACCESS_VIOLATION] [evaopn2 + 2896] [PC:0x15F3876] [ADDR:0x0] [UNABLE_TO_READ] []

    SELECT ILRS.ILRS_ID,
      ILRS.EXT_IDENTIFIER RUN_SET_EXTERNAL_IDENTIFIER,
      ILRS.DESCRIPTION RUN_SET_DESCRIPTION,
      ISST.CODE IIL_RUN_SET_STATUS_CODE,
      ILRN.ILRN_ID,
      ILRN.EXT_IDENTIFIER RUN_EXTERNAL_IDENTIFIER,
      ILRN.RUN_DATE,
      IRTY.CODE IIL_RUN_TYPE_CODE,
      PDCT.CODE PRODUCT_CODE,
      ILRN.STOCHASTIC_SCENARIOS STOCHASTIC_SCENARIOS,
      ILRN.PRIORITY PRIORITY,
      ILRN.DESCRIPTION RUN_DESCRIPTION,
      IRLB.CODE IIL_RUN_LABEL_CODE,
      IRST.CODE IIL_RUN_STATUS_CODE,
      ILRN.ACTIVE,
      UPDATE_USER.FIRST_NAME || ' ' || UPDATE_USER.SURNAME UPDATE_USER,
      ILRN.LAST_UPDATED,
      IRSV.TRANS_FROM STATUS_LAST_UPDATED
    FROM IIL_RUN_SETS ILRS
    INNER JOIN IIL_RN_SET_STA_VALS ISSV ON ILRS.ILRS_ID = ISSV.ILRS_ID
                       AND CURRENT_TIMESTAMP BETWEEN ISSV.TRANS_FROM AND ISSV.TRANS_TO
    INNER JOIN IIL_RN_SET_STATUSES ISST ON ISSV.ISST_ID = ISST.ISST_ID
    INNER JOIN IIL_RUNS ILRN            ON ILRS.ILRS_ID = ILRN.ILRS_ID
    LEFT OUTER JOIN IIL_RUN_LABELS IRLB ON ILRN.IRLB_ID = IRLB.IRLB_ID
    INNER JOIN IIL_RUN_STA_VALS IRSV    ON ILRN.ILRN_ID = IRSV.ILRN_ID
                      AND CURRENT_TIMESTAMP BETWEEN IRSV.TRANS_FROM AND IRSV.TRANS_TO
    INNER JOIN IIL_RUN_STATUSES IRST    ON IRSV.IRST_ID = IRST.IRST_ID
    INNER JOIN IIL_RUN_TYPES IRTY       ON ILRN.IRTY_ID = IRTY.IRTY_ID
    INNER JOIN PRODUCTS PDCT            ON ILRN.PDCT_ID = PDCT.PDCT_ID
    INNER JOIN USERS UPDATE_USER        ON ILRN.UPDATE_USER_ID = UPDATE_USER.USER_ID
    WHERE ILRS.ILRS_ID     = :B1
    ORDER BY ILRN.ILRN_ID
    

3 个答案:

答案 0 :(得分:2)

我认为你不能称之为“应用程序问题”。您可能需要说服DBA这是一个数据库问题,这样他就可以与Oracle支持人员交谈,或者至少在Metalink上查找它。当你开始谈论IIS,.NET等时,你可能已经吓坏了他。看看你是否只能在SQL * Plus中重现错误,那应引起他的注意。

至于实际解决问题,您可能需要修补,升级或找到某种方法来避免这个问题。尝试以一些微不足道的方式重写您的查询,它可能会工作。我通常最终解决这些问题而不是实际解决它们。

答案 1 :(得分:1)

我们能够使用SQL Developer重现相同的内容,因此发现了问题。

... INNER JOIN IIL_RUN_STA_VALS IRSV ON ILRN.ILRN_ID = IRSV.ILRN_ID                   和CURSENT_TIMESTAMP在IRSV.TRANS_FROM和IRSV.TRANS_TO之间

这条线是罪魁祸首。两个日期列上有一个索引,TRANS_FROM和TRANS_TO。 我们掏了这个。它奏效了。

经过一番调查后,我们发现连接中的行数很少,但未使用索引,但随着连接中行数的增加,查询计划将发生变化,并且将使用违规索引。这解释了为什么这是一个间歇性的问题。

但显然一个次优的查询计划不应该导致Oracle死于ORA-07445 ...... 将使用Oracle支持进行登录。

答案 2 :(得分:0)

这样的错误可能是一个错误,Oracle支持人员可以查找代码并告诉您修复的位置。毫无疑问,无论如何你都应该跟上你的补丁。