我们有一个本地运行的应用程序,我们遇到了以下错误:

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

我已经使用正确解决的tnspring测试了连接 我尝试使用SQLPlus进行连接,但失败了,出现了与上面相同的错误。我在SQLPlus中使用了以下语法:

sqlplus username/password@addressname[or host name]

我们已核实:

服务器上的TNS Listener正在运行。 服务器上的Oracle本身正在运行。

我们不知道这个环境发生了什么变化。 还有什么可以测试的吗?


当前回答

我的问题解决了,用“服务名称”和正确的主机替换URL中的“sid”。

其他回答

我解决了这个问题在我的linux环境更新我的机器的IP在/etc/hosts文件。

您可以验证您的网络IP (inet end.):

$ifconfig

查看您的IP是否与/etc/hosts文件匹配:

$cat /etc/hosts

如果需要,编辑/etc/hosts文件:

$sudo gedit /etc/hosts

Bye.

我在Windows server 2008 R2和Oracle 11g上遇到了这个问题

进入网络管理器>监听>从组合框中选择数据库服务>“全局数据库名称”必须与“SID”相同,“Oracle主目录”必须正确。

如果没有数据库服务条目,请创建一个并设置正确的global database, sid和oracle home。

对于Dbeaver用户:尝试在连接设置中选择“SID”而不是“服务名称”。

问题是我的连接字符串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”,但解决方案应该也适用于其他版本。

这里有很多答案,但这里有一个工作示例的代码,你可以立即复制、粘贴和测试:

对我来说,在指定正确的SERVICE_NAME后,错误12514得到了解决。 您可以在服务器上的文件tnsnames中找到它。ora自带3个预定义的服务名称(其中一个是“XE”)。

I installed the Oracle Express database OracleXE112 which already comes with some preinstalled demo tables. When you start the installer you are asked for a password. I entered "xxx" as password. (not used in production) My server runs on the machine 192.168.1.158 On the server you must explicitely allow access for the process TNSLSNR.exe in the Windows Firewall. This process listens on port 1521. OPTION A: For C# (.NET2 or .NET4) you can download ODAC11, from which you have to add Oracle.DataAccess.dll to your project. Additionally this DLL depends on: OraOps11w.dll, oci.dll, oraociei11.dll (130MB!), msvcr80.dll. These DLLs must be in the same directory as the EXE or you must specify the DLL path in: HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.112.4.0\DllPath. On 64 bit machines write additionally to HKLM\SOFTWARE\Wow6432Node\Oracle\... OPTION B: If you have downloaded ODAC12 you need Oracle.DataAccess.dll, OraOps12w.dll, oci.dll, oraociei12.dll (160MB!), oraons.dll, msvcr100.dll. The Registry path is HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.121.2.0\DllPath OPTION C: If you don't want huge DLL's of more than 100 MB you should download ODP.NET_Managed12.x.x.x.xxxxx.zip in which you find Oracle.ManagedDataAccess.dll which is only 4 MB and is a pure managed DLL which works in 32 bit and 64 bit processes as well and depends on no other DLL and does not require any registry entries. The following C# code works for me without any configuration on the server side (just the default installation):

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是可选的。你也可以把它放在一边。