cx_Oracle.DatabaseError: DPI-1047: 64-bit Oracle Client library cannot be loaded: 解決方案

ODPI-C安裝

要在您本身的項目中使用ODPI-C,請從GitHub下載其源代碼。若是您但願將ODPI-C構建爲共享庫,則會提供示例Makefile。不然,將ODPI-C源代碼添加到項目中。在Windows上,須要Visual Studio 2008或更高版本。在macOS上,須要Xcode 6或更高版本。在Linux上,須要GCC 4.4或更高版本。html

使用ODPI-C的項目須要安裝Oracle客戶端庫。這些庫提供必要的網絡鏈接,容許應用程序訪問Oracle數據庫實例。它們還爲ODPI-C應用程序提供基本和高級鏈接管理和數據功能。java

最簡單的Oracle客戶端是免費的Oracle Instant Client。只須要「基本」或「基本燈」包。任何Oracle數據庫安裝或完整Oracle客戶端安裝中也提供Oracle客戶端庫。linux

ODPI-C在運行時顯式加載可用的Oracle客戶端庫。這容許使用ODPI-C的代碼只構建一次,而後使用可用的Oracle Client 18,12或11.2庫運行。若是未找到Oracle客戶端庫,則會引起錯誤「DPI-1047:沒法加載Oracle客戶端庫」。git

在Windows上,首先在ODPI-C庫(或應用程序二進制文件)所在的同一目錄中查找Oracle客戶端庫。若是找不到它們,則Oracle客戶端庫目錄應包含在PATH環境變量中。github

在非Windows平臺上,若是沒有Oracle客戶端位於標準操做系統搜索路徑(例如$LD_LIBRARY_PATH)中,則 $ORACLE_HOME搜索。sql

如下各節說明如何確保在各類平臺上正確安裝和配置Oracle客戶端,以便ODPI-C可以找到它。數據庫

ODPI-C已經在Linux,Windows和macOS上進行了測試。其餘平臺也應該有效,但還沒有通過測試。windows

Oracle客戶端和Oracle數據庫互操做性

ODPI-C可使用Oracle Client 18,12或11.2庫。服務器

Oracle的標準客戶端 - 服務器網絡互操做性容許不一樣版本的Oracle客戶端和Oracle數據庫之間的鏈接。有關認證配置,請參閱Oracle Support的Doc ID 207303.1。總之,Oracle Client 18和12.2能夠鏈接到Oracle Database 11.2或更高版本。Oracle Client 12.1能夠鏈接到Oracle Database 10.2或更高版本。Oracle Client 11.2能夠鏈接到Oracle Database 9.2或更高版本。建立鏈接的技術限制可能更靈活。例如,Oracle Client 12.2能夠成功鏈接到Oracle Database 10.2。網絡

因爲單個ODPI-C二進制文件可使用多個客戶端版本並訪問多個數據庫版本,所以在您的預期發佈環境中測試應用程序很是重要。較新的Oracle客戶端支持新功能,例如12.1或更高版本客戶端可用的oraaccess.xml外部配置文件,會話池改進,18或更高版本客戶端的呼叫超時以及其餘加強功能

該函數dpiContext_getClientVersion()可用於肯定正在使用的Oracle客戶端版本,該函數 dpiConn_getServerVersion()可用於肯定鏈接正在訪問哪一個Oracle數據庫版本。而後可使用它們來相應地調整應用程序行爲。嘗試使用特定客戶端/服務器組合不支持的某些Oracle功能可能會致使運行時錯誤。這些包括:

  • 嘗試訪問當前Oracle客戶端庫不支持的屬性時,您將收到錯誤「ORA-24315:非法屬性類型」
  • 嘗試對Oracle Database 12c使用Oracle Client 11.2的隱式結果時,您將收到錯誤「ORA-29481:沒法將隱式結果返回給客戶端」
  • 嘗試使用Oracle Client 11.2獲取陣列DML行計數時,您將收到錯誤「DPI-1050:Oracle客戶端庫必須爲12.1或更高版本」

Linux的

ODPI-C須要Oracle客戶端庫,能夠在Oracle Instant Client或Oracle數據庫安裝中找到,也能夠在完整的Oracle客戶端安裝中找到。這些庫必須是32位或64位,與您的應用程序和ODPI-C庫(若是單首創建)匹配。

在Linux上,ODPI-C首先使用標準庫搜索順序搜索名爲「libclntsh.so」的。若是找不到,則會搜索「libclntsh.so.18.1」,「libclntsh.so.12.1」,而後搜索「libclntsh.so.11.1」。若是找不到庫,則$ORACLE_HOME/lib/libclntsh.so檢查。若是沒有找到庫,則返回錯誤。

Oracle Instant ClientZip¶

使用Oracle Instant Client zip文件運行ODPI-C應用程序:

  1. 下載Oracle 18,12或11.2「Basic」或「Basic Light」zip文件:64位 或32位,與您的應用程序架構相匹配。

  2. 將程序包解壓縮到應用程序可訪問的單個目錄中。例如:

    mkdir -p /opt/oracle
    cd /opt/oracle
    unzip instantclient-basic-linux.x64-12.2.0.1.0.zip

     

  3. libaio使用sudo或root用戶安裝軟件包。例如:

    sudo yum install libaio

     

    在某些Linux發行版上,會調用此包libaio1

  4. 若是計算機上沒有其餘Oracle軟件會受到影響,請將Instant Client永久添加到運行時連接路徑。例如,使用sudo或root用戶:

    sudo sh -c "echo /opt/oracle/instantclient_12_2 > /etc/ld.so.conf.d/oracle-instantclient.conf"
    sudo ldconfig

    或者,將環境變量設置LD_LIBRARY_PATH爲Instant Client版本的相應目錄。例如:

    export LD_LIBRARY_PATH=/opt/oracle/instantclient_12_2:$LD_LIBRARY_PATH

     

  5. 若是您打算同定位可選的Oracle配置文件,如tnsnames.orasqlnet.oraoraaccess.xml與即時客戶端,而後建立一個network/admin子目錄,若是它不存在。例如:

    mkdir -p /opt/oracle/instantclient_12_2/network/admin

    這是與此Instant Client連接的應用程序的默認Oracle配置目錄。

    或者,Oracle配置文件能夠放在另外一個可訪問的目錄中。而後將環境變量 TNS_ADMIN設置爲該目錄名稱。

Oracle Instant ClientRPM¶

使用Oracle Instant Client RPM運行ODPI-C應用程序:

  1. 下載適用於您的應用程序架構的Oracle 18,12或11.2「Basic」或「Basic Light」RPM:64位 或32位

  2. 使用sudo或root用戶安裝下載的RPM。例如:

    sudo yum install oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64.rpm

    Yum會自動安裝所需的依賴項,例如libaio

  3. 若是計算機上沒有其餘Oracle軟件會受到影響,請將Instant Client永久添加到運行時連接路徑。例如,使用sudo或root用戶:

    sudo sh -c "echo /usr/lib/oracle/12.2/client64/lib > /etc/ld.so.conf.d/oracle-instantclient.conf"
    sudo ldconfig

     或者,將環境變量設置LD_LIBRARY_PATH爲Instant Client版本的相應目錄。例如:

    export LD_LIBRARY_PATH=/usr/lib/oracle/12.2/client64/lib:$LD_LIBRARY_PATH

     

  4. 若是您打算共同定位可選的Oracle配置文件,例如tnsnames.orasqlnet.oraoraaccess.xml使用Instant Client,則network/adminlib/其下建立一個子目錄 (若是它不存在)。例如:

    sudo mkdir -p /usr/lib/oracle/12.2/client64/lib/network/admin

     

    這是與此Instant Client連接的應用程序的默認Oracle配置目錄。

    或者,Oracle配置文件能夠放在另外一個可訪問的目錄中。而後將環境變量 TNS_ADMIN設置爲該目錄名稱。

本地數據庫或完整Oracle客戶端

ODPI-C應用程序可使用本地Oracle數據庫或完整Oracle客戶端安裝中的Oracle Client 18,12或11.2庫。

這些庫必須是32位或64位,與您的應用程序和ODPI-C庫(若是單首創建)匹配。

  1. 經過運行Oracle環境腳原本設置所需的Oracle環境變量。例如:

    source /usr/local/bin/oraenv

    對於Oracle Database XE 11.2,運行:

    source /u01/app/oracle/product/11.2.0/xe/bin/oracle_env.sh

     

  2. 可選的Oracle配置文件,例如tnsnames.ora, sqlnet.ora或者oraaccess.xml能夠放在其中 $ORACLE_HOME/network/admin

    或者,Oracle配置文件能夠放在另外一個可訪問的目錄中。而後將環境變量 TNS_ADMIN設置爲該目錄名稱。

窗口

ODPI-C須要Oracle客戶端庫,能夠在Oracle Instant Client或Oracle數據庫安裝中找到,也能夠在完整的Oracle客戶端安裝中找到。這些庫必須是32位或64位,與您的應用程序和ODPI-C庫(若是單首創建)匹配。

在Windows上,ODPI-C首先在包含ODPI-C庫(或應用程序)的目錄中查找Oracle客戶端庫「OCI.dll」,而後使用標準庫搜索順序進行搜索

Oracle客戶端庫須要存在正確的Visual Studio可再發行組件。

Oracle Instant ClientZip¶

使用Oracle Instant Client zip文件運行ODPI-C應用程序:

  1. 下載Oracle 18,12或11.2「Basic」或「Basic Light」zip文件:64位 或32位,與您的應用程序架構相匹配。

  2. 例如,將程序包解壓縮到應用程序可訪問的單個目錄中C:\oracle\instantclient_12_2

  3. 設置環境變量PATH以包括您在步驟2中建立的路徑。例如,在Windows 7上,PATH在控制面板 - >系統 - >高級系統設置 - >高級 - >環境變量 - >系統變量 - >路徑中更新。

  4. 若是您打算共同定位可選的Oracle配置文件,例如tnsnames.orasqlnet.oraoraaccess.xml與Instant Client,則建立network\admin子目錄(若是它不存在),例如 C:\oracle\instantclient_12_2\network\admin

    這是與此Instant Client連接的應用程序的默認Oracle配置目錄。

    或者,Oracle配置文件能夠放在另外一個可訪問的目錄中。而後將環境變量 TNS_ADMIN設置爲該目錄名稱。

若是要將Instant Client與應用程序打包在一塊兒,能夠將Instant Client庫移動到與ODPI-C庫(或應用程序)相同的目錄中。 有關所需的最小Instant Client文件集,請參閱Instant Client文檔。沒有必要設置PATH。這僅適用於Windows。

本地數據庫或完整Oracle客戶端

Oracle庫必須是32位或64位,與您的應用程序和ODPI-C庫(若是單首創建)匹配。

要使用本地Oracle數據庫(或完整Oracle客戶端)18,12或11.2安裝中的客戶端庫來運行ODPI-C應用程序:

  1. 設置環境變量PATH以包含包含OCI.dll的路徑(若是還沒有設置)。例如,在Windows 7上, PATH在控制面板 - >系統 - >高級系統設置 - >高級 - >環境變量 - >系統變量 - >路徑中更新。

  2. 可選的Oracle配置文件,例如tnsnames.ora, sqlnet.ora或者oraaccess.xml能夠放在network/adminOracle軟件的 子目錄中。

    或者,Oracle配置文件能夠放在另外一個可訪問的目錄中。而後將環境變量 TNS_ADMIN設置爲該目錄名稱。

相關文章
相關標籤/搜索