ORA-12514:TNS:监听器当前不知道连接描述符中请求的服务

我在尝试通过监听器连接到Oracle数据库XE时遇到问题:

sqlplus system/my_password@XE 

我收到以下错误:

 ORA-12514: TNS:listener does not currently know of service requested in connect descriptor 

我使用的是Ubuntu 12.10和Oracle Express Edition 11g。

我的主要目标是使用jdbc连接java + oracle db,但是我得到了同样的错误。

这是我的listener.ora

 # listener.ora Network Configuration File: SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = PLSExtProc) (ORACLE_HOME = /u01/app/oracle/product/11.2.0/xe) (PROGRAM = extproc) ) ) LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE)) (ADDRESS = (PROTOCOL = TCP)(HOST = watson)(PORT = 1521)) ) ) DEFAULT_SERVICE_LISTENER = (XE) 

和tnsnames.ora

 # tnsnames.ora Network Configuration File: XE = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = watson)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = XE) ) ) EXTPROC_CONNECTION_DATA = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE)) ) (CONNECT_DATA = (SID = PLSExtProc) (PRESENTATION = RO) ) ) 

 lsnrctl service LSNRCTL for Linux: Version 11.2.0.2.0 - Production on 04-FEB-2014 17:01:44 Copyright (c) 1991, 2011, Oracle. All rights reserved. Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC_FOR_XE))) Services Summary... Service "PLSExtProc" has 1 instance(s). Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service... Handler(s): "DEDICATED" established:0 refused:0 LOCAL SERVER The command completed successfully 

假设您的数据库即使在侦听器运行一段时间后也无法注册,听起来您的local_listener参数未显式设置,因此您的数据库正在尝试在默认地址上注册; 并且因为它没有注册,所以它使用的任何地址似乎都不是听众所在的地址。

假设watson正在解析一个有用的外部IP地址,如果你能够从你的盒子外面得到那个TNS错误,那么你可以告诉数据库使用相同的地址来注册:

 alter system set local_listener = '(ADDRESS=(PROTOCOL=TCP)(HOST=watson)(PORT=1521))' scope=memory; alter system register; 

如果这样lsnrctl services并且lsnrctl services现在显示XE并且您对它感到满意,则可以将memory更改为both并重新执行, 以便在下次数据库重新启动时保持不变。

或者,如果你只尝试在同一个盒子里连接, watson可能会解析为无用的东西,比如127.0.0.1,如果它设置为在你的/etc/hosts ; 或者您的/etc/hosts地址可能与您的DNS条目不一致。 您可以将listener.oratnsnames.ora更改为“正确的”FQDN或IP地址,只要它匹配数据库认为的网络名称即可。

tnsnames.ora很好,它用于sqlplus客户端。 listener.ora并不好。 键入lsnrctl服务时缺少XE服务很难相信您必须设置listener.ora才能安装Oracle Express。

这是我测试VM的一个例子。

 Service "PEXPROC" has 1 instance(s). Instance "PEXPROC", status UNKNOWN, has 1 handler(s) for this service... Handler(s): "DEDICATED" established:0 refused:0 LOCAL SERVER Service "ocmdb" has 1 instance(s). Instance "ocmdb", status UNKNOWN, has 1 handler(s) for this service... Handler(s): "DEDICATED" established:29 refused:0 LOCAL SERVER The command completed successfully 

我在listener.ora中的示例段

 SID_LIST_LISTENER_OCM = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = ocmdb) (ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1) (SID_NAME = ocmdb) ) )