Oracle ORA-03113和ORA-07445访问冲突

Oracle ORA-03113和ORA-07445访问冲突,oracle,odp.net,Oracle,Odp.net,环境 甲骨文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 验证连接=true;连接字符串中的最小池大小=0 所有odp.net连接、命令和参数对象在使用后关闭/释放 问题: ORA-03113返回到asp.net 数据库端记录了ORA-07445访问冲突。(见下文) 它始终是相同的选择查询(在存储过程中) 这不是一个沉重的问题。整张桌子只有20K行 web应

环境

  • 甲骨文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

  • 验证连接=true;连接字符串中的最小池大小=0

  • 所有odp.net连接、命令和参数对象在使用后关闭/释放
问题:

  • ORA-03113返回到asp.net
  • 数据库端记录了ORA-07445访问冲突。(见下文)
  • 它始终是相同的选择查询(在存储过程中)
  • 这不是一个沉重的问题。整张桌子只有20K行
  • web应用程序的其余部分不受影响。oracle连接和查询工作正常
  • w3wp.exe使用的内存和线程正常
  • 我们唯一的解决方案是DBA在db服务器上重新分配表。DBA说这是应用程序问题,我不太确定,但

    我已经阅读了所有关于SO的相关帖子,但欢迎您提供任何建议

    谢谢, P

    ORA-07445:遇到异常:核心转储[访问冲突][evaopn2+2896][PC:0x15F3876][ADDR:0x0][无法读取][]

    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
    

    我认为你永远不能把这样的事情称为“申请问题”。您可能需要说服DBA这是一个数据库问题,这样他就可以与Oracle支持人员交谈,或者至少在Metalink或其他方面查找它。当你开始谈论IIS、.NET等时,你可能吓跑了他。看看你是否只能在SQL*Plus中重现错误,这应该引起他的注意


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

    我们能够使用SQL Developer重现同样的问题,因此发现了问题

    …ILRN.ILRN\U ID=IRSV.ILRN\U ID上的内部联接IIL\U运行\U STA\U VAL IRSV 以及IRSV.TRANS_FROM和IRSV.TRANS_TO之间的当前_时间戳

    这条线就是罪魁祸首。在两个日期列上有一个索引,TRANS_FROM和TRANS_TO。 我们把这个扔了。成功了

    经过进一步的调查,我们发现,由于连接中的行数很少,因此没有使用索引,但随着连接中的行数增加,查询计划将发生变化,并且会使用有问题的索引。这就解释了为什么这是一个间歇性问题

    但显然,一个次优的查询计划不应该导致Oracle因ORA-07445而死亡。。。
    将与Oracle支持人员一起登录。

    类似的错误可能是一个错误,Oracle支持人员可以查找代码并告诉您修复的位置。不言而喻,无论如何,您都应该跟上补丁的进度。

    检查查询计划是否有任何丑陋或意外的地方是值得的。可以尝试将当前的_时间戳谓词移出WHERE子句,而不是内部联接。最后,询问DBA是否可以告诉您它在解析(解释查询)、执行或获取(获取行)方面是否失败。如果没有其他问题,这将迫使他做一些调查。7445错误通常是甲骨文错误的征兆。Oracle支持部门刚刚解决了一个非常类似的问题。它实际上是在最近的关键补丁更新之后开始发生的。