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

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

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

🧰 Что понадобится

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

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

🔧 Установка ODBC-драйвера MySQL

Загружаем и устанавливаем 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!

🔐 Настройка доступа в MySQL

Добавляем в MySQL разрешение на работу с базой mydb для сервера Oracle:

SQL> GRANT ALL PRIVILEGES ON mydb.* TO user@oracle-srv 
-> IDENTIFIED BY 'mypassword' WITH GRANT OPTION;

🧾 Конфигурация ODBC (odbc.ini)

Настраиваем в 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 (в качестве пользователя БД MySQL в примере используется пользователь oracle и в качестве пароля значение manager):

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

📡 Настройка listener.ora

Настроим прослушиватель (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

📫 Настройка tnsnames.ora

Добавляем настройку адресной строки 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 указывает, что подключение должно выполняться через гетерогенное соединение.

⚙️ Настройка initmyodbc.ora

Создаем файл с настройками параметров инициализации при подключении через ODBC к заданному серверу. Имя файла должно иметь вид init<sid>.ora, где <sid> – имя DSN для ODBC (в нашем примере myodbc) должен находится в директории $ORACLE_HOME/hs/admin/.

#
# HS init parameters
#
HS_FDS_CONNECT_INFO = myodbc
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

🔤 Настройка кодировок (my.cnf)

Настройка кодировок. Очень важный момент. При их неправильной настройке во время выполнения запросов могут возникать различные ошибки начиная от неверного отображения данных и заканчивая ошибками вычисления всего запроса. На параметры кодировок стоит обратить внимание в odbc.ini, init.ora и файле с настройками mysqld (my.cnf):

init-connect="SET NAMES utf8"
character-set-server=utf8
collation-server=utf8_general_ci

🔗 Создание DBLink и запрос

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

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

SQL> select * from my_table@mysqlodbc;

Готово! Теперь вы можете работать с MySQL прямо из Oracle.

Close Menu