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 =
(SERVICE_NAME = qa) ####可以任意填写哦,前提是与上面listener中的GLOBAL_DBNAME
) #### 或参数文件中的SERVICE_NAME一致
)