使用Oracle Instant Client进行LDAP名称查找

部分原因是由于在完整安装Oracle客户端时出现版本冲突或位数问题,我的开发团队(我是其中的一员)已经开始使用Oracle Instant Client并避免在我们的开发机器上安装大多数新项目。这个方法效果不错,甚至可以用于生产环境部署。由于我们主要使用.NET技术,所以我们使用本地客户端(带有.NET封装器),而不是Java客户端。
现在一个客户要求我们将数据库服务注册到LDAP服务器,并使用LDAP服务器进行名称查找。他们提供了正确的sqlnet.oraldap.ora文件(以及相应的加密配置文件)。特别是sqlnet.ora文件确实指定了LDAP作为查找网络服务名称的可能来源:
names.directory_path=(tnsnames,ldap)

我相信我正在使用的机器可以使用LDAP访问服务,因为我能够使用SQL Developer这个工具(它允许我直接输入LDAP信息)来实现。假设他们是正确的,那么我该如何让Instant Client识别这个配置并使用LDAP进行名称查找呢?
到目前为止,我尝试了以下方法:
我尝试将TNS_ADMIN环境变量设置为包含提供文件的目录,虽然这对于使Instant Client识别tnsnames.ora文件没有问题,但似乎还不足以让它开始查找LDAP。以下是结果(路径、用户名和密码已更改):
(以下命令恰好是Windows命令提示符,但我想在Linux上也可以类似地操作。这里看到的sqlplus也是Instant版本,与同一目录中的Instant Client二进制文件配套使用。)
C:\TEMP>SET TNS_ADMIN=C:\path\to\sqlnet\ldap\and\tnsnames\ora\files

C:\TEMP>echo %TNS_ADMIN%
C:\path\to\sqlnet\ldap\and\tnsnames\ora\files

C:\TEMP>sqlplus.exe USERNAME/PASSWORD@LOCALTNSNAME

SQL*Plus: Release 11.2.0.2.0 Production on Mon Jul 7 10:22:25 2014

Copyright (c) 1982, 2010, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Data Mining
and Real Application Testing options

SQL> exit
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Produ
With the Partitioning, Automatic Storage Management, OLAP, Data Mining
and Real Application Testing options

C:\TEMP>sqlplus.exe USERNAME/PASSWORD@LDAPTNSNAME

SQL*Plus: Release 11.2.0.2.0 Production on Mon Jul 7 10:24:21 2014

Copyright (c) 1982, 2010, Oracle.  All rights reserved.

ERROR:
ORA-12154: TNS:could not resolve the connect identifier specified

附注

有没有可以添加到这个问题的TNS、LDAP或即时客户端标签(甚至只是普通的Oracle客户端)?我找不到任何相关信息。


这是正确的可执行文件吗?"where sqlplus" - Bjarte Brandt
@BjarteBrandt 是的,当我运行where (C:\TEMP\sqlplus.exe)时,它就是我期望的那个。更具体地说,sqlplus并没有在机器上"安装"。它只是坐落在当前目录中,并且旁边有客户端二进制文件。它肯定是使用TNS_ADMIN环境变量来读取tnsnames.ora文件的,因为该文件位于一个完全不同的目录中。 - jpmc26
@BjarteBrandt 确认使用正确的客户端二进制文件,我继续运行了 where oci.dll。它也给出了预期的结果:C:\TEMP\oci.dll - jpmc26
可能是域名问题。你尝试过使用完全限定名称了吗?(dbname_or_whatever.domainname) - user953
@ik_zelf,我不太确定服务的域名是什么。LDAP服务器正在与当前计算机相同的网络中运行。另外,我已经通过SQL Developer确认该服务的名称是我期望的。(我可以直接使用SQL Developer指定所有参数,并且能够建立连接和运行查询。)你是指sqlplus USERNAME/PASSWORD@service_name.domain.something,对吗?还是我理解错了? - jpmc26
你能否发布%TNS_ADMIN%\tnsnames.ora、%TNS_ADMIN%\sqlnet.ora和%TNS_ADMIN%\ldap.ora的内容?从客户端版本10.1.0.4开始,结合LDAP使用即时客户端。 - o0x258
2@ora-600 抱歉,我忘记了这个问题。结果是配置文件本身出了问题,这些文件是由我们的客户提供的。(可能是Kerberos配置文件;我现在想不起来了。)有趣的是,我在开发环境中尝试做这个,同样在预发布环境中也很难使其正常工作,据我所知,在生产环境中它仍然无法正常工作。(我们最终使用了本地TNS名称来使应用程序正常工作。)对于项目来说,这绝对是浪费了金钱;即使在生产环境中能够正常工作,投资回报与成本相比微不足道。 - jpmc26
你能成功地使用Instant-Client进行LDAP身份验证吗?我们也成功地使用了Instant-Client,并且已经实现了Kerberos认证。但似乎只有完整的(fat)客户端才能正常工作,而不是Instant-Client。它可以在Linux和Windows上运行,但在Linux上需要使用okinit(只有完整客户端和服务器的一部分),而在Windows上也需要完整客户端才能正常工作。我们正在尝试找到一种支持Instant-Client的方法。 - ddevienne
@ddevienne 说实话,我认为LDAP用于连接字符串比它的价值更麻烦。但是没错,它在开发和阶段工作得很好。不过我无法告诉你他们改变了什么。 - jpmc26
2个回答

sqlnet.oraldap.ora文件放置在您的$ORACLE_ADMIN目录中,并确保设置环境变量。我将我的设置为TNS_ADMIN目录。
(Linux)我的.bashrc文件
export TNS_ADMIN=/opt/oracle/instantclient_12_1/network/admin
export ORACLE_ADMIN=${TNS_ADMIN}

[ku14lts:/opt/oracle/instantclient_12_1/network/admin]
$ ls
ldap.ora  sqlnet.ora  tnsnames.ora

我能够连接到不在我的tnsnames.ora文件中的数据库


使用Oracle 19c即时客户端,我发现有必要将OH/[network|/mesg]/oraus.ms[bg]文件从一个19c服务器复制到即时客户端的相同位置。
tns文件被复制以使tnsping正常工作,ldap文件被复制以使LDAP解析正常工作。
$ ls -l $(pwd)/{ldap,network}/mesg/*
-rw-r--r-- 1 oracle dba 136704 Jul 21 06:20 /opt/oracle/instantclient_19_16/ldap/mesg/ldapus.msb
-rw-r--r-- 1 oracle dba 185547 Jul 21 06:20 /opt/oracle/instantclient_19_16/ldap/mesg/ldapus.msg
-rw-r--r-- 1 oracle dba  50688 Jul 21 06:12 /opt/oracle/instantclient_19_16/network/mesg/tnsus.msb
-rw-r--r-- 1 oracle dba 259879 Jul 21 06:12 /opt/oracle/instantclient_19_16/network/mesg/tnsus.msg



$ tnsping js01

TNS Ping Utility for Linux: Version 19.0.0.0.0 - Production on 21-JUL-2023 06:26:34

Copyright (c) 1997, 2021, Oracle.  All rights reserved.

Used parameter files:
/opt/oracle/instantclient_19_16/network/admin/sqlnet.ora

Used LDAP adapter to resolve the alias
Attempting to contact (DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=ora11203fs)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=js01)))
OK (0 msec)