Документ создан: 30.12.2014

Связь Oracle RDBMS под linux с MS SQL Server через ODBC.

Вводные:

  • ОС — Oracle Linux Server 6.5;
  • БД — Oracle 11gR2 (11.2.0.4.0).

За основу взята статья отсюда: www.fatihacar.com. За что автору — огромное спасибо! Но ввиду того, что автор — не русскоговорящий, некоторые проблемы с локализацией пришлось решать самостоятельно. Итак, приступим:

  1. Ставим ODBC:
    yum install -y unixODBC unixODBC-devel
  2. Качаем исходники "FreeTDS" по ссылкам, которые можно получить здесь: www.freetds.org. Например, так:
    cd /tmp/
    wget ftp://ftp.freetds.org/pub/freetds/stable/freetds-stable.tgz
  3. Распаковываем архив, конфигурируем, собираем и устанавливаем:
    tar -zxf freetds-stable.tgz
    cd freetds-0.91/
    ./configure --prefix=/usr/local/freetds  --enable-msdblib --with-gnu-ld
    make
    make install
  4. Описываем соединения с MS SQL Server в файле "/usr/local/freetds/etc/freetds.conf", приведя его в примерно такой вид:
    [global]
            tds version = 5.0
            text size = 64512
    
    [MSSQLSERVER]
            host = <YOUR_HOSTNAME_OR_IP_MSSQL>
            port = 1433
            tds version = 7.0
            client charset = UTF-8
  5. В секцию "default" файла "/usr/local/freetds/etc/locales.conf" добавляем:
    language = russian
  6. Описываем DSN. Это можно выполнить двумя путями:
    • Приводим "/etc/odbc.ini" в примерно такой вид:
      [MSSQLDSN]
      Description = My MSSQLSERVER
      Driver = /usr/local/freetds/lib/libtdsodbc.so
      Servername = MSSQLSERVER
      Database = MYDB
      
      [ODBC Data Sources]
      SQLDSN=FreeTDS
    • Добавляем в "/etc/odbcinst.ini" следующую секцию:
      [MSSQL]
      Description     = ODBC for MS SQL
      Driver          = /usr/local/freetds/lib/libtdsodbc.so

      и приводим "/etc/odbc.ini" в примерно такой вид:

      [MSSQLDSN]
      Description = My MSSQLSERVER
      Driver = MSSQL
      Servername = MSSQLSERVER
      Database = MYDB
      
      [ODBC Data Sources]
      SQLDSN=FreeTDS
  7. Проверяем верность настройки ODBC с помощью команды "isql". Например, так:
    isql -v MSSQLDSN MSSQL_USERNAME MSSQL_USERNAME_PASSWORD <<EOF
    select count(*) from sys.objects;
    EOF
  8. Чтобы listener увидел DSN нужно создать файл вида "$ORACLE_HOME/hs/admin/initSID.ora", где SID — SID_NAME в listener.ora. Данный файл содержит описание связи с DSN. В нашем случае файл выглядит как "$ORACLE_HOME/hs/admin/initMSSQL_SRV1.ora" и содержит следующие строки:
    HS_FDS_CONNECT_INFO = MSSQLDSN
    HS_FDS_TRACE_LEVEL = 0
    HS_FDS_SHAREABLE_NAME = /usr/lib64/libodbc.so
    HS_NLS_NCHAR=UCS2
    set ODBCINI=/etc/odbc.ini

    В отдельных случаях, на сервере Oracle под Windows, (пока не выяснил закономерности) необходимо добавить

    HS_LANGUAGE=AMERICAN_AMERICA.UTF8

    или

    HS_LANGUAGE=RUSSIAN_RUSSIA.UTF8
  9. В файл "$ORACLE_HOME/network/admin/listener.ora" добавляем:
    SID_LIST_LISTENER =
            (SID_LIST =
    ...
                    (SID_DESC =
                            (SID_NAME = MSSQL_SRV1)
                            (PROGRAM = dg4odbc)
                            (ORACLE_HOME = /opt/oracle/product/11.2.0/dbhome_1)
                            (ENVS=LD_LIBRARY_PATH=/usr/lib64:/usr/local/freetds/lib:$ORACLE_HOME/lib)
                    )
    ...
            )
  10. В файл "$ORACLE_HOME/network/admin/tnsnames.ora" добавляем соединение, например, такое:
    MSSQL_SRV =
      (DESCRIPTION =
        (ADDRESS_LIST =
          (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
        )
        (CONNECT_DATA =(SID = MSSQL_SRV1))
        (HS = OK)
      )
  11. Перезагружаем листенер:
    lsnrctl reload
  12. Создаём database link, например, так:
    CREATE DATABASE LINK MS_DBLINK CONNECT TO MSSQL_USERNAME IDENTIFIED BY MSSQL_USERNAME_PASSWORD USING 'MSSQL_SRV';
  13. После всех вышеприведённых манипуляций должен отработать запрос:
    SELECT count(*) FROM sys.objects@MS_DBLINK;

Всё.

 
Recent changes RSS feed Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki Donate