Как исправить: cx_Oracle.DatabaseError: DPI-1047: не удается найти 64-разрядную клиентскую библиотеку Oracle - Python

Я устанавливаю соединение с oracle 11g, который находится на удаленном сервере, используя cx_oracle 7 с python 3.6.7. моя ОС в Ubuntu 18.04

Я установил клиентскую библиотеку Oracle Instant с libclntsh.so, но не получаю ожидаемого результата.

вот код, который я использую для подключения к Oracle db

connection = cx_Oracle.connect("username/password@host/port")
print (connection.version)
connection.close()

при запуске скрипта я ожидаю получить версию подключения, вместо этого я получаю следующее сообщение об ошибке

Файл «script.py», строка 13, в соединении = cx_Oracle.connect («имя пользователя / пароль @ хост / порт») cx_Oracle.DatabaseError: DPI-1047: не удается найти 64-разрядную клиентскую библиотеку Oracle: «libclntsh.so: невозможно открыть файл общих объектов: нет такого файла или каталога ». См. https://oracle.github.io/odpi/doc/installation.html#linux за помощью


person Ian Nato    schedule 24.04.2019    source источник


Ответы (5)


После некоторого дополнительного исследования я получил решение от сообщества Ubuntu после того, как вы установили oracle Instant-client вам нужно будет интегрировать библиотеки Oracle следующим образом:

экспорт LD_LIBRARY_PATH = / usr / lib / oracle / <version> / client (64) / lib / $ {LD_LIBRARY_PATH: +: $ LD_LIBRARY_PATH}

Примером версии 12.1 для Linux x86_64 может быть:

экспорт LD_LIBRARY_PATH = / usr / lib / oracle / 12.1 / client64 / lib / $ {LD_LIBRARY_PATH: +: $ LD_LIBRARY_PATH}

где <version> указывает версию вашего мгновенного клиента oracle, например, 11.2, 12.2
Параметр подключения должен быть следующим

connection = cx_Oracle.connect("username/password@host/service_name e.g orcl")

чтобы получить прослушиватель / имя_службы, введите следующее в oracle sqlplus

SQL> show parameter local_listener

литерал под VALUE - это ваш слушатель / имя_службы.

person Ian Nato    schedule 24.04.2019
comment
Для установки Oracle Instant Client я могу посоветовать вместо этого следовать этому руководству (загрузить пакет и разархивируйте его в / opt / oracle /). Кроме того, я думаю, что лучше добавить постоянные пути - person Bruno L.; 09.02.2020
comment
Обычно лучше использовать ldconfig вместо установки LD_LIBRARY_PATH. Это рекомендуется при установке Instant Client. инструкции. - person Christopher Jones; 26.05.2021

Для сервера Ubuntu Linux 20.04 LTS у меня сработало (что может быть очевидно, но не для меня!): 1) при выполнении экспорта вам необходимо находиться в папке, в которой вы собираетесь запускать приложение / команду, подключающуюся к Oracle. from, и хотя это сработало, после закрытия SSH-терминала на сервере EC2, он снова был недоступен, что было решено путем 2) Добавьте его в ~ / .bashrc Шаги полностью:

При распаковке мгновенного клиента Oracle, например: / opt / oracle / instantclient_19_9

sudo apt-get install libaio1
cd ~/your-project-folder
export LD_LIBRARY_PATH=/opt/oracle/instantclient_19_9

Затем я добавил в ~ / .bashrc:

sudo nano ~/.bashrc

И добавьте эту строку:

export LD_LIBRARY_PATH=/opt/oracle/instantclient_19_9

И в терминале запустить:

source ~/.bashrc

Mine работал, как ожидалось, установлен на сервере EC2 под пользователем ubuntu с установленными необходимыми nvm / nodeJs.

В nodeJs пример соединения может выглядеть примерно так:

const testOracleConnection = async () => {
    let conn;

    try {
        conn = await oracledb.getConnection(oracleConfig);

        const query1 = 'select ID, anotherColumn from someTable where ID = 1111';

        const result = await conn.execute(query1);

        console.log(result);
    } catch (err) {
        console.error(err);
    } finally {
        if (conn) {
            try {
                await conn.close();
            } catch (err) {
                console.error(err);
            }
        }
    }
};
person Leigh Mathieson    schedule 04.12.2020

Я столкнулся с той же проблемой. Вот что сработало для меня:

  • Сначала я загрузил Oracle Basic zip-файл. В моем случае мне досталась 64-битная версия.
  • После этого я разархивировал его в каталог opt. Мне пришлось использовать sudo в моей системе
    $ sudo mkdir -p /opt/oracle  

    $ cd /opt/oracle  

    $ sudo unzip /opt/oracle/instantclient-basic-linux.x64-19.8.0.0.0dbru.zip  
  • Затем я установил libaio1. Обратите внимание, что я работаю с Ubuntu
    $ sudo apt-get install libaio1
  • Наконец, я добавил путь к внешней переменной LD_LIBRARY_PATH
    $ vim ~/.bashrc  
  • И добавил эту строчку в .bashrc файл
    export LD_LIBRARY_PATH=/opt/oracle/instantclient_19_8:$LD_LIBRARY_PATH  
  • После сохранения файла .bashrc я получил его:
    $ source ~/.bashrc

Затем мой скрипт Python снова заработал нормально.

См. Также cx_oracle документацию.

person Michel Mesquita    schedule 17.09.2020
comment
Если у вас нет другого программного обеспечения Oracle (и у вас есть root-доступ), я бы рекомендовал использовать ldconfig (см. Документ по установке cx_Oracle) вместо установки LD_LIBRARY_PATH. Последнее может не распространяться на ваш процесс во всех случаях, например, через веб-сервер. - person Christopher Jones; 17.09.2020
comment
Спасибо! Отличное предложение, @ChristopherJones - person Michel Mesquita; 17.09.2020

Я почти отказался от этой ошибки. Я пробовал потенциально все решения в Интернете, и ничего не работало.

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

Скрипт Python отлично работал с доступом к БД через cx_Oracle, если я выполняю его напрямую. Но когда я планирую это через crontab, я постоянно получал ошибку cx_Oracle.DatabaseError: DPI-1047

Вот исправление. Импортируйте модуль ОС и добавьте приведенный ниже код.

os.environ [ORACLE_HOME] = Ваша библиотека оракула. В моем случае это /u01/oracle/product/12.1.0.2/

person dhina karan    schedule 25.05.2021
comment
Это обычное поведение crontab. Как правило, я бы рекомендовал установить переменные среды (ORACLE_HOME, LD_LIBRARY_PATH и т.д.) в сценарии оболочки, а затем вызывать Python из этого сценария. Ваш crontab вызовет сценарий оболочки. Установка переменных среды Oracle внутри запущенных программ Python вызывает проблемы у неосторожных. Обратите внимание, что вы используете библиотеки из установки ORACLE_HOME, тогда как другие ответы на этот вопрос используют Instant Client, поэтому им не нужен набор переменных ORACLE_HOME. - person Christopher Jones; 26.05.2021

Если вы работаете с лямбда-выражениями aws для подключения к RDS / OracleDB, попробуйте этот подход с помощью Docker для автоматизации сборки для уровня лямбда-выражения aws - https://medium.com/@sabithvm/building-up-on-lambda-Layers-a4771d3b9c7

person Wilber Hernandez    schedule 25.09.2020