數據庫錯誤: DPI-1047: Cannot locate a 64-bit Oracle Client library: "libclntsh.so: cannot open shared object file: No such file or directory". See https://oracle.github.io/odpi/doc/installation.html#linux for help
這個錯誤表明 Python 程序無法找到 Oracle 的 64 位客戶端庫 (libclntsh.so
)。以下是完整的解決方案:
完整解決方案(Linux 環境)
1. 安裝 Oracle Instant Client(推薦方式)
(1) 下載 Oracle Instant Client Basic 包
從 Oracle 官網下載?19c?或?21c?版本的 Basic 包:
bash
# 進入下載目錄(如 /opt/oracle) sudo mkdir -p /opt/oracle cd /opt/oracle# 下載 Basic 包(示例為 19.19 版本) wget https://download.oracle.com/otn_software/linux/instantclient/199000/instantclient-basic-linux.x64-19.9.0.0.0dbru.zip# 解壓 sudo unzip instantclient-basic-linux.x64-19.9.0.0.0dbru.zip
如果?
wget
?報錯,可手動從?Oracle 官網?下載并上傳到服務器。
(2) 設置環境變量
bash
# 臨時生效(當前會話) export LD_LIBRARY_PATH=/opt/oracle/instantclient_19_9# 永久生效(寫入 ~/.bashrc 或 /etc/profile) echo 'export LD_LIBRARY_PATH=/opt/oracle/instantclient_19_9' >> ~/.bashrc source ~/.bashrc
(3) 創建符號鏈接(關鍵步驟!)
bash
sudo ln -s /opt/oracle/instantclient_19_9/libclntsh.so.19.1 /usr/lib/libclntsh.so
sudo yum install libnsl
2. 驗證是否生效
bash
# 檢查庫文件是否存在 ls -l /opt/oracle/instantclient_19_9/libclntsh.so*# 檢查環境變量 echo $LD_LIBRARY_PATH# 測試 Python 是否能導入 cx_Oracle python3 -c "import cx_Oracle; print('Success')"
如果沒有報錯,說明配置成功!
3. 在你的 Python 代碼中強制指定 Oracle 客戶端路徑
如果仍然報錯,可以在代碼中顯式指定 Oracle 客戶端路徑:
python
import cx_Oracle# 手動指定 Oracle 客戶端路徑 cx_Oracle.init_oracle_client(lib_dir="/opt/oracle/instantclient_19_9")# 然后正常連接數據庫 conn = cx_Oracle.connect("DB_MON/db_mon@rpt2.fastfish.com.cn:1521/orcl")
4. 其他可能的問題
(1) 32 位 vs 64 位不匹配
-
確保 Python 和 Oracle Instant Client 都是?64 位:
bash
# 檢查 Python 位數 python3 -c "import sys; print(sys.maxsize > 2**32)"
-
輸出?
True
?表示 64 位 Python。
-
-
檢查 Oracle Instant Client 位數:
bash
file /opt/oracle/instantclient_19_9/libclntsh.so
-
應顯示?
ELF 64-bit
。
-
(2) 缺少?libaio
?依賴
bash
# CentOS/RHEL sudo yum install libaio# Ubuntu/Debian sudo apt-get install libaio1
(3) 文件權限問題
確保當前用戶有權訪問 Oracle Instant Client:
bash
sudo chmod -R +r /opt/oracle/instantclient_19_9
5. 最終代碼示例
python
import cx_Oracle import os# 設置 Oracle 客戶端路徑(可選) os.environ["LD_LIBRARY_PATH"] = "/opt/oracle/instantclient_19_9"# 顯式初始化 Oracle 客戶端 cx_Oracle.init_oracle_client(lib_dir="/opt/oracle/instantclient_19_9")# 連接數據庫 try:conn = cx_Oracle.connect("DB_MON/db_mon@rpt2.fastfish.com.cn:1521/orcl")print("連接成功!")conn.close() except Exception as e:print("連接失敗:", e)
總結
問題 | 解決方案 |
---|---|
DPI-1047 ?錯誤 | 安裝 Oracle Instant Client 并設置?LD_LIBRARY_PATH |
libclntsh.so ?找不到 | 檢查路徑并創建符號鏈接 |
32/64 位不匹配 | 確保 Python 和 Oracle 客戶端都是 64 位 |
缺少?libaio | 安裝?libaio (yum install libaio ?或?apt install libaio1 ) |
權限問題 | 確保?/opt/oracle ?可讀 |
如果仍然報錯,請檢查:
-
是否下載了正確版本的 Instant Client?
-
LD_LIBRARY_PATH
?是否生效? -
是否執行了?
source ~/.bashrc
?
希望這能徹底解決問題! 🚀
方法1:直接通過命令修改(臨時生效)
bash
export LD_LIBRARY_PATH=/opt/oracle/instantclient_19_9
方法2:永久修改(編輯.bashrc文件)
-
打開.bashrc文件:
bash
nano ~/.bashrc
-
找到設置
LD_LIBRARY_PATH
的行(可能是這樣的):
bash
export LD_LIBRARY_PATH=/opt/oracle/instantclient_19_9:/opt/oracle/instantclient_19_9:
-
修改為(刪除重復路徑和結尾冒號):
bash
export LD_LIBRARY_PATH=/opt/oracle/instantclient_19_9
-
保存退出nano:
-
按?
Ctrl+O
?保存 -
按?
Enter
?確認 -
按?
Ctrl+X
?退出
-
使修改生效:
bash
source ~/.bashrc