1. 程式人生 > >cx_Oracle.DatabaseError: DPI-1047: 64-bit Oracle Client library cannot be loaded: 解決方案

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或更高版本。

使用ODPI-C的專案需要安裝Oracle客戶端庫。這些庫提供必要的網路連線,允許應用程式訪問Oracle資料庫例項。它們還為ODPI-C應用程式提供基本和高階連線管理和資料功能。

最簡單的Oracle客戶端是免費的

Oracle Instant Client。只需要“基本”或“基本燈”包。任何Oracle資料庫安裝或完整Oracle客戶端安裝中也提供Oracle客戶端庫。

ODPI-C在執行時顯式載入可用的Oracle客戶端庫。這允許使用ODPI-C的程式碼只構建一次,然後使用可用的Oracle Client 18,12或11.2庫執行。如果未找到Oracle客戶端庫,則會引發錯誤“DPI-1047:無法載入Oracle客戶端庫”。

在Windows上,首先在ODPI-C庫(或應用程式二進位制檔案)所在的同一目錄中查詢Oracle客戶端庫。如果找不到它們,則Oracle客戶端庫目錄應包含在PATH

環境變數中。

在非Windows平臺上,如果沒有Oracle客戶端位於標準作業系統搜尋路徑(例如$LD_LIBRARY_PATH)中,則 $ORACLE_HOME搜尋。

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

ODPI-C已經在Linux,Windows和macOS上進行了測試。其他平臺也應該有效,但尚未經過測試。

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設定為該目錄名稱。