27.02.2016 2 min to read

Настройка соединения СУБД Oracle с MySQL через ODBC

Category : Статьи

Можно ли с помощью распределенных транзакций получать и передавать данные между СУБД Oracle и СУБД MySQL? Можно! Для этого в Oracle существует сервис гетерогенных (или разнородных) подключений – Heterogeneous Service. И не только с MySQL, но и с другими популярными базами данных.

Для этого нам понадобится:

  1. Сервер MySQL:
    HOSTNAME: mysql-srv
    DATABASE: mydb
  2. Сервер Oracle:
    HOSTNAME: oracle-srv
    DATABASE: orcl
  3. Драйвер ODBC для сервера с СУБД Oracle.

Процесс настройки для разных ОС отличается только в способе установки ODBC драйвера, расположении конфигурационных файлов и точном названии библиотек.

  1. Загружаем и устанавливаем ODBC connector mysql-connector-odbc-x.x.x. Это можно сделать вручную, загрузив с сайта соответствующий архив или инсталляционный файл. Или воспользоваться системным установщиком библиотек. В большинстве linux-систем драйвер можно установить через yum.
    [root@oracle-srv ~]# yum install mysql-connector-odbc64
    Loaded plugins: product-id, rhnplugin, security, subscription-manager
    This system is registered to Red Hat Subscription Management, but is not receiving updates. You can use subscription-manager to assign subscriptions.
    This system is receiving updates from RHN Classic or RHN Satellite.
    Setting up Install Process
    Resolving Dependencies
    --> Running transaction check
    ---> Package mysql-connector-odbc64.x86_64 0:5.1.8-1.el5 set to be updated
    --> Processing Dependency: libodbcinst.so.2()(64bit) for package: mysql-connector-odbc64
    --> Running transaction check
    ---> Package unixODBC64-libs.x86_64 0:2.2.14-3.el5 set to be updated
    --> Finished Dependency Resolution
    
    Dependencies Resolved
    
    ================================================================================
    Package Arch Version Repository Size
    ================================================================================
    Installing:
    mysql-connector-odbc64 x86_64 5.1.8-1.el5 rhel-x86_64-server-5 138 k
    Installing for dependencies:
    unixODBC64-libs x86_64 2.2.14-3.el5 rhel-x86_64-server-5 331 k
    
    Transaction Summary
    ================================================================================
    Install 2 Package(s)
    Upgrade 0 Package(s)
    
    Total download size: 469 k
    Is this ok [y/N]: y
    Downloading Packages:
    (1/2): mysql-connector-odbc64-5.1.8-1.el5.x86_64.rpm | 138 kB 00:00
    (2/2): unixODBC64-libs-2.2.14-3.el5.x86_64.rpm | 331 kB 00:00
    --------------------------------------------------------------------------------
    Total 97 kB/s | 469 kB 00:04
    Running rpm_check_debug
    Running Transaction Test
    Finished Transaction Test
    Transaction Test Succeeded
    Running Transaction
    Installing : unixODBC64-libs 1/2
    Installing : mysql-connector-odbc64 2/2
    
    Installed:
    mysql-connector-odbc64.x86_64 0:5.1.8-1.el5
    
    Dependency Installed:
    unixODBC64-libs.x86_64 0:2.2.14-3.el5
    
    Complete!

     

  2. Добавляем в MySQL разрешение на работу с базой mydb для сервера Oracle:
    SQL> GRANT ALL PRIVILEGES ON mydb.* TO user@oracle-srv
    -> IDENTIFIED BY 'mypassword' WITH GRANT OPTION;

     

  3. Настраиваем в ODBC значение DSN для соединения с MySQL. В ОС Windows это можно сделать соответствующей программой настройки: Configuration and Migration Tools/Microsoft ODBC Administration. В Unix-подобных системах настройки вносятся в файл odbc.ini, обычно расположенный в /etc/odbc.ini или /etc/local/odbc.ini.
    [myodbc]
    Driver = /usr/lib64/libmyodbc5.so
    Description = MySQL ODBC 5.xx Driver DSN
    SERVER = mysql-srv
    PORT = 3306
    USER = user
    Password = mypassword
    Database = mydb
    CHARSET = utf8
    QUOTEDID = YES
    OPTION = 3
    SOCKET =

     

    Протестируем настройку ODBC:

    [oracle@oracle-srv ~]# isql myodbc oracle manager -v
    +---------------------------------------+
    | Connected! |
    | |
    | sql-statement |
    | help [tablename] |
    | quit |
    | |
    +---------------------------------------+

     

  4. Настроим прослушиватель (listener) для поддержки соединения с MySQL по DSN, который мы определили для ODBC. В примере конфигурации, приведенном далее, в качестве $ORACLE_HOME взята директория /oracle/app/oracle/product/11.2.0/db_1. Файл $ORACLE_HOME/network/admin/listener.ora:
    LISTENER =
        (DESCRIPTION_LIST =
            (DESCRIPTION =
                (ADDRESS = (PROTOCOL = TCP)(HOST = oracle-srv)(PORT = 1521))
                (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
            )
        )
    
    
    SID_LIST_LISTENER =
        (SID_LIST =
            (SID_DESC =
                (PROGRAM = dg4odbc)
                (ENVS = "LD_LIBRARY_PATH=/oracle/app/oracle/product/11.2.0/db_1/bin")
                (SID_NAME = myodbc)
                (ORACLE_HOME = /oracle/app/oracle/product/11.2.0/db_1)
            )
        )
    
    ADR_BASE_LISTENER = /oracle/app/oracle

     

    После изменения настроек прослушивателя не забываем его перезапустить:

    [oracle@oracle-srv ~]# lsnrctl stop
    [oracle@oracle-srv ~]# lsnrctl start

     

  5. Добавляем настройку адресной строки TNS для подключения из Oracle. Файл $ORACLE_HOME/network/admin/tnsnames.ora:
    ODBC4MYSQL =
        (DESCRIPTION =
            (ADDRESS_LIST =
                (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
            )
            (CONNECT_DATA =
                (SID = myodbc)
            )
            (HS = OK)
        )

     

    Параметр HS = OK указывает, что подключение должно выполняться через гетерогенное соединение.

  6. Создаем файл с настройками параметров инициализации при подключении через ODBC к заданному серверу. Имя файла должно иметь вид init<sid>.ora, где <sid> – имя DSN для ODBC (в нашем примере myodbc) должен находится в директории $ORACLE_HOME/hs/admin/.
    #
    # HS init parameters
    #
    HS_FDS_CONNECT_INFO = mac
    HS_FDS_TRACE_LEVEL = off
    HS_FDS_SHAREABLE_NAME = /usr/lib64/libodbc.so
    
    
    HS_NLS_NCHAR = UCS2
    HS_NLS_LANGUAGE = AMERICAN_AMERICA.WE8ISO8859P15
    
    #
    # ODBC specific environment variables
    #
    set ODBCINI=/etc/odbc.ini
    set ODBCSYSINI=/etc

     

  7. Настройка кодировок. Очень важный момент. При их неправильной настройке во время выполнения запросов могут возникать различные ошибки начиная от неверного отображения данных и заканчивая ошибками вычисления всего запроса. На параметры кодировок стоит обратить внимание в odbc.ini, init<sid>.ora и файле с настройками mysqld (my.cnf):
    init-connect="SET NAMES utf8"
    character-set-server=utf8
    collation-server=utf8_general_ci

     

Соединение настроено. Теперь устанавливаем соединение с Oracle, создаем Database Link и выполняем команды SQL режиме распределенной транзакции.

SQL> CREATE DATABASE LINK MYSQLODBC
CONNECT TO "user"
IDENTIFIED BY mypassword
USING 'odbc4mysql';

SQL> select * from my_table@mysqlodbc;