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

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

ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务
上 面的话很容易误解,让人认为数据库服务名(SERVICE NAME)有问题,其实他指的是tnsnames.ora中配置的别名ALIAS所对应的SERVICE_NAME,与在LISTENER中的注册的一堆服务名找不到(也可能一个也没有,比如只配置了动态监听)。

GLOBAL_DBNAME 是指listener.ora文件中注册静态监听时的服务名。
另在PARAMETER(spfile)中也可用SERVICE_NAME参数指定注册动态监听时的服务名。

而tnsnames.ora中的服务名SERVICE_NAME的可选值为静态和动态注册的服务名(SERVICE_NAME),也即listener.ora中的GLOBAL_DBNAME和PARAMETER中的SERVICE_NAME,可以是任意支持的字符,但两者必须与保持一致。而sqlplus中的链接字符串,并不是SERVICE_NAME,而是一个SERVICE_NAME的ALIAS(在tnsname.ora中配置) 。

静态监听的目的,除了简化配置外,还可以提供在数据库未启动前仍能连接的功能。
一般(默认)情况下GLOBAL_DBNAME,SERVICE_NAME,ALIAS 及其他的DB_NAME,DB_UNIQUE_NAME,SID_NAME均一样,导致了“傻傻分不清楚”。

附简单的listener.ora(部分):
    (SID_DESC =
      (GLOBAL_DBNAME = qa)                    ####listener中的service_name
      (ORACLE_HOME = /u01/app/oracle/product/10.2.0)
      (SID_NAME = qa )                               ####listener中的sid_name
tnsnames.ora(部分):
QA =                                      ####上面说的别名ALIAS,可以任意填写哦,连接数据库时用的就是它了
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.101)(PORT = 1521))
    )
    (CONNECT_DATA =http://www.mamicode.com/
      (SERVICE_NAME = qa)                ####可以任意填写哦,前提是与上面listener中的GLOBAL_DBNAME
    )                                                    #### 或参数文件中的SERVICE_NAME一致
  )

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