Клиент Oracle на *nix системы называется instantclient и на данный момент актуальная версия клиента 12.1.0.2. Я использую в работе xubuntu x64, и, установке клиента на эту систему  посвящена эта статья. Последовательность действий, в принципе, применима к любым debian-based дистрибутивам, а в случае redhat-based еще и отсутствует пункт по конвертации пакетов, так как Oracle распространяет пакеты в rpm-формате.

    1. Устанавливаем зависимости: libaio1. Необходим для  Oracle 11g, для 10g и 12с вроде не нужен, но я не вижу большого смысла устанавливать 10g клиента, 12-й замечательно работает и с 10-ым и с 11-ым сервером. В последних версиях уже присутствует в установке.

      $ sudo apt-get install libaio1
    2. Устанавливаем средство конвертации пакетов alien

      $ sudo apt-get install alien
    3. Скачиваем с сайта Oracle: www.oracle.com/technetwork/database/features/instant-client/index.html (похоже в 12c на этой странице ссылки на скачку поломаны, так что брал здесь www.oracle.com/technetwork/database/features/instant-client/index-097480.html) необходимые пакеты в rpm-формате для вашей архитектуры. После открытия  страницы, найдите  ссылку "See Instant Client downloads for all platforms", пройдя по которой, выберите нужную архитектуру "Instant Client for Linux x86" или "Instant Client for Linux x86-64". Я скачал basic, devel и sqlplus.

    4. Переделываем rpm пакеты в deb с помощью alien:

      $ sudo alien oracle-instantclient12.1-basic-12.1.0.2.0-1.x86_64.rpm
      $ sudo alien oracle-instantclient12.1-devel-12.1.0.2.0-1.x86_64.rpm
      $ sudo alien oracle-instantclient12.1-sqlplus-12.1.0.2.0-1.x86_64.rpm
    5. Устанавливаем полученные пакеты:

      $ sudo dpkg -i oracle-instantclient12.1-basic_12.1.0.2.0-2_amd64.deb oracle-instantclient12.1-devel_12.1.0.2.0-2_amd64.deb oracle-instantclient12.1-sqlplus_12.1.0.2.0-2_amd64.deb
    6. Запускаем sqlplus и отгребаем ошибку, которую  исправить достаточно просто:

      $ sqlplus64
      sqlplus64: error while loading shared libraries: libsqlplus.so: cannot open shared object file: No such file or directory
      $ export LD_LIBRARY_PATH=/usr/lib/oracle/11.2/client64/lib:$LD_LIBRARY_PATH
    7. Теперь надо настроить подключения. Для этого создадим в домашнем каталоге файлик tnsnames.ora с похожим содержимым:

      DB1 =
        (DESCRIPTION =
          (ADDRESS_LIST =
            (ADDRESS = (PROTOCOL = TCP)(HOST = server.dom.local)(PORT = 1521))
          )
          (CONNECT_DATA =
            (SID = DB1)
            (SERVER = DEDICATED)
          )
        )
    8. Укажем клиенту на место нахождения созданного файла:
      $ export TNS_ADMIN="$HOME"
    9. Установим правильную кодировку, чтобы не лицезреть кракозябры (чтобы получать сообщения на английском установите NLS_LANG в AMERICAN_AMERICA.AL32UTF8):
      $ echo $LANG
      ru_RU.UTF-8
      $ export NLS_LANG=RUSSIAN_CIS.UTF8
      
    10. Для удобства работы установим пакет rlwrap, что позволит нам иметь историю команд в sqlplus и автодополнение вводимых команд (для этого скачайте sqlplus_completions.txt):
      $ sudo apt-get install rlwrap
      $ rlwrap -i -f ~/sqlplus_completions.txt sqlplus /nolog

    11. Я себе прописал в .bashrc алиас
      alias sql='rlwrap -i -f ~/sqlplus_completions.txt sqlplus64 /nolog'
    12. запомнить все названия таблиц, представлений тоже достаточно тяжело, поэтому наполним файл автодополнений этими словами (естественно можно/нужно отфильтровать по схеме или каким-либо другим критериям под свои нужды)
      sqlplus64 -S user/password@database <<! >>~/sqlplus_completions.txt 
      set head off pages 0 linesize 100 echo off feedback off verify off heading off
      select object_name from all_objects where object_type in ('TABLE', 'VIEW', 'PACKAGE', 'PROCEDURE', 'FUNCTION');
      !

PS: переменную LD_LIBRARY_PATH было бы неплохо задать глобально в /etc/environment, но судя по всему где-то есть баг, связанный с затиранием этой переменной. Это можно обойти следующим способом:

$ echo "/usr/lib/oracle/11.2/client64/lib" |sudo tee /etc/ld.so.conf.d/oracle.conf
$ sudo ldconfig -v |grep oracle
/usr/lib/oracle/11.2/client64/lib:

Теперь ldconfig будет знать, где ей искать динамические библиотеки для sqlplus и переменную можно не определять.

Добавить комментарий
  • Устанавливаем зависимости: libaio1...
    Похоже что в (K)ubuntu 12.10 данный модуль уже включен в дистрибутив:
    $ sudo apt-get install libaio1
    [sudo] password for xxxxx: 
    Чтение списков пакетов… Готово
    Построение дерева зависимостей 
    Чтение информации о состоянии… Готово
    Уже установлена самая новая версия libaio1.
    обновлено 0, установлено 0 новых пакетов, для удаления отмечено 0 пакетов, и 0 пакетов не обновлено.

  • Установка прошла успешно, но когда я попытался законектится к удаленному серверу, я получил такую ошибку: connection to server failed, probable Oracle Net admin error. В чем может быть проблема? Когда я поставил Oracle XE 10.2 Client все заработало с тем же tnsnames.ora. InstantClient не предназначен для удаленного коннекта?
    Для начала я бы протестировал соединение на сетевом уровне:
    $ telnet srv.example.com 1521
    если все ок, то попробовал бы соединится sqlplus, используя EZCONNECT метод:
    $ sqlplus scott/tiger@//srv.example.com:1521/db_orcl_service_name
    (работает только с service name), либо, указав напрямую настройки для сервера, не используя tnsnames.ora:
    $ sqlplus scott/tiger@"(DESCRIPTION= (ADDRESS= (PROTOCOL=TCP)(HOST=srv.example.com)(PORT=1521)) (CONNECT_DATA= (SID=dborasid) (SERVER=dedicated)))"

  • Sergey

    Жалоба

    Установка прошла успешно, но когда я попытался законектится к удаленному серверу, я получил такую ошибку: connection to server failed, probable Oracle Net admin error. В чем может быть проблема? Когда я поставил Oracle XE 10.2 Client все заработало с тем же tnsnames.ora. InstantClient не предназначен для удаленного коннекта?

  • Denys

    Жалоба

    Спасибо огромное. Это даже удобнее чем UnixODBC!

  • Спасибо за статью, Руслан. Завтра буду пробовать.