我们有一个在本地运行的应用程序,我们遇到以下错误:
ORA-12514:TNS:监听器当前不知道连接描述符中请求的服务
我已经使用正确解析的TNSPing
测试了连接,我尝试使用SQLPlus
尝试连接,但失败的错误与上面相同。我在SQLPlus
中使用了这种语法:
sqlplus username/password@addressname[or host name]
我们已经证实:
我们不知道对此环境所做的任何更改。还有其他我们可以测试的吗?
我有这个问题,修复是为了确保在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;)*)
我在我的linux环境中解决了这个问题,在/ etc / hosts文件中更新了我的机器的IP。
您可以使用以下命令验证您的网络IP(inet end。)
$ifconfig
查看您的IP是否与/ etc / hosts文件匹配:
$cat /etc/hosts
如果需要,编辑/ etc / hosts文件:
$sudo gedit /etc/hosts
再见。
我有同样的问题,对我来说只是写作
sqlplus myusername/mypassword@localhost
诀窍,这样做使我连接到默认服务名称我猜。
对于那些可能在VM中运行Oracle的人(像我一样),我看到了这个问题,因为我的VM内存不足,这似乎阻止了OracleDB正常启动/运行。增加我的VM内存并重新启动修复了该问题。
对我有用的东西非常简单,我只需要在“Windows服务”(cmd trompt中的services.msc)中手动启动服务。我的服务名称是:OracleServiceXXXXX。
这里有很多答案,但是这里有一个代码的工作示例,您可以立即复制和粘贴并测试:
对我来说,指定正确的SERVICE_NAME后错误12514已解决。您可以在tnsnames.ora
文件中的服务器上找到3个预定义的服务名称(其中一个是“XE”)。
HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.112.4.0\DllPath
。在64位机器上另外写入HKLM\SOFTWARE\Wow6432Node\Oracle\...
HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.121.2.0\DllPath
Oracle.ManagedDataAccess.dll
,它只有4 MB,是一个纯粹的托管DLL,工作在32位和64位位进程也依赖于没有其他DLL,也不需要任何注册表项。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"]); } } } }
如果SERVICE_NAME=XE
错误,则会收到错误12514.SERVICE_NAME
是可选的。你也可以把它留下。
就我而言,数据库的磁盘空间已用完。这导致它没有回应。一旦我解决了这个问题,一切都恢复了。
我得到了同样的错误,因为指定的远程SID是错误的:
> sqlplus $DATASOURCE_USERNAME/$DATASOURCE_PASSWORD@$DB_SERVER_URL/$REMOTE_SID
我查询了系统数据库:
select * from global_name;
并找到了我的远程SID(“XE”)。
然后我可以毫无问题地连接。
对我来说,这是由使用安装使用动态IP地址引起的。我使用静态IP地址安装了Oracle,然后一切都很好
重新启动VM对我有用
我已经完成了以下工作来解决此问题。
我在我的D:驱动器中安装了oracle。
我知道这是一个老问题,但仍然没有答案。我花了一天时间研究,但我发现了最简单的解决方案,至少在我的情况下(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))
)
)
我在Windows Server 2008 R2和Oracle 11g上遇到过这个问题
转到网络管理器>监听器>从combox选择数据库服务>“全局数据库名称”必须与“SID”相同,“Oracle主目录”必须正确。
如果您没有任何数据库服务条目,请创建一个并设置正确的全局数据库sid
和oracle home。
在我的情况下,错误是由于监听器没有注册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
完成!
从services.msc启动OracleServiceXE在Windows中为我工作。
这真的应该是对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
而不是服务控制面板,但两者都有效。)之后,我能够连接。
检查数据库是否已启动。登录到服务器,将ORACLE_SID环境变量设置为数据库SID,并将SQL * Plus作为本地连接运行。
当应用程序为每个数据库交互建立新连接或连接未正确关闭时,可能会发生此错误。监视和确认这一点的免费工具之一是Oracle Sql开发人员(尽管这不是您可以用来监视数据库会话的唯一工具)。
你可以从oracle网站Sql Developer下载该工具
这是一个如何监控会话的屏幕截图。 (如果您在看到ORA-12514错误时看到许多会话堆积为您的应用程序用户,则表明您可能存在连接池问题)。
我也面临同样的问题,花了3天时间把它挖出来。这是因为您的TNS服务条目错误。首先检查是否能够使用sql> sqlplus sys @ orastand作为sysdba(orastand是备用数据库)从主数据库连接到备用数据库,如果无法连接则服务有问题。更正主端TNS文件中的服务名称输入。在备用数据库中检查相同的方式,如果需要在此处进行更改。并确保log_archive_dest_2 parmater具有正确的服务名称。