Data

28 set, 2015

DBLink do Oracle para o MySQL

Publicidade

É comum a necessidade de integração entre diferentes SGBD para finalidades diversas, tais como relatórios, DW, iteração de sistemas secundários, entre outras. O Oracle disponibiliza um recurso chamado DBLINK que proporciona a conexão a databases remotos, sendo esses o Oracle ou NON-ORACLE. As conexões NON-ORACLE são realizadas com o auxilio do ODBC, a ideia aqui é exemplificar passo a passo como é configurado esse recurso no Oracle e também abordar os possíveis erros que venham a ocorrer e as diferenças entre o Oracle 10 e 11g.

O exemplo, a seguir, foi executado em um servidor Oracle Linux 6.5 com unix-ODBC 64bits, MySQL-ODBC 64bits e Oracle 11.2.0.4.

1. Instalação do unix-ODBC:

yum install unixODBC

2. Download do mysql-connector-odbc:

Faça o download do driver correspondente a sua distribuição Linux em: https://dev.mysql.com/downloads/connector/odbc/

odbc

3. Instalação do mysql-connector-odbc:

Trocar mysql-connector-odbc-5.3.4-1.el6.x86_64.rpm pelo arquivo correspondente:

rpm -ivh mysql-connector-odbc-5.3.4-1.el6.x86_64.rpm

4. Certifique-se que o arquivo “/etc/odbcinst.init” está com as seguintes entradas:

[MySQL ODBC 5.3 Unicode Driver]
Driver        = /usr/lib64/libmyodbc5w.so
UsageCount        = 1
 
[MySQL ODBC 5.3 ANSI Driver]
Driver        = /usr/lib64/libmyodbc5a.so
UsageCount        = 1

5. Edite o arquivo /etc/odbc.ini e inclua o seguinte conteúdo, substituindo pelo database e ip correspondente:

[mysql]
Driver      = MySQL ODBC 5.3 Unicode Driver
DATABASE    = NOME-DO-DATABASE-AQUI
DESCRIPTION = MySQL ODBC 5.3 Unicode Driver
PORT        = 3306
SERVER      = IP-DO-SERVIDOR-AQUI
CHARSET     = latin1
TRACEFILE   = /tmp/myodbc-demodsn.trc
TRACE       = OFF

6. Teste com o “isql” se a conexão ODBC está funcionando:

isql -v mysql USUARIOAQUI SENHAAQUI
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> select now() from dual;
+--------------------+
| now()              |
+--------------------+
| 2015-08-31 16:13:54|
+--------------------+
SQLRowCount returns 1
1 rows fetched

Teste a conexão e faça selects no servidor MySQL através do driver odbc com o client isql, se a conexão for efetivada assim como os comandos sem retorno de erros, poderemos seguir para a inclusão das configurações no Oracle.

7. Configuração do HS:

Crie o arquivo: $ORACLE_HOME/hs/admin/initmysql.ora

touch $ORACLE_HOME/hs/admin/initmysql.ora

Nota: O nome do arquivo é initmysql.ora onde temos initSID.ora, ou seja, o mysql será o nome do SID dessa conexão. Sendo assim, se forem criados vários DBLINKs para várias instâncias, modifique apenas a parte correspondente ao SID.

Inclua o seguinte conteúdo através do editor de sua preferência:

#
# HS init parameters
#
HS_FDS_CONNECT_INFO=mysql
HS_FDS_TRACE_LEVEL=0
HS_FDS_SHAREABLE_NAME=/usr/lib64/libodbc.so
HS_LANGUAGE=AMERICAN_AMERICA.WE8ISO8859P15
# HS_NLS_NCHAR=AL32UTF8
HS_NLS_NCHAR=UCS2
#
# ODBC specific environment variables
#
set ODBCINI = /etc/odbc.ini
set LD_LIBRARY_PATH="/u01/app/oracle/product/11.2.0.4/db_1/lib:/usr/lib:/usr/lib64/"

8. Configuração do Listener:

Edite o arquivo $ORACLE_HOME/network/admin/listener.ora e inclua o seguinte conteúdo:

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (ORACLE_HOME = /u01/app/oracle/product/11.2.0.4/db_1)
      (SID_NAME = mysql)
      (PROGRAM = dg4odbc)
      (ENVS =”LD_LIBRARY_PATH=/u01/app/oracle/product/11.2.0.4/db_1/lib:/usr/lib64:/usr/lib:$ORACLE_HOME/lib”)
    )
  )

Como destacado acima, podem ocorrer várias entradas em SID_LIST, certifique-se de incluir a entrada destaca em vermelho dentro do “SID_LIST” corretamente, de forma que os parênteses estejam correspondendo.

Dica: PROGRAM=dg4odbc funciona para as versões do Oracle 11G em diante, para o Oracle 10g (ou inferior) deve-se utilizar a configuração PROGRAM=HS, pois são binários diferentes que Oracle utiliza para realizar essa integração. Na versão do Oracle 11G o binário correspondente ao HS não existe mais.

Recarregue as configurações do LISTENER com:

lsnrctl reload
 
LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 31-AUG-2015 16:27:28
 
Copyright (c) 1991, 2013, Oracle.  All rights reserved.
 
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
The command completed successfully
 
lsnrctl status

Verique as configurações se existe a entrada correspondente:

Service "mysql" has 1 instance(s).
Instance "mysql", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully

9. Configurar entrada no TNSNAMES:

Edite o arquivo $ORACLE_HOME/network/admin/tnsnames.ora, e inclua a entrada para conexão:

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

10. Criando o DBLINK:

create public database link mysql
connect to "dblink"
identified by "dblink"
using 'MYSQL';

connect to “USUARIO” identified by “SENHA” using “ENTRADA TNSNAMES“

11. Testando o acesso:

select "campo1","campo3" from "tabela1"@mysql;

Erros: Unable to retrieve text of NETWORK/NCR message 65535 ORA-02063: preceding 2 lines from XXX

Houve algum erro ao conectar a sua instância MySQL. Verifique se os dados de conexão estão corretos (“IP”,”USUARIO”,”SENHA”) ou se existe qualquer tipo de bloqueio de firewall, rede ou qualquer outro impeditivo nessa camada.

Se houver qualquer outro erro genérico na conexão, certifique-se de que a conexão via isql está funcionando e que todos as bibliotecas que foram referenciadas nos arquivos estão corretas. Faça as validações via “ldd” para garantir que não exista nenhuma dependência pendente ou falta de PATH que impacte não não localização das dependências.

Deixe sua dúvida ou comentário aqui!