ATUALIZADO EM 21/5/21
Olá pessoal,
Recentemente tive que criar um database link (dblink) no Oracle Database 11G para chamar uma Stored Procedure (SP) de um BD MySQL, e tive neste processo algumas dificuldades por causa da escassez de documentações claras sobre o assunto. Para evitar que outros passem pelas mesmas dificuldades, compartilho o conhecimento adquirido neste artigo, onde vou demonstrar o processo de criação do dblink no Oracle.
Segue abaixo uma lista contendo todos os dados "fictícios" que precisaremos para criar o dblink e chamar a stored procedure acima mencionados, e por fim, um roteiro passo-a-passo para implementá-los:
- Nome do BD Oracle: orcl;
- Nome do BD MySQL: mysql1;
- Endereço IP do Servidor Oracle: 10.1.1.5;
- Endereço IP do Servidor MySQL: 10.1.1.1;
- Nome do usuário do BD Mysql: usu_teste;
- Senha do usuário do BD Mysql: pwd_teste.
- Nome do BD Oracle: orcl;
- Nome do BD MySQL: mysql1;
- Endereço IP do Servidor Oracle: 10.1.1.5;
- Endereço IP do Servidor MySQL: 10.1.1.1;
- Nome do usuário do BD Mysql: usu_teste;
- Senha do usuário do BD Mysql: pwd_teste.
ROTEIRO PASSO-A-PASSO
Pré-requisitos: Ter instalado o Oracle Database Gateway na mesma versão do Banco de Dados.É necessário instalar apenas a opção "Oracle Database Gateway for ODBC", que é free (ver mais informações no MOS Doc ID 232482.1 "Database Gateway and Generic Connectivity (DG4ODBC) Licensing Considerations"). Recomendo instalar em um Oracle Home diferente do Oracle Home do Oracle Database.
1- Instalando o conector ODBC:
O primeiro passo a ser seguido é instalar na máquina servidora do BD Oracle, um pacote contendo o Conector ODBC MySQL. Para baixar o conector mais recente acesse o link http://dev.mysql.com/downloads/connector/odbc/, selecione a plataforma do seu servidor e clique no botão download.
2- Configurando o conector ODBC:
Agora que já temos o conector ODBC instalado, precisamos configurá-lo. Para realizar este trabalho, criaremos o arquivo /etc/odbc.ini com o conteúdo abaixo: :
[oracle_mysql] -- Nome do conector
Driver = /usr/lib64/libmyodbc5.so -- Driver do conector
DATABASE = mysql1 -- Nome do BD MySQL
PORT = 3306 -- Porta do servidor MySQL
SERVER = 10.1.1.1 -- Endereço IP do Servidor MySQL
OPTION = 3
3- Testando o conector ODBC:
# isql oracle_mysql usu_teste pwd_teste
+-------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+-------------------------------------+
4- Configurando um arquivo de conexão para o BD orcl:
HS_FDS_CONNECT_INFO = oracle_mysql -- Nome do conector
HS_FDS_TRACE_LEVEL = OFF
HS_FDS_SHAREABLE_NAME = /usr/lib64/libmyodbc5.so -- Nesta linha é importante verificar a versão do driver odbc para informar o nome correto da sua biblioteca
#HS_FDS_SQLLEN_INTERPRETATION = 32
#HS_FDS_REPORT_REAL_AS_DOUBLE = TRUE
#HS_FDS_FETCH_ROWS = 1
#HS_LANGUAGE = AMERICAN_AMERICA.WE8ISO8859P1 -- Nome do character set (CS) utilizado no BD Oracle. Consulte o CS antes e altere aqui este valor, se necessário.
#HS_NLS_NCHAR=UCS2 -- Nome do national character set (NCS) utilizado no BD Oracle. Consulte o NCS antes e altere aqui este valor, se necessário.
#set ODBCINI=/etc/odbc.ini -- configura caminho do arquivo odbc.ini qdo ele for diferente do padrão
set SQL_MODE='ANSI_QUOTES'
5- Configurando o listener do BD orcl para utilizar o arquivo de conexão:
Neste passo iremos configurar o listener do BD orcl, acrescentando no arquivo listener.ora, uma entrada que permitirá se conectar ao BD mysql1, através do arquivo de conexão configurado no passo anterior:
(SID_DESC =
(PROGRAM = dg4odbc)
(ORACLE_HOME = /u00/app/oracle/product/11.2.0)
(SID_NAME = oracle_mysql)
(ENV = "LD_LIBRARY_PATH=$ORACLE_HOME/lib:$ORACLE_HOME/hs/lib:/lib64:/usr/lib64")
Driver = /usr/lib64/libmyodbc5.so -- Driver do conector
DATABASE = mysql1 -- Nome do BD MySQL
PORT = 3306 -- Porta do servidor MySQL
SERVER = 10.1.1.1 -- Endereço IP do Servidor MySQL
OPTION = 3
3- Testando o conector ODBC:
Antes de prosseguir com os próximos passos, precisamos testar o conector configurado no passo anterior, utilizando o utilitário isql no prompt de comandos do SO, como no exemplo abaixo:
# isql oracle_mysql usu_teste pwd_teste
+-------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+-------------------------------------+
Se o resultado do comando isql for parecido com o resultado acima (ver mensagem Connected), significa que a conexão ao BD MySQL está OK e que o driver está funcionando corretamente. Agora exiba uma lista das tabelas que você tem acesso no BD mysql1, executando o comando abaixo, e anote o nome de alguma tabela para fazer um teste de acesso posteriormente usando um dblink.
SQL> show tables
Agora que já sabemos que o driver está funcionando, iremos criar um arquivo de conexão que será utilizado pelo BD orcl, com o nome composto por: string init + nome do conector criado no passo 2 + entensão .ora; que neste caso, será igual a $ORACLE_HOME/hs/admin/initoracle_mysql.ora. Este arquivo poderá conter diversos parâmetros, entre os quais os 3 primeiros abaixo são fundamentais e os demais podem ser ajustados conforme a necessidade, e por este motivo estão comentados no conteúdo abaixo:
HS_FDS_TRACE_LEVEL = OFF
HS_FDS_SHAREABLE_NAME = /usr/lib64/libmyodbc5.so -- Nesta linha é importante verificar a versão do driver odbc para informar o nome correto da sua biblioteca
#HS_FDS_SQLLEN_INTERPRETATION = 32
#HS_FDS_REPORT_REAL_AS_DOUBLE = TRUE
#HS_FDS_FETCH_ROWS = 1
#HS_LANGUAGE = AMERICAN_AMERICA.WE8ISO8859P1 -- Nome do character set (CS) utilizado no BD Oracle. Consulte o CS antes e altere aqui este valor, se necessário.
#HS_NLS_NCHAR=UCS2 -- Nome do national character set (NCS) utilizado no BD Oracle. Consulte o NCS antes e altere aqui este valor, se necessário.
#set ODBCINI=/etc/odbc.ini -- configura caminho do arquivo odbc.ini qdo ele for diferente do padrão
set SQL_MODE='ANSI_QUOTES'
5- Configurando o listener do BD orcl para utilizar o arquivo de conexão:
Neste passo iremos configurar o listener do BD orcl, acrescentando no arquivo listener.ora, uma entrada que permitirá se conectar ao BD mysql1, através do arquivo de conexão configurado no passo anterior:
(SID_DESC =
(PROGRAM = dg4odbc)
(ORACLE_HOME = /u00/app/oracle/product/11.2.0)
(SID_NAME = oracle_mysql)
(ENV = "LD_LIBRARY_PATH=$ORACLE_HOME/lib:$ORACLE_HOME/hs/lib:/lib64:/usr/lib64")
)
Obs.: Substitua $ORACLE_HOME pelo caminho completo da pasta correspondente.
Depois de alterar o listener, reinicialize-o, executando o comando abaixo:
$ lsnrctl reload
6- Configurando o tnsnames da máquina do BD orcl para utilizar o arquivo de conexão:
MYSQLORACLE =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.1.5)(PORT = 1521))
) -- Endereço IP do Servidor Oracle
(CONNECT_DATA =
(SID = oracle_mysql)) -- Nome da conexão ODBC
(HS = OK)
)
7- Criando o dblink no BD orcl:
create database link mysql_orcl_db connect to "usu_teste" identified by "pwd_teste" using 'MYSQLORACLE';
Obs.: O nome do usuário e senha do BD Mysql são case sensitive e devem ser delimitados por aspas duplas.
8- Testando o dblink:
Para finalizar, faça um teste e veja se você consegue acessar alguma tabela do mysql1 a partir do dblink criado no BD orcl, executando um comando SELECT, como no exemplo abaixo:
select * from "tabela"@mysql_orcl_db; -- substitua a string tabela por um nome de tabela anotado no passo 3
- [ORACLE/MYSQL] Criando um dblink entre Oracle e MysQL
Obs.: Substitua $ORACLE_HOME pelo caminho completo da pasta correspondente.
Depois de alterar o listener, reinicialize-o, executando o comando abaixo:
$ lsnrctl reload
6- Configurando o tnsnames da máquina do BD orcl para utilizar o arquivo de conexão:
Nosso último passo antes de criar o dblink é configurar o arquivo tnsnames.ora da máquina servidora do BD orcl, incluindo uma nova entrada apontando para a conexão ODBC, como no exemplo abaixo:
MYSQLORACLE =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.1.5)(PORT = 1521))
) -- Endereço IP do Servidor Oracle
(CONNECT_DATA =
(SID = oracle_mysql)) -- Nome da conexão ODBC
(HS = OK)
)
7- Criando o dblink no BD orcl:
Conecte-se através do SQL Plus ou ferramenta similar no Oracle Database, BD orcl, com o usuário que você irá criar o dblink. É necessário que este usuário tenha o privilégio CREATE DATABASE LINK. Segue abaixo a instrução DDL que deve ser executada para criar o dblink:
create database link mysql_orcl_db connect to "usu_teste" identified by "pwd_teste" using 'MYSQLORACLE';
Obs.: O nome do usuário e senha do BD Mysql são case sensitive e devem ser delimitados por aspas duplas.
8- Testando o dblink:
Para finalizar, faça um teste e veja se você consegue acessar alguma tabela do mysql1 a partir do dblink criado no BD orcl, executando um comando SELECT, como no exemplo abaixo:
select * from "tabela"@mysql_orcl_db; -- substitua a string tabela por um nome de tabela anotado no passo 3
É importante entender que para acessar um objeto de um BD MySQL, você precisará digitar o nome da tabela em caracteres minúsculos e delimitados por aspas duplas, caso contrário você poderá ter problemas. Se você teve algum problema consulte as referências ao final do artigo ou deixe um comentário.
[]s
Referências:
- DESUPPORTED: How to Setup Generic Connectivity – HSODBC – to MySQL (Doc ID 260981.1)
- How to Configure DG4ODBC (Oracle Database Gateway for ODBC) on 64bit Windows Operating Systems to Connect to Non-Oracle Databases Post Install (Doc ID 1266572.1)- [ORACLE/MYSQL] Criando um dblink entre Oracle e MysQL
Olá Fabio!
ResponderExcluirPreciso fazer esse acesso de forma inversa (MySQL para Oracle).
Esses passos podem me ajudar em algo? Tem algum material para me indicar?
Obrigado!
Yuri Marques
Yuri, nunca precisei fazer o inverso. Por este motivo nunca pesquisei sobre o assunto e infelizmente não sei te dizer como realizar o procedimento.
Excluir[]s
Usa uma ferramenta de ETL, com o Pentaho isso é uma tarefa trivial de tão fácil.
Excluirola fabio ! este eh o erro que esta dar qdo eu testo a connectividade no oracle , podes me ajudar?
ResponderExcluirError Testing Database Link.
ORA-12154: TNS:could not resolve the connect identifier specified
É difícil te dizer exatamente o que está gerando o erro sem analisar em detalhes o que vc fez. Talvez seja alguma configuração inválida no arquivo .ini ou listener.ora.
Excluir[]s
tinhas razao, havia um erro no arquivo tnsnames.ora, fiz o teste localmente funcionou,thanks fabio .
ResponderExcluirLegal! []s
Excluirola fabio, se encontrares uma forma de fazer o inverso nao esqueca de partilhar com o pessoal . thanks
ResponderExcluirOk, não tive a necessidade de fazer o inverso, por isso não pesquisei sobre o assunto.
ExcluirFábio, obrigado pelo tutorial, me ajudou muito.
ResponderExcluirParabéns.
Obrigado pelo feedback!
ExcluirSalve mestre... estou tentando replicar essa situação mas apesar do isql conectar no banco de dados, quando tento executar um comando ele me dá segmentation fault... provavelmente pela versão do mysql no destino, que é o 8
ResponderExcluirVictor, não passei por esse problema, portanto, não sei como te ajudar neste caso... eu recorreria intensamente ao amigo google!
Excluir[]s