2014-09-10 43 views
2

我得到這個異常:無法加載oracle.so

Can't load '/usr/perl/lib/site_perl/5.8/x86_64-linux/auto/DBD/Oracle/Oracle.so' for module DBD::Oracle: libclntsh.so.8.0: cannot open shared object file: 
No such file or directory at 
/.../perl/lib/5.8/x86_64-linux/DynaLoader.pm line 169 

如果我做LS -ltr /.../perl/lib/site_perl/5.8/x86_64-linux/auto/DBD/ Oracle/Oracle.so我看到該文件在那裏。我正在運行的進程在嘗試連接之前也設置了LD_LIBRARY_PATH。在另一臺機器上構建和部署不會產生相同的錯誤並運行良好。運行uname -sm在兩臺機器上都提供Linux x86_64。是否還有其他可能導致此錯誤的內容?

+1

是文件的權限上相同兩臺機器? – Warwick 2014-09-11 00:35:30

+0

是的,我也試過sudo chmod 777 Oracle.so只是爲了確保它不是問題。 – Niru 2014-09-11 06:30:01

+0

DynaLoader.pm文件的第169行是什麼? 'cat -n DynaLoader.pm | grep^169' – Warwick 2014-09-11 06:41:23

回答

2

它看起來像DBD::OracleOracle.so正試圖打開libclntsh.so.8.0並找不到它。所以你需要找出是否安裝了該共享庫的版本。

執行以下命令:

$ locate libclntsh.so 

你應該得到的文件與libclntsh.so開頭的列表。如果幸運的話,libclntsh.so.8.0將成爲結果之一,然後您需要確保它所在的目錄位於加載路徑上。比如我的服務器有:

$ locate libclntsh.so 
/home/oracle/11.2/lib/libclntsh.so 
/home/oracle/11.2/lib/libclntsh.so.10.1 
/home/oracle/11.2/lib/libclntsh.so.11.1 

如果locate完全失敗,你可以使用updatedb建立數據庫,或者你可以嘗試使用find

find/-name 'libclntsh.so*' -print 

使用尋呼機或重定向標準錯誤,因爲你在一個文件可能最終會處理來自find的很多錯誤消息,這是可以的,但使用less將允許您刷新屏幕以查看find的輸出。

+0

正在更新:這是正確的答案。有兩個問題: 1)oracle客戶端確實在服務器上正確安裝。 2)該應用程序正在使用過時的jar。我更新了構建並重新部署了.. – Niru 2015-05-07 17:30:53

1

另一種解決方案:
只是通過你的Oracle路徑變量在運行任何腳本之前: 類似於Perl,你可以在下面的腳本的開頭就加上:

BEGIN { 
    my $ORACLE_HOME  = "/usr/lib/oracle/11.2/client64"; 
    my $LD_LIBRARY_PATH = "$ORACLE_HOME/lib"; 
    if ($ENV{ORACLE_HOME} ne $ORACLE_HOME 
    || $ENV{LD_LIBRARY_PATH} ne $LD_LIBRARY_PATH 
    ) { 
     $ENV{ORACLE_HOME}  = "/usr/lib/oracle/11.2/client64"; 
     $ENV{LD_LIBRARY_PATH} = "$ORACLE_HOME/lib"; 
     exec { $^X } $^X, $0, @ARGV; 
    } 
}