我们有一个本地运行的应用程序,我们遇到了以下错误:
ORA-12514: TNS:监听器当前不知道所请求的服务
在连接描述符中
我已经使用正确解决的tnspring测试了连接
我尝试使用SQLPlus进行连接,但失败了,出现了与上面相同的错误。我在SQLPlus中使用了以下语法:
sqlplus username/password@addressname[or host name]
我们已核实:
服务器上的TNS Listener正在运行。
服务器上的Oracle本身正在运行。
我们不知道这个环境发生了什么变化。
还有什么可以测试的吗?
以我的Linux环境为例,oracle文件在ORACLE_HOME/bin以“红色”颜色突出显示,具有如下不同的权限:
我修改了这个文件的权限如下:
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检查listener的状态。在这里,我可以看到db实例成功加载。
但是,我只能使用sqldeveloper连接,使用sqlplus命令行我得到ORA-12547: TNS失联错误。因此,这可以作为使用sqldeveloper的快速解决方案。
注意:修改权限前请备份oracle文件。
这里有很多答案,但这里有一个工作示例的代码,你可以立即复制、粘贴和测试:
对我来说,在指定正确的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是可选的。你也可以把它放在一边。
这真的应该是对Brad Rippe[1]的回答的一个评论,但是,唉,没有足够的代表性。这个回答让我走了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监听器服务(我经常使用lsnrctl stop和lsnrctl start从管理员命令窗口[或Windows Powershell],而不是服务控制面板,但两者都工作。)在那之后,我能够与人沟通。
[1]: https://stackoverflow.com/users/979521/brad-rippe