• oracle数据库连接错误解决办法


    ORA-28547 连接服务器失败,可能是Oracle Net 管理错误

    原文地址:http://www.linuxidc.com/Linux/2014-11/109686.htm

    上周去给客户培训Oracle,讲到DG部分做实际配置演示的时候,碰到了ORA-28547故障,客户的数据库时11.2.0.1的版本,Window平台。

    之前已经按照步骤把DG全部配置完成了,当准备在备库启用redo apply的时候,照例先检查一下两边远程归档路径是否有效:

    <span "="">select dest_name,status,error from v$archive_dest where dest_id<3;
    <span "=""> 
    <span "="">此时备库的本地和远程归档路径状态都是VALID,但是主库就报一个:
    <span "="">ORA-28547:connection to server failed,probable Oracle Net admin error (DBD ERROR: OCISessionBegin)
     
    由于和服务器连接失败,主库的归档无法通过LNS进程传递到备库,这和之前碰到的各种ORA-12541和ORA-12514的TNS连接<span "="">错误还不太一样,因为用TNSPING命令去ping各自的NET SERVICE NAME都是正常的,并没有说找不到目标。
    <span "=""> 
    <span "="">根据经验,当发生TNS或Oracle Net连接错误,首先就要去关注几个$ORACLE_HOME/network/admin下面的几个配置文件,通常是配置不正确造成的,以下是几个配置文件大致内容:
     
    listener.ora
    # listener.ora Network Configuration File: D:oracleproduct11.2.0dbhome_1 etworkadminlistener.ora
    # Generated by Oracle configuration tools.
    #CLRExtProc

    #DIRECT_HANDOFF_TTC_LISTENER = OFF

    SID_LIST_LISTENER =
      (SID_LIST =
        (SID_DESC =
          (SID_NAME = orcl)
          (ORACLE_HOME = D:oracleproduct11.2.0dbhome_1)
          (PROGRAM = extproc)
          (ENVS = "EXTPROC_DLLS=ONLY:D:oracleproduct11.2.0dbhome_1inoraclr11.dll")
        )
      )

    LISTENER =
      (DESCRIPTION_LIST =
        (DESCRIPTION =
          (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
          (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
        )
      )

    ADR_BASE_LISTENER = D:oracle


    tnsnames.ora 
    # tnsnames.ora Network Configuration File: D:oracleproduct11.2.0dbhome_1 etworkadmin nsnames.ora
    # Generated by Oracle configuration tools.

    LISTENER_ORCL =
       (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))


    ORACLR_CONNECTION_DATA =
      (DESCRIPTION =
        (ADDRESS_LIST =
          (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
        )
        (CONNECT_DATA =
          (SID = CLRExtProc)
          (PRESENTATION = RO)
        )
      )

    orcl =
      (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
        (CONNECT_DATA =
          (SERVER = DEDICATED)
          (SERVICE_NAME = orcl)
        )
      )


    sqlnet.ora
    # sqlnet.ora Network Configuration File: D:oracleproduct11.2.0dbhome_1 etworkadminsqlnet.ora
    # Generated by Oracle configuration tools.

    # This file is actually generated by netca. But if customers choose to 
    # install "Software Only", this file wont exist and without the native 
    # authentication, they will not be able to connect to the database on NT.

    SQLNET.AUTHENTICATION_SERVICES= (NTS)

    NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
     
    网上google了几篇相关内容的文章,有的说要把sqlnet.ora中的<span "="">SQLNET.AUTHENTICATION_SERVICES= (NTS)改为<span "="">SQLNET.AUTHENTICATION_SERVICES= (NONE),或者是把监听的HOST中改为IP地址,但都没有效果。<span "="">而且前者会禁用操作系统验证,也就意味着必须用username/password@orcl的方式登录到服务器
    <span "=""> 
    <span "="">最终通过查阅官方文档解决该问题,我们来看一下官方文档的描述:
     
    应用于:
     
    Oracle Net Services - Version 11.2.0.1 and later
    Information in this document applies to any platform.
     
    症状:
     
    When connecting through the Listener to a Database, an error is thrown:
    ORA-28547: connection to server failed, probable Oracle Net admin error

    However, local BEQUEATH connections (without the Listener) work fine.
     

    改变:

     

     <span "="">New installation or changes to an existing listener.ora file

     
    原因:
     

    <span "="">The listener.ora file's SID_LIST section may INCORRECTLY contain a "PROGRAM" line and/or an "ENVS" line for all database instances.

    For example, for a listener called LISTENER1 the following may be set for a "static" SID_LIST section:

    SID_LIST_LISTENER1 =
      (SID_LIST =
        (SID_DESC =
          (SID_NAME = ORCL1)
          (ORACLE_HOME = E:apporacleproduct11.2.0dbhome_1)
          (PROGRAM = extproc)
          (ENVS = "EXTPROC_DLLS=ONLY:E:apporacleproduct11.2.0dbhome_1inoraclr11.dll")
        )
        (SID_DESC =
          (SID_NAME = PLSExtProc)
          (ORACLE_HOME = E:apporacleproduct11.2.0dbhome_1)
          (PROGRAM = extproc)
          (ENVS = "EXTPROC_DLLS=ONLY:E:apporacleproduct11.2.0dbhome_1inoraclr11.dll")
        )
      )


    In the example above, the first section contains the SID_NAME and ORACLE_HOME values for the Database instance required for connection to.
    However, it also contains a PROGRAM and an ENVS value which will also attach to client connections through the SID_NAME Value.
    This can result in Oracle*Net connection errors such as ORA-28547.

    These are ONLY for External Procedures and/or Heterogeneous Services (HS) Gateway use, which is as per the second section example and correctly used for that section.

    注意以上红色部分,这里明确地提到了,PROGRAM和ENVS参数的设置会导致客户端通过SID_NAME来进行连接,由此会引发ORA-28547错误
     
    <span "="">既然这2个参数会引起问题,那么解决方法就是把他们去掉即可,官方文档中提到<span "="">只要去掉和实例名相关的那个SID_LIST中的PROGRAM和ENVS的条目<span "="">。我自己实际测试的时候,单独去掉PROGRAM不行,于是把PROGRAM和ENVS都去掉,之前的问题就解决了。至于SID_DESC中SID_NAME=PLSExtProc中的PROGRAM和ENVS条目,不去掉是否可行,还未亲自测试过。
     
    <span "="">注意:<span "="">改完以后要重启一下监听,或者重启Windows中的监听Service。
     
  • 相关阅读:
    Logger.getLogger与LogFactory.getLog
    log4j详解
    游戏史上80重要创新(原资料来自17173)
    软件开发工具介绍之 6.Web开发工具
    JAVA NIO 简介
    Alan Kay 你需要认识的一个天才
    大学计算机学习路线
    软件开发工具介绍之 5. 计划管理
    软件开发工具介绍之 4. 建模工具
    关于最近“361强奸360强奸QQ”,且是光天化日之下
  • 原文地址:https://www.cnblogs.com/fengwenzhee/p/8458469.html
Copyright © 2020-2023  润新知