Área do cliente

DBLink do Oracle para o MySQL

banco de dados
Foto de avião vermelho com Oracle escrito em branco

[vc_row][vc_column][vc_column_text]É

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 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.[/vc_column_text][wgl_spacing spacer_size=”16px”][vc_column_text]

1 – Instalação do unix-ODBC:

[/vc_column_text][vc_column_text]

yum install unixODBC

[/vc_column_text][wgl_spacing spacer_size=”60px”][vc_column_text]

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/[/vc_column_text][wgl_spacing spacer_size=”25px”][vc_single_image image=”1550″ img_size=”full”][wgl_spacing spacer_size=”60px”][vc_column_text]

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

(trocar mysql-connector-odbc-5.3.4-1.el6.x86_64.rpm pelo arquivo correspondente)

[/vc_column_text][vc_column_text]

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

[/vc_column_text][wgl_spacing spacer_size=”60px”][vc_column_text]

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

[/vc_column_text][vc_column_text]

[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

[/vc_column_text][wgl_spacing spacer_size=”60px”][vc_column_text]

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

[/vc_column_text][vc_column_text]

[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

[/vc_column_text][wgl_spacing spacer_size=”60px”][vc_column_text]

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

[/vc_column_text][vc_column_text]

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

[/vc_column_text][vc_column_text]Teste a conexão, 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.[/vc_column_text][wgl_spacing spacer_size=”60px”][vc_column_text]

7 – Configuração do HS:

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

[/vc_column_text][vc_column_text]

touch $ORACLE_HOME/hs/admin/initmysql.ora

[/vc_column_text][wgl_spacing spacer_size=”20px”][vc_message]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.[/vc_message][vc_column_text]Inclua o seguinte conteúdo através do editor de sua preferência:[/vc_column_text][wgl_spacing spacer_size=”20px”][vc_column_text]

#
# 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/"

[/vc_column_text][wgl_spacing spacer_size=”60px”][vc_column_text]

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.[/vc_column_text][wgl_spacing spacer_size=”20px”][vc_message message_box_color=”warning” icon_fontawesome=”fas fa-highlighter”]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.[/vc_message][vc_column_text]Recarregue as configurações do LISTENER com:[/vc_column_text][wgl_spacing spacer_size=”20px”][vc_column_text]

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

[/vc_column_text][wgl_spacing spacer_size=”20px”][vc_column_text]Verifique as configurações se existe a entrada correspondente:[/vc_column_text][wgl_spacing spacer_size=”20px”][vc_column_text]

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

[/vc_column_text][wgl_spacing spacer_size=”60px”][vc_column_text]

9 – Configurar entrada no TNSNAMES:

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

[/vc_column_text][vc_column_text]

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

[/vc_column_text][wgl_spacing spacer_size=”60px”][vc_column_text]

10 – Criando o DBLINK:

[/vc_column_text][vc_column_text]

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

[/vc_column_text][vc_column_text]

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

[/vc_column_text][wgl_spacing spacer_size=”60px”][vc_column_text]

11 – Testando o acesso:

[/vc_column_text][vc_column_text]

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

[/vc_column_text][wgl_spacing spacer_size=”20px”][vc_message message_box_color=”danger” icon_fontawesome=”fas fa-exclamation”]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, e 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.[/vc_message][/vc_column][/vc_row]