error message:
ORA-12514: TNS:listener does not currently know of service requested in connect descriptor
出错原因有很多,如果你检查service里面所有的服务都是started,那说明是监听服务和数据库实例服务的主动跟被动的关系原因导致的。
问题解决有2,
方法1.是让listener主动加载服务
原因是 添加
(SID_DESC =
(SID_NAME = orcl)
(ORACLE_HOME = C:\oracle\product\10.2.0\db_1)
)
后,在使用lsnrctl start监听程序时会将listener的服务注册到进程监视器(pmon)中
方法2.listener被动加载服务
在service里面stop监听服务和数据库实例服务,然后先重新启动监听服务,再启动数据库实例服务。
原因是,如果没有该内容,那么由实例的pmon进程在listener中注册服务,对listener来讲,就是被动了。
这也就是为什么先启动监听后启动数据库能够正常连接的,反之不行的原因了。
Dynamically register 与Local_listener参数
因为一个测试库安装了特殊的服务之后会自动往LOCAL_LISTENER参数里设置值,导致利用原参数文件重建的数据库无法自动注册监听服务。
同一主机的其他数据库能自动注册监听服务。
<期间重试了Reload 删除 LISTENER 重新建立一个新的LISTENER等无用功>
非默认监听由于LOCAL_LISTENER参数的设置,变成动态注册
改变参数
SQL> alter system set LOCAL_LISTENER='';
系统已更改。
SQL> show parameter lis
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
local_listener string
recovery_parallelism integer 0
remote_listener string
终于解决了。
LSNRCTL> status
Service "TEST2" has 1 instance(s).
Instance "TEST2", status READY, has 1 handler(s) for this service...
Service "TEST2XDB" has 1 instance(s).
Instance "TEST2", status READY, has 1 handler(s) for this service...
a、PMON进程1分钟运行一次,当监听刚刚启动的时候,可能服务还没有注册进去,这时候是不能使用此服务的
b、在修改local_listener参数时,PMON进程也会重新注册一次
c、如果数据库shutdown后,PMON进程也停止了,服务会从监听中删除,这时候只能使用OS认证的方式连入数据库
】
ORA-12514: TNS: listener does not currently know of service requested in connect descriptor
这是个相当恶心的错误,就像癫痫病人一样,不知道什么时候就犯了,好好的用着,吃晚饭再连,就报no listener 起了监听,之后就是这个错误。胡搞一通,不行,重启OK。不知道哪里的问题,因为是测试环境,经常会重启,这个错误就想幽灵一样时出时没。现在的oracle怎么那么难伺候!!烦的多了终于下定决心要找出问题所在,于是在网上阅贴无数,终于找着了能按照一定规律解决问题的方法,就转载了过来
关于这个错误,有很多种情况,我知道有2种情况,以下是网上摘录的:
1、近日在配置Oracle 10G的流复制环境时,遇到一个问题,关闭数据库(shutdown immediate)后,通过SQL Plus连接数据库:conn sys/his@orc0 as sysdba,出现如下错误:
ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务
通过重启服务的方式启动数据库,再次连接却能成功登录,也就是说在关闭数据库状态下无法连接服务器。
开始以为是系统环境变量Oracle_SID的配置问题,因为机器有多个实例,一阵折腾后还是不能连接。后来查资料得知:
Oracle9i以后,后台进程PMON自动在监听器中注册在系统参数SERVICE_NAMES中定义的服务名,SERVICE_NAMES默认为DB_NAME+DOMAIN_NAME。监听配置文件listener.ora中可以不必指定监听的服务名。但是,当数据库处于关闭状态下PMON进程没有启动,也就不会自动注册监听的实例名,所以使用sqlplus sys/his@orc0 as 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)
(http://blog.sina.com.cn/s/blog_4abe7f3a0100g7mm.html) - ORA-12514: TNS: 监听程序当前无法识别连接描述符中_
(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中配置的数据库服务。
2、可能是数据库服务器蹦了,这样的话,光重启服务是不行的,重启机器也无济于事。可以用下面的方法解决。
打开cmd窗口,输入sqlplus / as sysdba;startup,完毕后即恢复正常,执行速度有点慢,耐心等待。
该问题附带错误可能是:
oracle not available
shared memory realm does not exist
上述是我转载的文章,试了一下第一种,成功了。应该是有用的。
用sqlplus登陆时报错
ERROR:ORA-12514: TNS:listener does not currently know of service requested in connect
------解决方法--------------------------------------------------------
如果服务器和客户端在同一个子网中,在监听器的配置文件中不填ip,填计算机名。
------解决方法--------------------------------------------------------
如果是同一网段的话,可以将你现在填写的计算机ip改成对应的计算机名字,不过要求网段中计算机名唯一
------解决方法--------------------------------------------------------
关于LISTENER.ORA,TNSNAMES.ORA和SQLNET.ORA的存在问题
最近一次巡检客户的数据库时发现一个小小异常,在$ORACLE_HOME/network/admin目录下居然只有一个tnsnames.ora文件,sqlnet.ora和listener.ora文件都没有,
检查环境变量设置和当前LISTENER进程情况,没有异常,尝试通过TNS登录数据库,都是正常的,马上想到的问题是是否这个文件是被误删掉了,其次就是这种情况下重新启动数据库监听的话是否会因为没有LISTENER.ORA文件而无法正常启动监听。由于是客户在线生产库,所以没有贸然尝试,因为从监听日志中看到当前连接还是很频繁的,平均一分钟有20左右的连入,相对比较繁忙的状况。
因为客户的数据库运行在10.2.0.4上,所以接下来的实验找了一个10.2.0.5的库来进行,版本比较接近,当然就这个问题来说可以估计只要是10G的版本都不会区别太大的。
首先将当前的三个文件做了移动,
Wilson-> pwd
/u01/app/oracle/product/10.2.0/db_1/network/admin
Wilson-> mkdir temp
Wilson-> mv ./*.ora ./temp
然后尝试启动监听和数据库,
监听启动成功,检查进程状态正常,那么这里的结论是如果当前机器上只有一个实例在跑,并且端口使用的都是缺省的1521,那么没有listener.ora文件的话,lsnrctl会尝试启动缺省的监听器,监听当前机器的1521端口。但是当前使用的listener.ora文件在listener.log文件中可以看到,
使用listener.ora文件的日志:
TNSLSNR for Linux: Version 10.2.0.1.0 - Production on 26-APR-2011 13:07:09
Copyright (c) 1991, 2005, Oracle. All rights reserved.
System parameter file is /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
Log messages written to /u01/app/oracle/product/10.2.0/db_1/network/log/listener.log
Trace information written to /u01/app/oracle/product/10.2.0/db_1/network/trace/listener.trc
Trace level is currently 0
没有使用listener.ora文件的日志:
TNSLSNR for Linux: Version 10.2.0.5.0 - Production on 21-JUL-2011 03:40:57
Copyright (c) 1991, 2010, Oracle. All rights reserved.
Log messages written to /u01/app/oracle/product/10.2.0/db_1/network/log/listener.log
Trace information written to /u01/app/oracle/product/10.2.0/db_1/network/trace/listener.trc
Trace level is currently 0
当然了,并不只是这点表面上的区别,下面是两种情况下lsnrctl status的输出:
使用listener.ora文件的日志:
Wilson-> lsnrctl status
LSNRCTL for Linux: Version 10.2.0.5.0 - Production on 21-JUL-2011 04:50:46
Copyright (c) 1991, 2010, Oracle. All rights reserved.
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 10.2.0.5.0 - Production
Start Date 21-JUL-2011 03:40:57
Uptime 0 days 1 hr. 9 min. 48 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Log File /u01/app/oracle/product/10.2.0/db_1/network/log/listener.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=Wilson.MyCorp)(PORT=1521)))
Services Summary...
Service "orcl" has 1 instance(s).
Instance "orcl", status READY, has 1 handler(s) for this service...
Service "orclXDB" has 1 instance(s).
Instance "orcl", status READY, has 1 handler(s) for this service...
Service "orcl_XPT" has 1 instance(s).
Instance "orcl", status READY, has 1 handler(s) for this service...
The command completed successfully
没有使用listener.ora文件的日志:
Wilson-> lsnrctl status
LSNRCTL for Linux: Version 10.2.0.5.0 - Production on 21-JUL-2011 04:52:25
Copyright (c) 1991, 2010, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 10.2.0.5.0 - Production
Start Date 21-JUL-2011 04:51:32
Uptime 0 days 0 hr. 0 min. 53 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
Listener Log File /u01/app/oracle/product/10.2.0/db_1/network/log/listener.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=Wilson.MyCorp)(PORT=1521)))
Services Summary...
Service "PLSExtProc" has 1 instance(s).
Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
Service "orcl" has 1 instance(s).
Instance "orcl", status READY, has 1 handler(s) for this service...
Service "orclXDB" has 1 instance(s).
Instance "orcl", status READY, has 1 handler(s) for this service...
Service "orcl_XPT" has 1 instance(s).
Instance "orcl", status READY, has 1 handler(s) for this service...
The command completed successfully
可见两种情况下,首先是否启动外部监听是有区别的,也就是说如果程序中使用到了EXTPROC方式,那么不配置listener.ora就可能会有问题,其次才是是否使用了参数文件的区别。
至于sqlnet.ora文件的存在与否,这个不用多说,如果没有sqlnet.ora文件,ORACLE会缺省使用TNSNAMES,ONAMES,HOSTNAME三种方式来尝试连接,
上面是三个文件都不存在情况下的实验,
Wilson-> sqlplus /nolog
SQL*Plus: Release 10.2.0.5.0 - Production on Thu Jul 21 05:09:47 2011
Copyright (c) 1982, 2010, Oracle. All Rights Reserved.
SQL> conn scott/tiger
Connected.
SQL> conn
ERROR:
ORA-12154: TNS:could not resolve the connect identifier specified
Warning: You are no longer connected to ORACLE.
SQL> conn
Connected.
SQL> conn
Connected.
(端口号如果是1521,可以省略)
下面试验有sqlnet.ora,但是只配置使用TNSNAMES方式,
#NAMES.DIRECTORY_PATH= (HOSTNAME, TNSNAMES, EZCONNECT)
NAMES.DIRECTORY_PATH= (TNSNAMES)
Wilson-> sqlplus /nolog
SQL*Plus: Release 10.2.0.5.0 - Production on Thu Jul 21 05:14:15 2011
、
Copyright (c) 1982, 2010, Oracle. All Rights Reserved.
SQL> conn / as sysdba
Connected.
SQL> conn scott/tiger
Connected.
SQL> conn
ERROR:
ORA-12154: TNS:could not resolve the connect identifier specified
Warning: You are no longer connected to ORACLE.
可见没有HOSTNAME方式或者EZCONNECT方式都会导致这种简单连接方式的失败。
SQL> conn
ERROR:
ORA-12514: TNS:listener does not currently know of service requested in connect
descriptor
Warning: You are no longer connected to ORACLE.
SQL> conn
ERROR:
ORA-12514: TNS:listener does not currently know of service requested in connect
descriptor
至于HOSTNAME和EZCONNECT这两种方式,个人感觉在10g中已经没有什么大的区别,感觉是ORACLE10g中人为制造出来的一个NEW FEATURE,而相应的之前的HOSTNAME方式已经被取代,
在10.2.0.5这个版本上,我无法试验成功HOSTNAME直接方式连接成功。
下面引用ORACLE官方的说法,
Oracle 10g Easy Connect Naming
Easy connect naming is not allowed in large or complex environments that require additional connect information. (Large or complex environments employ advanced features, such as connection pooling, external procedure calls, or
Heterogeneous Services.) In these cases, you must use another naming method.
With Oracle 10g, easy connect naming is automatically configured by default at installation. However, before attempting to use this feature, you may want to ensure that EZCONNECT is specified first in the names.directory_path
parameter in the sqlnet.ora file. The names.directory_path parameter is used to specify the order of naming methods that Oracle Net can use to resolve connect identifiers to connect descriptors. Verification is easy. To verify that the names.directory_path
settings are correct, follow these instructions:
Start Oracle Net Manager.
In the navigator pane, expand Local > Profile.
From the list in the right pane, select Naming.
Click the Methods tab. Ensure that EZCONNECT is listed in the Selected Methods list. If it is not, then proceed to Step 5.
From the Available Methods list, select EZCONNECT, then click the right-arrow button.
From the Selected Methods list, select EZCONNECT, then use the Promote button to move the selection to the top of the list.
Choose File > Save Network Configuration. The sqlnet.ora file updates with the names.directory_path parameter, listing ezconnect first: names.directory_path =(ezconnect, tnsnames).
从上面的表述中也可以看出来,其实HOSTNAME连接方式已经是保留对之前版本的支持而已,11gR2WIN32版本中,ORACLE的NETMGR程序中还可以看到这种连接方式,但是更常被用到的NETCA程序中已经看不到这个连接方式的存在了。
最后说下tnsnames.ora,这个文件其实取决于当前应用所需要的连接方式,在TCP/IP环境下基本上是必不可少的,否则就只能通过类似JAVA连接字符串的形式来连库了。如果需要使用TNSNAMES,也就是本地服务名方式来连接数据库,那么就是必须的要使用到这个文件了。