libclntsh.so.12.1: не удается открыть файл с общим объектным файлом при запуске образца node-oracledb

Моя цель - подключиться к базе данных оракула на гостевой машине VMWare (OpenSuse) из Ubuntu.

На данный момент я установил только драйвер oracledb и пытался запустить приведенную программу подключения.

Шаги, которые я выполняю, приведены на странице INSTALL. Вот что я сделал до сих пор:

1) Так как у меня уже установлен node.js, я пропустил шаг 3.1.

2) Я успешно загрузил и извлек базовый и sdk, как указано в шаге 3.2.

3) Поскольку я не смог найти пакет с именем libaio но я нашел libaio1. Поэтому я установил libaio1.

4) Я сделал переменную окружения LD_LIBRARY_PATH а ее содержимое на моем ПК - /opt/oracle/instantclient.

5) Как указано на шаге 3.3; хотя это не было обязательным в моем случае; Я сделал две переменные среды: OCI_LIB_DIR с содержимым /opt/oracle/instantclient OCI_INC_DIR и OCI_INC_DIR с содержимым /opt/oracle/instantclient/sdk/include.

6) Установлен node-oracledb.

Я пытаюсь запустить пример программы подключения. Код, который я использую, находится здесь https://github.com/ishanatmuz/oracle-test. Когда я запускаю node connect.js я получаю эту ошибку.

/home/ishan/node.js/oracle-test/node_modules/oracledb/lib/oracledb.js:28
throw err;
          ^
Error: libclntsh.so.12.1: cannot open shared object file: No such file or directory
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Module.require (module.js:364:17)
    at require (module.js:380:17)
    at Object.<anonymous> (/home/ishan/node.js/oracle-test/node_modules/oracledb/lib/oracledb.js:23:15)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (modullibclntsh.so.12.1e.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Module.require (module.js:364:17)

Поскольку я еще не запускал гостевую машину VMware; Я надеялся получить ошибку относительно того, что такой экземпляр базы данных не найден. И затем только после этого запустите машину VMWare и подключитесь к базе данных внутри нее. Но вместо этого я получаю ошибку, cannot open shared object file для libclntsh.so.12.1.

Ответ 1

Моим первым подозрением будет то, что LD_LIBRARY_PATH на самом деле не установлен или не экспортирован правильно. Тройная проверка установлена, и каталог читается фактической оболочкой, которая пытается запустить узел.

export LD_LIBRARY_PATH=/opt/oracle/instantclient_12_2

Вы должны сделать это в любой оболочке, которая запускает Node.js.

Я также проверил, какие другие библиотеки Oracle установлены на машине, и убедился, что у вас нет конфликтов.

Использование ldconfig для глобальной установки пути почти наверняка будет проще, чем установка LD_LIBRARY_PATH. Вы можете сделать что-то вроде:

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

Подробнее см. Инструкции по установке Instant Client.

Если у вас есть дополнительные файлы конфигурации Net, такие как sqlnet.ora или tnsnames.ora, они могут быть помещены в каталог /opt/oracle/instantclient_12_2/network/admin который является местоположением по умолчанию для файлов конфигурации. См. Дополнительную конфигурацию Oracle Net.

Обновление: если вы устанавливаете RPM-пакеты Instant Client 19.3, шаг ldconfig выполняется автоматически. (Вам все еще нужно/можно/нужно сделать это для установки файла ZIP размером 19,3)

Ответ 2

экспорт работает только для одного процесса. Кажется, он не присутствует в вашем окне терминала (это отдельный процесс). Итак, перед запуском node connect.js (в том же окне терминала, где вы собираетесь запускать узел), вы должны выполнить следующую команду:

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