文章目录
-
- [一、`DPI-1047` 错误](#一、
DPI-1047错误) -
- [1. 安装 Oracle 客户端库](#1. 安装 Oracle 客户端库)
-
- [1.1 下载 Oracle Instant Client](#1.1 下载 Oracle Instant Client)
- [1.2 安装 Oracle Instant Client](#1.2 安装 Oracle Instant Client)
- [1.3 设置环境变量](#1.3 设置环境变量)
- [1.4 测试连接](#1.4 测试连接)
- [2. 安装 cx_Oracle](#2. 安装 cx_Oracle)
- [3. 重启程序](#3. 重启程序)
- [4. 查看链接错误](#4. 查看链接错误)
- [二、 依赖问题](#二、 依赖问题)
-
- [1. 确认 Oracle Instant Client 安装位置](#1. 确认 Oracle Instant Client 安装位置)
- [二、 在线配置 `LD_LIBRARY_PATH`](#二、 在线配置
LD_LIBRARY_PATH) -
- [3. 检查 `cx_Oracle` 和 Oracle Instant Client 版本兼容性](#3. 检查
cx_Oracle和 Oracle Instant Client 版本兼容性) - [4. 安装 `oracle-instantclient` 包(如果是使用 apt 包管理器)](#4. 安装
oracle-instantclient包(如果是使用 apt 包管理器)) - [5. 检查连接字符串](#5. 检查连接字符串)
- [6. 重启你的 Python 程序](#6. 重启你的 Python 程序)
- [3. 检查 `cx_Oracle` 和 Oracle Instant Client 版本兼容性](#3. 检查
- 三、离线配置`LD_LIBRARY_PATH`
-
- [1. 下载 `.deb` 包](#1. 下载
.deb包) - [2. 将 `.deb` 包传输到目标机器](#2. 将
.deb包传输到目标机器) - [3. 使用 `dpkg` 安装](#3. 使用
dpkg安装) - [4. 确认安装](#4. 确认安装)
- [5. 离线更新依赖(可选)](#5. 离线更新依赖(可选))
- [1. 下载 `.deb` 包](#1. 下载
- 四、离线版本问题
- [一、`DPI-1047` 错误](#一、
一、DPI-1047 错误
Linux 系统上缺少 Oracle 客户端库文件 (libclntsh.so),这是 Oracle 数据库连接所必需的。
为了解决这个问题,你可以按照以下步骤操作:
1. 安装 Oracle 客户端库
首先,你需要安装适用于你的系统架构的 Oracle 客户端。你可以从 Oracle 官方下载 Oracle Instant Client。以下是安装步骤:
1.1 下载 Oracle Instant Client
访问 Oracle Instant Client 下载页面 并下载适合你操作系统的 64 位客户端库。
- 选择
Oracle Instant Client for Linux x86-64。 - 下载包含
basic和sqlplus的包。basic包含最基本的客户端库,而sqlplus包含 SQL*Plus 工具。
1.2 安装 Oracle Instant Client
下载后,解压文件并设置环境变量。以下是操作步骤:
bash
# 例如,将 Oracle Instant Client 解压到 /opt/oracle/ 目录下
cd /opt/oracle
unzip /path/to/instantclient-basic-linux.x64-*.zip
unzip /path/to/instantclient-sqlplus-linux.x64-*.zip
1.3 设置环境变量
在 .bashrc 或 .bash_profile 文件中设置 Oracle 客户端库的路径:
bash
# 添加以下内容到 ~/.bashrc 或 ~/.bash_profile
export ORACLE_HOME=/opt/oracle/instantclient_19_8
export LD_LIBRARY_PATH=$ORACLE_HOME:$LD_LIBRARY_PATH
然后执行以下命令让更改生效:
bash
source ~/.bashrc
1.4 测试连接
确认 Oracle 客户端库已经正确安装并且可以被找到。你可以通过运行以下命令来验证是否能够加载 Oracle 客户端库:
bash
ldd /opt/oracle/instantclient_19_8/libclntsh.so
这应该能够显示 libclntsh.so 文件的相关依赖。如果一切正常,系统应该能找到并加载该库文件。
2. 安装 cx_Oracle
接下来,确保 cx_Oracle 已安装并能与 Oracle 客户端库正确兼容。
如果 cx_Oracle 没有安装,可以使用 pip 安装:
bash
pip install cx_Oracle
或者,如果你已经安装了 cx_Oracle,确保其版本与 Oracle Instant Client 兼容。你可以查阅 cx_Oracle 文档 获取更多关于兼容性的信息。
3. 重启程序
重新启动你的 Python 程序,它应该能够找到 Oracle 客户端库并成功连接。
4. 查看链接错误
如果还有其他错误,请查看是否有 libclntsh.so 或其他共享库的链接问题。
你可以使用以下命令来查看缺失的库:
bash
ldd /path/to/python # 确保链接到正确的 Oracle 客户端库
应该帮助你找到潜在的链接问题。
通过这些步骤,应该能解决 DPI-1047 错误并正常连接 Oracle 数据库。
二、 依赖问题
bash
cx_Oracle.DatabaseError: DPI-1047: Cannot locate a 64-bit Oracle Client library: "/opt/oracle/instantclient_21_20/lib/libclntsh.so: cannot open shared object file
从错误信息来看,cx_Oracle 试图使用 Oracle 客户端库时,出现了缺少文件的错误。错误信息表明它无法找到 Oracle 客户端库 libclntsh.so。尽管你可能已经安装了 Oracle Instant Client,但这个问题通常是因为库文件没有被正确地配置到系统的环境变量中。你可以尝试以下几个步骤来解决这个问题:
1. 确认 Oracle Instant Client 安装位置
首先确保你已经安装了 Oracle Instant Client,并且它的版本是 64-bit。你可以在终端使用以下命令检查安装位置:
bash
ls /opt/oracle/instantclient_21_20/
如果没有找到 libclntsh.so,说明可能没有正确安装 Oracle Instant Client。
二、 在线配置 LD_LIBRARY_PATH
如果确认 Oracle Instant Client 已正确安装,下一步是确保你的系统能够找到它。你需要将其路径添加到 LD_LIBRARY_PATH 环境变量中。可以在终端执行以下命令:
bash
export LD_LIBRARY_PATH=/opt/oracle/instantclient_21_20:$LD_LIBRARY_PATH
这将临时设置库路径,确保你的系统能够找到 Oracle 客户端库。
如果希望每次启动时都生效,可以将该行命令添加到 ~/.bashrc 或 ~/.bash_profile 文件中:
bash
echo "export LD_LIBRARY_PATH=/opt/oracle/instantclient_21_20:$LD_LIBRARY_PATH" >> ~/.bashrc
source ~/.bashrc
3. 检查 cx_Oracle 和 Oracle Instant Client 版本兼容性
确保你使用的 cx_Oracle 库版本与 Oracle Instant Client 版本兼容。可以查看 cx_Oracle 的官方文档 来确认版本兼容性。如果需要,可以升级 cx_Oracle:
bash
pip install --upgrade cx_Oracle
4. 安装 oracle-instantclient 包(如果是使用 apt 包管理器)
如果你使用的是基于 Debian 或 Ubuntu 的 Linux 发行版,也可以通过包管理器安装 Oracle Instant Client:
bash
sudo apt-get install libaio1
sudo apt-get install oracle-instantclient-basic
如果你使用的是 CentOS 或 RHEL,类似的命令也适用,只需用 yum 替代 apt-get。
5. 检查连接字符串
确保你提供的连接字符串正确无误,并且没有额外的空格或格式问题。例如:
python
conn = oracle.connect('user/key@ip:port/database')
检查是否能够通过 SQL*Plus 或其他工具连接到 Oracle 数据库,确认连接信息是正确的。
6. 重启你的 Python 程序
配置完环境变量后,重新启动 Python 程序来测试更改是否生效。
如果以上步骤没有解决问题,建议检查 cx_Oracle 的安装日志或使用调试信息来进一步排查。
三、离线配置LD_LIBRARY_PATH
要离线安装 libaio1,你可以按照以下步骤操作:
1. 下载 .deb 包
首先,你需要手动下载 libaio1 的 .deb 安装包。你可以在没有互联网的机器上或者其他可以联网的机器上执行这个步骤。
- 访问 Ubuntu Packages 或其他源,查找与你的系统版本(例如 Ubuntu Jammy 版本)兼容的
libaio1包。 - 下载对应的
.deb包。比如,选择版本为0.3.112-13build1的libaio1。
下载的 .deb 文件通常会是类似以下的文件名:
bash
libaio1_0.3.112-13build1_amd64.deb
2. 将 .deb 包传输到目标机器
将你下载的 .deb 文件通过 USB 或者其他方式,传输到目标机器上,假设你将其放在 /home/user/Downloads/ 目录下。
3. 使用 dpkg 安装
在目标机器上,打开终端并切换到 .deb 包所在目录,使用 dpkg 命令安装:
bash
sudo dpkg -i /home/user/Downloads/libaio1_0.3.112-13build1_amd64.deb
如果有依赖问题,可以使用以下命令来修复:
bash
sudo apt-get install -f
这会自动安装缺失的依赖项。
4. 确认安装
完成安装后,你可以通过以下命令确认 libaio1 是否安装成功:
bash
dpkg -l | grep libaio1
如果安装成功,你将看到 libaio1 包的版本信息。
5. 离线更新依赖(可选)
如果你没有离线安装其他依赖项,并且需要通过 apt-get 完成其他离线安装,可以使用 apt 的 --download-only 选项,在有网络连接的机器上下载依赖包,然后再传输到目标机器上安装。
bash
sudo apt-get --download-only install <package_name>
这将把所有依赖包下载到 /var/cache/apt/archives/ 目录,你可以将这些包复制到目标机器并使用 dpkg 或 apt 来离线安装。
四、离线版本问题
要查看 Ubuntu 系统的版本信息,你可以使用以下命令:
-
查看 Ubuntu 版本:
bashlsb_release -a这个命令会显示包括版本号、发行代号(如 Ubuntu 20.04 LTS)、描述等详细信息。
-
查看内核版本:
bashuname -r这个命令会显示当前运行的 Linux 内核版本。
-
查看系统的其他详细信息:
bashcat /etc/os-release这个命令会显示操作系统的详细信息,包括版本、发行版名称等。
以上命令可以帮助你快速查看当前的系统版本。如果你有任何具体问题,告诉我,我可以进一步帮助解答!
ubuntu软件包下载在不同 CPU 架构下的下载项。
你应该下载哪个,取决于你现在使用的设备/操作系统的 CPU 架构。
下面是简单判断方法:
| 架构 | 适用设备/系统 |
|---|---|
| amd64 | 绝大多数 64 位桌面/笔记本 PC,Windows、Linux、Mac(Intel)都可能用这个 |
| i386 | 老旧 32 位 PC(如果你的系统是 32 位 Linux/Windows) |
| arm64 (aarch64) | 新款 ARM 设备:树莓派 4/5、华为、安卓手机、苹果 M1/M2/M3 |
| armhf | 旧款树莓派、某些低功耗 ARM 设备(32 位 ARM) |
| riscv64 | RISC-V 开发板、嵌入式系统(一般人不用) |
| ppc64el | IBM POWER/企业服务器 |
| s390x | IBM 大型机(基本只在大型企业) |
✅ 如果你是普通电脑用户,用的是 Windows/Linux 64 位 PC → 选 amd64
✅ 如果是苹果 M 系列 Mac → arm64
✅ 如果是树莓派:
- 树莓派 4/5 使用 64 位系统 → arm64
- 老款 32 位 → armhf