ORA-12514:TNS:监听程序当前无法识别连接描述符中请求的服务

来源:互联网 发布:painter mac教程 编辑:程序博客网 时间:2024/06/16 01:29
1. 首先查看tnsnames.ora,路径如下:
oracle安装目录\product\10.2.0\db_1\NETWORK\ADMIN\。看其中是否包含了你的连接描述符中的服务,也就是你请求的服务。如果没有,则可以手动添加,比如:
service_ex =
 (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = dbserver)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = service_ex)
    )
 )
可以参照tnsnames.ora中已有的服务描述。
2. 再检查listener.ora,该文件与tnsnames.ora位于相同目录下。监听器启动时会读取这个文件,使用其中的信息来识别连接请求中的服务。所以出现ORA-12514错误时,大部分是因为这个文件有问题引起的。在这个文件中,我们要查看其中的服务名是否与tnsnames.ora中的服务名一致。如果不一致,则可以手动修改,就上面的例子来说,修改前的listener.ora可能是:
LISTENER =
 (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = dbserver)(PORT = 1521))
 )
从上面的例子中可以看出,这个LISTENER中没有包含于tnsnames.ora对应的服务名,因此我们可以做如下的修改:
LISTENER =
 (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = dbserver)(PORT = 1521))
    (CONNECT_DATA =
      (SERVICE_NAME = service_ex)
    )
 )
完成修改后,重新启动监听服务,问题基本上都可以得到解决。
3. 如果还是出现同样的错误,也不用着急。Oracle的监听程序要比数据库服务启动的晚,当数据库服务启动之后,会修改listener.ora,把服务名写进listener.ora中,然后监听服务启动时读这个文件。但是在计算机启动时,有可能出现数据库服务还没有来得及修改listener.ora,监听服务就已经启来了。为了解决这个问题,我们可以把数据库服务跟监听器服务都设为手动启动,先启动数据库服务,然后再启动监听器服务。
4.    除了上述情况外,出现TNS错误时,有可能是因为没有加载数据库实例,加载方法如下:
在SQL/PLUS中输入startup force,强制加载数据库实例。
5.    总结:
ORA-12514错误引起的原因和解决办法基本就是这样,碰到问题时,实际情况实际分析,通过上面介绍的几种方法,多尝试几次,就可以解决了。
 
说明:
 开始以为是系统环境变量Oracle_SID的配置问题,因为机器有多个实例,一阵折腾后还是不能连接。后来查资料得知:

    Oracle9i以后,后台进程PMON自动在监听器中注册在系统参数SERVICE_NAMES中定义的服务名,SERVICE_NAMES默认为DB_NAME+DOMAIN_NAME。监听配置文件listener.ora中可以不必指定监听的服务名。但是,当数据库处于关闭状态下PMON进程没有启动,也就不会自动注册监听的实例名,所以使用sqlplussys/his@orc0as sysdba 会出现ORA-12514错误。

如果在listener.ora文件中指定监听的实例名,则即使数据库处于关闭状态,仍然可以连接。

listener.ora

SID_LIST_LISTENER =

  (SID_LIST =

    (SID_DESC =

      (SID_NAME = PLSExtProc)

      (ORACLE_HOME = G:\oracle\product\10.2.0\db_1)

      (PROGRAM = extproc)

    )

   (SID_DESC =

    (GLOBAL_DBNAME = ORCL)

    (ORACLE_HOME = G:\oracle\product\10.2.0\db_1)  

    (SID_NAME = ORCL)

    )

  )

LISTENER =

  (DESCRIPTION_LIST =

    (DESCRIPTION =

      (ADDRESS = (PROTOCOL = TCP)(HOST = zyk)(PORT = 1521))

    )

  )

 

以上粗体部件为增加的内容,修改后重启监听服务后即可。

附:通过在lsnrctl中输入set display verbose,然后再通过命令service查看,服务状态为READY表示PMON自动注册的服务名,而UNKNOWN则表示该服务是手工在LISTENER.ORA中配置的数据库服务。

原创粉丝点击