Можно ли с помощью распределенных транзакций получать и передавать данные между СУБД Oracle и СУБД MySQL? Можно! Для этого в Oracle существует сервис гетерогенных (или разнородных) подключений – Heterogeneous Service. И не только с MySQL, но и с другими популярными базами данных.
Для этого нам понадобится:
- Сервер MySQL:
HOSTNAME: mysql-srv
DATABASE: mydb - Сервер Oracle:
HOSTNAME: oracle-srv
DATABASE: orcl - Драйвер ODBC для сервера с СУБД Oracle.
Процесс настройки для разных ОС отличается только в способе установки ODBC драйвера, расположении конфигурационных файлов и точном названии библиотек.
- Загружаем и устанавливаем 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 разрешение на работу с базой mydb для сервера Oracle:
SQL> GRANT ALL PRIVILEGES ON mydb.* TO user@oracle-srv -> IDENTIFIED BY 'mypassword' WITH GRANT OPTION;
- Настраиваем в 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) для поддержки соединения с 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
- Добавляем настройку адресной строки 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 указывает, что подключение должно выполняться через гетерогенное соединение.
- Создаем файл с настройками параметров инициализации при подключении через 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
- Настройка кодировок. Очень важный момент. При их неправильной настройке во время выполнения запросов могут возникать различные ошибки начиная от неверного отображения данных и заканчивая ошибками вычисления всего запроса. На параметры кодировок стоит обратить внимание в 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;