无法通过 OCI 连接到 Oracle
如果无法通过 OCI 连接到 Oracle 数据库,请尝试以下方法解决问题:
检查版本兼容性
在不同机器上安装
当 Oracle Instant Client 安装在不同的机器上时,Oracle Instant Client 和 Oracle Server 的版本可能不同。 例如,Oracle Client 19.x 可以成功连接到 Oracle Server 11.2。 但 JDBC 驱动程序的版本必须与 Oracle Instant Client 的版本相同。 否则,您将看到类似 Native library cannot be loaded 或 Incompatible version of libocijdbc 的错误。
例如,考虑以下 Oracle 设置:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
Oracle Instant Client 19.8.0.0
如果我们使用 Oracle 驱动程序 19.3.0.0,将会出现 Incompatible version of libocijdbc。 但如果我们切换到 Oracle 驱动程序 19.8.0.0,连接将会成功。 请参考以下动画。

在同一台机器上安装
当 Oracle Instant Client 安装在与 Oracle Server 相同的机器上时,JDBC 驱动程序使用本地库连接到 Oracle Server。 而这个本地库是 Oracle Server 软件的一部分。 因此,JDBC 驱动程序的版本必须与 Oracle Server 的版本相同。
汇总表
不同机器 | 同一台机器 | |
|---|---|---|
Oracle Instant Client 和 Server 的版本 | 可能不同 | 将会相同(因为 Oracle Instant Client 是 Oracle Server 软件的一部分) |
JDBC 驱动程序的版本 | 与 Oracle Instant Client 相同 | 与 Oracle Server 的版本相同 |
检查版本
要在 DataGrip 中查找 JDBC 驱动程序版本,请执行以下操作:
在 数据源和驱动程序 对话框(Ctrl+Alt+Shift+S )中,选择数据源并单击 驱动程序 列表,然后选择 转到驱动程序 以访问对话框的 驱动程序 选项卡。
在 驱动程序 选项卡中,在 驱动程序文件 面板中找到 JDBC 驱动程序版本。
有关配置驱动程序的更多信息,请参阅 为现有数据源配置 JDBC 驱动程序。
检查 Oracle Instant Client 和 Server 的版本。
文件和环境变量
要求
需要以下 OCI 包:
基础包
SQL*Plus 包
JDBC 补充包
可以从 oracle.com 上的 Oracle Instant Client 下载页面 下载适用于您的操作系统的包。
此外,还需要 oraclepki.jar 文件。 您可以从 oracle.com 上的 Oracle Database JDBC Driver & UCP 下载页面 下载它。
包含 wallet 文件的 ZIP 压缩包。 有关下载钱包的更多信息,请参阅 在 docs.oracle.com 上的 Download Client Credentials (Wallets)。
步骤 1。 检查解压的文件
从下载的包中提取的所有文件必须位于同一目录中。
找到包含解压后 Instant Client 文件的目录(例如, ~/Oracle/instantclient_19_8/ ),并确保没有文件丢失。
找到包含 Instant Client 文件的目录(例如, ~/Oracle/instantclient_19_8/ )。
确保没有文件丢失。
确保 oraclepki.jar 位于该目录中。
确保 wallet 文件位于 钱包 目录中的 网络 目录内。 wallet 文件的路径可能如下所示: ~/Oracle/instantclient_19_8/network/wallet 。

步骤 2。 (可选)检查环境变量
这是可选的。 设置环境变量后,您可以使用 sqlplus 工具连接到 Oracle 实例。 请注意,这些设置仅适用于当前命令提示符会话。
检查以下环境变量:
export ORACLE_HOME=~/Oracle/instantclient_19_8export TNS_ADMIN=$ORACLE_HOME/network/adminexport NLS_LANG=English_America.UTF8export PATH=$PATH:$ORACLE_HOMEset ORACLE_HOME=C:\Oracle\instantclient_19_8set TNS_ADMIN=%ORACLE_HOME%\network\adminset NLS_LANG=English_America.UTF8set PATH=%PATH%:%ORACLE_HOME%
步骤 3。 验证 ORA 文件配置
确保 tnsnames.ora 文件是通过以下方法组成的:
文件的位置应如下所示: <directory_with_extracted_files>/network/admin ,
directory_with_extracted_files在 步骤 1 中检查。例如, ~/Oracle/instantclient_19_8/network/admin 。
tnsnames.ora 文件应具有以下结构:
MyTNSAlias = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = db.my.domain.com)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = my_service.my.domain.com) ) )请参考以下文件示例:
# tnsnames.ora Network Configuration File: /Users/jetbrains/Oracle/instantclient_19_8/network/admin/tnsnames.ora # Generated by Oracle configuration tools. MyTNSAlias = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP) HOST = my_host.jetbrains.com) (PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = datagrip.jetbrains.com) ) ) AnotherAlias = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP) (HOST = another_host.jetbrains.com) (PORT = 1521))
tnsnames.ora 和 sqlnet.ora 文件包含在一个包含 wallet 文件的 ZIP 压缩包中。 有关下载钱包的更多信息,请参阅 在 docs.oracle.com 上的 Download Client Credentials (Wallets)。
文件位置应如下所示 ~/Oracle/instantclient_19_8/network/admin 。
从 admin 目录中打开 sqlnet.ora 文件,并确保
DIRECTORY属性的值是 wallet 的路径。 在我们的案例中,路径如下所示:WALLET_LOCATION = (SOURCE = (METHOD = file) (METHOD_DATA = (DIRECTORY="/Users/jetbrains/Oracle/instantclient_19_8/network/wallet"))) SSL_SERVER_DN_MATCH=yes请参考以下 admin 目录和配置文件的截图。
