Social Icons

17 de dez de 2013

Criando Database Link para acessar MySQL no Oracle Database


ATUALIZADO EM 19/6/18


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.


ROTEIRO PASSO-A-PASSO


Pré-requisitos: Ter instalado o Oracle Database Gateway na mesma versão do Banco de Dados.

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
DESCRIPTION = MySQL ODBC 5.1 Driver
DATABASE      = mysql1   -- Nome do BD MySQL
PORT               = 3306  -- Porta do servidor MySQL
SERVER          = 10.1.1.1  --  Endereço IP do Servidor MySQL
UID                  = usu_teste  -- Nome do usuário do BD MySQL
PWD                = pwd_teste  -- Senha do usuário do BD MySQL
SOCKET          = /tmp/oracle/mysql.sock
CHARSET        = latin1 -- Character set do BD MySQL

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
+-------------------------------------+
| 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 uma tabela para fazer um teste de acesso após criar o dblink.
        SQL> show tables

     Por questões de segurança você pode excluir os parâmetros UID e PWD do arquivo /etc/odbc.ini e informar os respectivos valores ao se conectar no utilitário isql, como no exemplo abaixo:         # isql oracle_mysql usu_teste pwd_teste
   
4- Configurando um arquivo de conexão para o BD orcl:
     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 ocasião se houver necessidade, e por este motivo estão comentados no conteúdo abaixo:
   
HS_FDS_CONNECT_INFO = oracle_mysql  -- Nome do conector
HS_FDS_TRACE_LEVEL = DEBUG
HS_FDS_SHAREABLE_NAME = /usr/lib64/libmyodbc5.so -- Nesta linha é importante verificar a versão do driver odbc para informar o nome correto da biblioteca do driver
#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)
       (ENVS = LD_LIBRARY_PATH=/usr/lib64:$ORACLE_HOME/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:
     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))
    )    -- 10.1.1.5 = Endereço IP do Servidor Oracle
    (CONNECT_DATA =
        (SID =  oracle_mysql))   -- 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

11 comentários:

  1. Olá Fabio!

    Preciso 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

    ResponderExcluir
    Respostas
    1. 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.
      []s

      Excluir
    2. Usa uma ferramenta de ETL, com o Pentaho isso é uma tarefa trivial de tão fácil.

      Excluir
  2. ola fabio ! este eh o erro que esta dar qdo eu testo a connectividade no oracle , podes me ajudar?
    Error Testing Database Link.
    ORA-12154: TNS:could not resolve the connect identifier specified

    ResponderExcluir
    Respostas
    1. É 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.
      []s

      Excluir
  3. tinhas razao, havia um erro no arquivo tnsnames.ora, fiz o teste localmente funcionou,thanks fabio .

    ResponderExcluir
  4. ola fabio, se encontrares uma forma de fazer o inverso nao esqueca de partilhar com o pessoal . thanks

    ResponderExcluir
    Respostas
    1. Ok, não tive a necessidade de fazer o inverso, por isso não pesquisei sobre o assunto.

      Excluir
  5. Fábio, obrigado pelo tutorial, me ajudou muito.
    Parabéns.

    ResponderExcluir

 

Suporte remoto alunos

Seguidores

Meu One Drive (antigo Sky Drive)