Oracle em Linux acessando MySQL em Windows (Heterogêno)

Vou explicar neste artigo um pouco de redes heterogeneas em outros databases e o Oracle.
No caso irei abordar um acesso do Oracle 10g (10.2.0.5) Linux x86 para o MySQL 5.1.46 Server em Windows XP 32b.
A partir do Oracle acessar tabelas e views que estão dentro do MySQL.

heter005 150x150 Oracle em Linux acessando MySQL em Windows (Heterogêno)

Dados dos ambientes para melhor compreenção:
Oracle:
Oracle Database 10g Release 10.2.0.5.0 – Production
Enterprise Linux Enterprise Linux Server release 5.5 (Carthage)
IP: 192.168.10.70
SERVER: dbmaster.local
ORACLE_HOME=/ora01/app/oracle/product/10.2.0

MySQL:
Server version: 5.1.46-community MySQL Community Server (GPL)
Microsoft Windows XP Professional
5.1.2600 Service Pack 3 compilação 2600
IP: 192.168.10.184
SERVER: TKVM

Primeiramente vamos criar o ambiente do mysql os privilegios e estrutura dos dados no meu mysql:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| netjukebox         |
| test               |
+--------------------+
4 rows in set (0.00 sec)

mysql> create database db_rafael;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db_rafael          |
| mysql              |
| netjukebox         |
| test               |
+--------------------+
5 rows in set (0.00 sec)

mysql> create table tabela02 (campo1 int(11) not null auto_increment, campo2 char(255), primary key (campo1));
Query OK, 0 rows affected (0.03 sec)

mysql> insert into tabela02 (campo2) values ('RAFAEL STOEVER');
Query OK, 1 row affected (0.01 sec)

mysql> insert into tabela02 (campo2) values ('JOSE GALDERIO');
Query OK, 1 row affected (0.00 sec)

mysql> insert into tabela02 (campo2) values ('MARIA DAS GRACAS');
Query OK, 1 row affected (0.00 sec)

mysql> COMMIT;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from tabela02
    -> ;
+--------+------------------+
| campo1 | campo2           |
+--------+------------------+
|      1 | RAFAEL STOEVER   |
|      2 | JOSE GALDERIO    |
|      3 | MARIA DAS GRACAS |
+--------+------------------+
3 rows in set (0.00 sec)

Criarei um usuario para acesso a base remotamente do mysql:

mysql> create user 'rafael'@'localhost' identified by 'minha_senha';
Query OK, 0 rows affected (0.00 sec)

mysql> grant all privileges on db_rafael.* to 'rafael'@'192.168.10.70' identified by 'senha';
Query OK, 0 rows affected (0.00 sec)

Verificado o conteudo do mysql vamos fazer o acesso do Oracle ao MySQL Server.

No servidor Linux do Oracle:

Para acessar o MySQL precisamos primeiramente um acesso ao database pelo linux, no caso iremos usar o connector/ODBC que pode ser encontrador no link
Connector/ODBC : http://download.softagency.net/mysql/Downloads/Connector-ODBC/3.51
No caso, estou baixando o mysql-connector-odbc-3.51.28-0.i386.rpm

Ao baixar o arquivo vou instalar como root:

[root@dbmaster mysql]# rpm -Uvh  mysql-connector-odbc-3.51.28-0.i386.rpm
error: Failed dependencies:
        libltdl.so.3 is needed by mysql-connector-odbc-3.51.28-0.i386

Como estou usando o Enterprise Linux Enterprise Linux Server release 5.5 (Carthage)
Terei que colocar o CDROM de instalação e instalar o pacote dependente, no caso o libtool-ltdl

[root@dbmaster mysql]# rpm -ivh /mnt/cdrom/Server/libtool-ltdl-1.5.22-7.el5_4.i386.rpm
warning: /mnt/cdrom/Server/libtool-ltdl-1.5.22-7.el5_4.i386.rpm: Header V3 DSA signature: NOKEY, key ID 1e5e0159
Preparing...                ########################################### [100%]
   1:libtool-ltdl           ########################################### [100%]

[root@dbmaster mysql]# rpm -ivh mysql-connector-odbc-3.51.28-0.i386.rpm
Preparing...                ########################################### [100%]
   1:mysql-connector-odbc   ########################################### [100%]
[myodbc3i.c][594][INFO] Driver registered. Usage count is 1. Location "/etc"

Agora é configurar os arquivos do ODBC para acessar ao MySQL via linux:

O arquivo odbcinst.ini deve conter os dados dos Drivers, no meu caso não precisei alterar nada:

[root@dbmaster mysql]# cat /etc/odbcinst.ini
[PostgreSQL]
Description             = ODBC for PostgreSQL
Driver          = /usr/lib/libodbcpsql.so
Setup           = /usr/lib/libodbcpsqlS.so
FileUsage               = 1

[MySQL ODBC 3.51 Driver]
DRIVER          = /usr/lib/libmyodbc3.so
UsageCount              = 1

Verificando a entrada do driver [MySQL ODBC 3.51 Driver] agora vamos configurar o ODBC para acesso a minha base mysql:

[root@dbmaster mysql]# cat /etc/odbc.ini
[mysqloracle]
Driver          = MySQL ODBC 3.51 Driver
DATABASE        = db_rafael
PWD             = senha
PORT            = 3306
SERVER          = 192.168.10.184
UID             = rafael
SOCKET          = /tmp/oracle/mysql.sock

Desta forma criamos um nome para o acesso chamado mysqloracle, utilizando o drive MySQL ODBC 3.51 Driver, no database db_rafael e outros dados são para acesso como usuario, senha, ip e porta.

Feito isso podemos testar:

[root@dbmaster mysql]# isql mysqloracle -v
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL>
SQL> show tables;
+-----------------------------------------------------------------+
| Tables_in_db_rafael                                             |
+-----------------------------------------------------------------+
| tabela01                                                        |
| tabela02                                                        |
+-----------------------------------------------------------------+
SQLRowCount returns 1
1 rows fetched
SQL> select * from tabela02;
+-----------+-------------------
| campo1    | name              
+-----------+-------------------
| 1         | RAFAEL STOEVER    
| 2         | MARIA JOSEFINA    
| 3         | JOSE GALDERIO     
+-----------+-------------------
SQLRowCount returns 3
3 rows fetched

Observação importante é sobre o firewall do windows XP, ele estava habilitado e não estava liberando a porta 3306, tive que desabilitar o firewall padrão do windows para conseguir o acesso. Em muitos ambientes solicite ao seu administrador de REDES/Segurança para fazer a liberação correta da porta.

Testado com sucesso o acesso ao MySQL via ODBC connector agora vamos configurar o acesso do Oracle ao MySQL:

Como criamos um ODBC chamado mysqloracle vamos criar a entrada do acesso heterogeneo como mysqloracle para facilitar a manutenção posterior nesse acesso:

Deve então ser criado um init em $ORACLE_HOME/hs/admin/initmysqloracle.ora contendo as seguintes configurações, no meu caso somente alterei o caminho do ODBCINI que o meu ficará em /etc/odbc.ini

[oracle@dbmaster admin]$ cat $ORACLE_HOME/hs/admin/initmysqloracle.ora
HS_FDS_CONNECT_INFO = mysqloracle
HS_FDS_TRACE_LEVEL = 4
HS_FDS_SHAREABLE_NAME = /usr/lib/libodbc.so
set ODBCINI=/etc/odbc.ini

E teremos que adicionar ao listener a entrada para esse novo init fazendo acesso ao ODBC

    (SID_DESC =
        (PROGRAM = hsodbc)
        (ORACLE_HOME = /ora01/app/oracle/product/10.2.0)
        (SID_NAME = mysqloracle)
        (ENVS = LD_LIBRARY_PATH=/usr/lib:/ora01/app/oracle/product/10.2.0/lib:/lib:/usr/lib)
    )

Desta forma o meu listener.ora ficou assim:

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.70)(PORT = 1521))
      )
    )
  )


SID_LIST_LISTENER=
  (SID_LIST=
    (SID_DESC=
      (GLOBAL_DBNAME=dbmaster)
      (ORACLE_HOME=/ora01/app/oracle/product/10.2.0)
      (SID_NAME=dbmaster)
    )
    (SID_DESC =
        (PROGRAM = hsodbc)
        (ORACLE_HOME = /ora01/app/oracle/product/10.2.0)
        (SID_NAME = mysqloracle)
        (ENVS = LD_LIBRARY_PATH=/usr/lib:/ora01/app/oracle/product/10.2.0/lib:/lib:/usr/lib)
    )
  )

Adicionado o item devemos fazer um reload no listener para aplicar as alterações efetuadas:

[oracle@dbmaster admin]$ lsnrctl reload

LSNRCTL for Linux: Version 10.2.0.5.0 - Production on 13-OCT-2011 12:07:54

Copyright (c) 1991, 2010, Oracle.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.10.70)(PORT=1521)))
The command completed successfully
[oracle@dbmaster admin]$ lsnrctl status

LSNRCTL for Linux: Version 10.2.0.5.0 - Production on 13-OCT-2011 12:07:59

Copyright (c) 1991, 2010, Oracle.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=dbmaster)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 10.2.0.5.0 - Production
Start Date                13-OCT-2011 11:26:34
Uptime                    0 days 0 hr. 41 min. 25 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /ora01/app/oracle/product/10.2.0/network/admin/listener.ora
Listener Log File         /ora01/app/oracle/product/10.2.0/network/log/listener.log
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.10.70)(PORT=1521)))
Services Summary...
Service "dbmaster" has 2 instance(s).
  Instance "dbmaster", status UNKNOWN, has 1 handler(s) for this service...
  Instance "dbmaster", status READY, has 1 handler(s) for this service...
Service "dbmaster_XPT" has 1 instance(s).
  Instance "dbmaster", status READY, has 1 handler(s) for this service...
Service "mysqloracle" has 1 instance(s).
  Instance "mysqloracle", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully

Pode notar que há agora um serviço chamado mysqloracle no listener que irá fazer o acesso ao ODBC.
Caso o listener fique travado ou não consiga iniciar revise as configurações anteriores que há algum item errado.

Agora vamos fazer o acesso do Oracle ao MySQL :

Primeiramente temos que criar um ponto de acesso ORACLE, vamos adicionar ao TNSNAMES.ORA a entrada para o mysql que criamos:

MYSQL =
  (DESCRIPTION =
    (ADDRESS_LIST =
       (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.70)(PORT = 1521))
    )
    (CONNECT_DATA =
        (SID = mysqloracle))
        (HS = OK)
    )

Agora dentro do Oracle vamos criar o dblink entre os bancos:

SQL> create public database link mysqlrafael connect to "rafael" identified by "senha" using 'MYSQL';

Database link created.

E para verificar esse acesso com sucesso, select basico em uma das tabelas;

SQL> desc tabela02@mysqlrafael;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 campo1                                             NUMBER(10)
 campo2                                             CHAR(255)
    campo1 campo2
---------- ------------------------------
         1 RAFAEL STOEVER
         2 JOSE GALDERIO
         3 MARIA DAS GRACAS

FIQUE LIGADO !
Lembrando que tudo que usares no MySQL em caixa baixa “minusculo”, no Oracle deverá ser tratado como string em minusculo contendo as aspas.
Como no database link criado que o usuario é “rafael” e a senha é “senha”. Isso também vale para os campos e tabelas do mysql!

Para o Oracle 11g deve ser usado o (PROGRAM = dg4odbc)
E para 10g 64bits não há suporte hsodbc conforme feito neste artigo, desta forma deve ser comprado o Oracle Gateway para conseguir efetuar o procedimento.

Fonte: DESUPPORTED: How to Setup Generic Connectivity – HSODBC – to MySQL (Doc ID 260981.1)

%name Oracle em Linux acessando MySQL em Windows (Heterogêno)

Autor: Rafael Stoever

Bacharel em Sistema de Informação pela Uniasselvi, atualmente cursando Gerenciamento de Projetos em TI pela Pós Graduação Uniasselvi. Atuo como Analista de suporte a banco de dados – DBA pela Lumina Serviços em TI residente de Blumenau/ SC, OPN Certified Specialist, Certificado OCP 10g/11g/12c, OCE RAC10g e Linux 10g. Conhecimentos em Microsoft SqlSever, Mysql e programação web (php,asp).