我们有一个在本地运行的应用程序,我们遇到以下错误:
ORA-12514:TNS:监听器当前不知道所请求的服务 在连接描述符
中
我使用正确解析的TNSPing
测试了连接
我尝试SQLPlus
尝试连接,但失败的错误与上面相同。我将此语法用于SQLPlus
:
sqlplus username/password@addressname[or host name]
我们已经确认:
我们不知道对此环境所做的任何更改。 还有其他我们可以测试的东西吗?
答案 0 :(得分:175)
我遇到了这个问题,修复方法是确保在tnsnames.ora
中SERVICE_NAME
是数据库中的有效服务名称。要查找有效的服务名称,可以在oracle中使用以下查询:
select value from v$parameter where name='service_names'
我将tnsnames.ora
更新为:
TEST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = *<validhost>*)(PORT = *<validport>*))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = *<servicenamefromDB>*)
)
)
然后我跑了:
sqlplus user@TEST
成功! 监听器基本上告诉您,根据数据库,您使用的任何service_name都不是有效的服务。
(*我从Win7客户端工作站运行sqlplus到远程数据库并责怪DBA;)*)
答案 1 :(得分:35)
我知道这是一个老问题,但仍然没有答案。我花了一天时间研究,但我发现了最简单的解决方案,至少在我的情况下(Windows 2008 R2上的Oracle 11.2)并且想要分享。
如果直接查看错误,则表示侦听器无法识别服务名称。但它在哪里保留服务名称?在%ORACLE_HOME%\NETWORK\ADMIN\listener.ora
“SID_LIST”就是这样,一个SID和服务名称列表以您可以复制或查找的格式配对。
我添加了问题服务名称,然后在Windows“服务”控制面板中,我在Oracle侦听器服务上执行了“重新启动”。现在一切都很好。
例如,您的listener.ora文件最初可能如下所示:
# listener.ora Network Configuration File: C:\app\oracle_user\product\12.1.0\dbhome_1\network\admin\listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = CLRExtProc)
(ORACLE_HOME = C:\app\oracle_user\product\12.1.0\dbhome_1)
(PROGRAM = extproc)
(ENVS = "EXTPROC_DLLS=ONLY:C:\app\oracle_user\product\12.1.0\dbhome_1\bin\oraclr12.dll")
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
...要使其识别orcl
的服务名称,您可以将其更改为:
# listener.ora Network Configuration File: C:\app\oracle_user\product\12.1.0\dbhome_1\network\admin\listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = CLRExtProc)
(ORACLE_HOME = C:\app\oracle_user\product\12.1.0\dbhome_1)
(PROGRAM = extproc)
(ENVS = "EXTPROC_DLLS=ONLY:C:\app\oracle_user\product\12.1.0\dbhome_1\bin\oraclr12.dll")
)
(SID_DESC =
(GLOBAL_DBNAME = orcl)
(ORACLE_HOME = C:\app\oracle_user\product\12.1.0\dbhome_1)
(SID_NAME = orcl)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
答案 2 :(得分:12)
我在 Windows server 2008 R2 和 Oracle 11g
中遇到此问题转到Net Manager&gt;听众&gt;从combox&gt;中选择数据库服务“全局数据库名称”必须与“SID”相同,“Oracle主目录”必须正确。
如果您没有任何数据库服务条目,请创建一个并设置正确的全局数据库sid
和oracle home。
答案 3 :(得分:8)
在我的情况下,错误是由于侦听器没有注册db的服务。我通过注册服务解决了这个问题。例如:
tnsnames.ora
中的我的描述符:
LOCALDB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = LOCALDB)
)
)
因此,我继续手动在listener.ora
注册服务:
SID_LIST_LISTENER =
(SID_DESC =
(GLOBAL_DBNAME = LOCALDB)
(ORACLE_HOME = C:\Oracle\product\11.2.0\dbhome_1)
(SID_NAME = LOCALDB)
)
最后,通过命令重启监听器:
> lsnrctl stop
> lsnrctl start
完成!
答案 4 :(得分:7)
从services.msc启动OracleServiceXXX在Windows中为我工作。
答案 5 :(得分:4)
这真的应该是对Brad Rippe答案的评论,但唉,还不够。那个答案让我90%的方式。在我的例子中,数据库的安装和配置将条目放在我运行的数据库的tnsnames.ora文件中。首先,我能够通过设置环境变量(Windows)连接到数据库:
set ORACLE_SID=mydatabase
set ORACLE_HOME=C:\Oracle\product\11.2.0\dbhome_1
然后使用
连接sqlplus / as sysdba
接下来,从Brad Rippe的回答中运行命令:
select value from v$parameter where name='service_names';
表明这些名字并不完全匹配。使用Oracle数据库配置助手创建的条目最初位于:
MYDATABASE =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = mylaptop.mydomain.com)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = mydatabase.mydomain.com)
)
)
查询中的服务名称仅为mydatabase
而非mydatabase.mydomain.com
。我将tnsnames.ora文件编辑为没有域部分的基本名称,因此它们看起来像这样:
MYDATABASE =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = mylaptop.mydomain.com)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = mydatabase)
)
)
我重新启动了TNS监听器服务(我经常从管理员命令窗口[或Windows Powershell]而不是服务控制面板使用lsnrctl stop
和lsnrctl start
,但两者都有效。)之后,我能够连接。
答案 6 :(得分:2)
当应用程序为每个数据库交互建立新连接或连接未正确关闭时,可能会发生此错误。监视和确认这一点的免费工具之一是Oracle Sql开发人员(尽管这不是您可以用来监视数据库会话的唯一工具)。
您可以从oracle网站Sql Developer
下载该工具这是一个如何监控会话的屏幕截图。 (如果您在看到ORA-12514错误时看到许多会话堆积为您的应用程序用户,则表明您可能存在连接池问题)。
答案 7 :(得分:2)
这里有很多答案,但是这里有一个代码的工作示例,您可以立即复制和粘贴并测试:
对我来说,指定正确的SERVICE_NAME后错误12514已解决。
您可以在文件tnsnames.ora
中的服务器上找到3个预定义的服务名称(其中一个是&#34; XE&#34;)。
HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.112.4.0\DllPath
中指定DLL路径。在64位计算机上,另外写入HKLM\SOFTWARE\Wow6432Node\Oracle\...
HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.121.2.0\DllPath
using Oracle.DataAccess.Client; or using Oracle.ManagedDataAccess.Client; .... string oradb = "Data Source=(DESCRIPTION=" + "(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.158)(PORT=1521)))" + "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=XE)));" + "User Id=SYSTEM;Password=xxx;"; using (OracleConnection conn = new OracleConnection(oradb)) { conn.Open(); using (OracleCommand cmd = new OracleCommand()) { cmd.Connection = conn; cmd.CommandText = "select TABLESPACE_NAME from DBA_DATA_FILES"; using (OracleDataReader dr = cmd.ExecuteReader()) { while (dr.Read()) { listBox.Items.Add(dr["TABLESPACE_NAME"]); } } } }
如果Oracle.ManagedDataAccess.dll
错误,则会收到错误12514. SERVICE_NAME=XE
是可选的。你也可以离开它。
答案 8 :(得分:2)
对我有用的东西非常简单,我只需要在&#34; Windows服务&#34;中手动启动服务。 (cmd trompt中的services.msc)。 我的服务名称是:OracleServiceXXXXX。
答案 9 :(得分:2)
对于那些可能在VM中运行Oracle的人(比如我),我看到了这个问题,因为我的VM内存不足,这似乎阻止了OracleDB正常启动/运行。增加我的VM内存并重新启动修复了问题。
答案 10 :(得分:2)
我有同样的问题,对我来说只是写
sqlplus myusername/mypassword@localhost
做了这个伎俩,这样做会让它连接到我猜的默认服务名称。
答案 11 :(得分:2)
我在我的linux环境中解决了这个问题,在/ etc / hosts文件中更新了我的机器的IP。
您可以使用以下命令验证您的网络IP(inet end。)。
$ifconfig
查看您的IP是否与/ etc / hosts文件匹配:
$cat /etc/hosts
编辑你的/ etc / hosts文件,如果是nedded:
$sudo gedit /etc/hosts
再见。
答案 12 :(得分:2)
我也面临同样的问题,花了3天时间把它挖出来。这是因为您的TNS服务条目错误。首先检查是否能够使用sql&gt;从主数据库连接到备用数据库。 sqlplus sys @ orastand as sysdba(orastand是备用数据库),如果你无法连接那么它就是服务问题。更正主端TNS文件中的服务名称输入。在备用数据库中检查相同的方式,如果需要在此处进行更改。并确保log_archive_dest_2 parmater具有正确的服务名称。
答案 13 :(得分:2)
检查数据库是否已启动。登录到服务器,将ORACLE_SID环境变量设置为数据库SID,并将SQL * Plus作为本地连接运行。
答案 14 :(得分:1)
就我而言,数据库的磁盘空间已用完。这导致它没有回应。一旦我解决了这个问题,一切都恢复了。
答案 15 :(得分:1)
我收到同样的错误,因为指定的远程SID错误:
> sqlplus $DATASOURCE_USERNAME/$DATASOURCE_PASSWORD@$DB_SERVER_URL/$REMOTE_SID
我查询了系统数据库:
从global_name;
中选择*找到我的远程SID(&#34; XE&#34;)。
然后我可以毫无问题地连接。
答案 16 :(得分:0)
重启虚拟机对我有用
答案 17 :(得分:0)
我的问题已解决,方法是将URL中的“ SID”替换为“服务名称”并输入正确的主机。
答案 18 :(得分:0)
test
已启动,但数据库已关闭。
对于oracle新手来说,当连接被接受时,数据库可能不会关闭。
我不得不像这样手动启动数据库
tnslsnr
然后在sql控制台中
su - oracle
export ORACLE_SID=XE
sqlplus sys as sysdba
在我的情况下,我无法启动,但又收到另一条错误消息,并找到了问题的根源-我必须更改主机名,然后数据库自动启动才能再次起作用。
答案 19 :(得分:0)
问题是我的连接字符串URL包含数据库名称而不是SID。 用oracle数据库连接SID替换数据库名称可以解决此问题。
要了解您的oracle SID,可以浏览tnsnames.ora
文件。
XE
是实际的SID,所以这是我的tomcat连接字符串现在的样子:
<Resource
name="jdbc/my_db_conn"
auth="Container"
type="javax.sql.DataSource"
driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@//127.0.0.1:1521/XE"
username="test_user"
password="test" />
我的服务器版本为“ Oracle 11.2 Express”,但解决方案也应适用于其他版本。
答案 20 :(得分:0)
就我而言, tnsnames.ora 文件中缺少SERVICE_NAME周围的圆括号。
<DBNAME> =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL=TCP)(HOST = nupark-cnvr-ora )(PORT=1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = <DBNAME> ***CLOSING ROUND BRACKET WAS MISSING HERE***
)
)
LISTENER_<DBNAME> =
(ADDRESS = (PROTOCOL = TCP)(HOST = nupark-cnvr-ora)(PORT = 1521))
答案 21 :(得分:0)
对于那些使用spring-boot和jdbc进行连接的用户。 在application.properties
中编写jdbcUrl时必须小心在数据库连接中具有SID-
source.datasource.jdbcUrl = jdbc:oracle:thin:@[HOST][:PORT]:SID
在数据库连接中带有服务名称
globe.datasource.jdbcUrl = jdbc:oracle:thin:@//[HOST][:PORT]/SERVICE
这对我有用:)
答案 22 :(得分:0)
在我使用DBMS的情况下,我必须填写数据库连接表格。
我将SID放在“数据库”字段中,并且在该字段旁边的下拉列表中,我使用的是“服务名称”值而不是“ SID”值。
(通常我不使用Oracle数据库,所以我不知道有什么区别)
那是我收到错误消息的原因。
答案 23 :(得分:0)
问题可能出在不正确的 URL 中。
例如,我将 Oracle 数据库(在 VM 内部)与 Spring 框架一起使用,但遇到了这个问题。
我的 application.properties 文件中有:
spring.datasource.url=jdbc:oracle:thin:@//localhost:1521/orcl12c
但是数据库版本不同:
spring.datasource.url=jdbc:oracle:thin:@//localhost:1521/orclcdb
正确的 URL 可以在 tnsnames.ora 文件中找到(这个文件可以在 Oracle 服务器的地方找到,所以如果你使用 VM,你应该在你的主机 VM 中查找这个文件) . 比如Oracle在VirtualBox中查看这个文件的命令是:
nano /u01/app/oracle/product/version/db_1/network/admin/tnsnames.ora
答案 24 :(得分:0)
在我的 Linux 环境中,ORACLE_HOME/bin
处的 oracle 文件以“红色”颜色突出显示,具有不同的权限,如下所示:
我更改了这个文件的权限如下:
1) 停止 Oracle -> sudo systemctl stop oracle.service
2)修改ORACLE_HOME/bin
目录下oracle文件的权限为“sudo chmod 777 oracle”
3) 启动 Oracle -> sudo systemctl start oracle.service
然后在此更改后,我使用lsnrctl status检查了侦听器的状态。在这里,我可以看到成功加载了数据库实例。
注意:修改权限前备份oracle文件。
答案 25 :(得分:-1)
我已完成以下工作来解决此问题。
我在cmd提示符下设置了oracle_home (右键单击cmd.exe以系统管理员身份运行)。 在命令下面使用
设置oracle_home =&#34; oracle home&#34;
我在我的D:驱动器中安装了oracle。