2014-09-10 4 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

+0

Да, я также попробовал sudo chmod 777 Oracle.so, чтобы убедиться, что это не проблема. – Niru

+0

Что находится в строке 169 файла DynaLoader.pm? 'cat -n DynaLoader.pm | grep^169' – Warwick

ответ

2

Похоже, : Oracle.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, что хорошо, но при использовании меньше вы можете просто обновить экран, чтобы увидеть вывод find.

+0

Обновление здесь: Это был правильный ответ. Было 2 проблемы: 1) Клиент oracle правильно установился на сервере. 2) Приложение использовало устаревшую банку. Я обновил сборку и переделал. – Niru

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; 
    } 
} 
Смежные вопросы