Social Icons

17 de dez de 2013

Criando Database Link para acessar MySQL no Oracle Database


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, e em um próximo artigo, mostrarei como chamar uma SP do MySQL, utilizando este dblink.

     Segue abaixo uma lista contendo todos os dados 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 da Stored Procedure do BD Mysql: SP_TESTA_DBLINK_MYSQL;
         - Nome do usuário do BD Mysql: usu_teste;
         - Senha do usuário do BD Mysql: pwd_teste.


ROTEIRO PASSO-A-PASSO

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 2 arquivos. O primeiro deverá ter o nome /etc/odbcinst.ini e conteúdo abaixo:
   
[MySQL ODBC 5.1 Driver] -- Nesta linha é necessário configurar a versão correta do driver que você instalou
Driver =  /usr/lib64/libmyodbc5.so -- Nesta linha é importante verificar a versão do driver odbc para informar o nome correto do arquivo
UsageCount =  1

     O segundo arquivo deverá ter o nome /etc/odbc.ini e o conteúdo abaixo:
   
[oracle_mysql]  -- Nome do conector
Driver               = MySQL ODBC 5.1 Driver -- Nesta linha é necessário configurar a versão correta do driver que você instalou
DATABASE      = mysql1   -- Nome do BD MySQL
PWD                = pwd_teste  -- Senha do usuário 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
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, ou seja, já temos configurado um conector que se conecta com sucesso no BD mysql1. 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
   
4- Configurando um arquivo de conexão para o BD orcl:
     Agora que já temos um conector com o nome oracle_mysql funcionando, iremos criar um arquivo de conexão que será utilizado pelo BD orcl e que irá utilizar o conector configurado no passo 2. O nome do arquivo será composto por: string init + nome do conector + entensão .ora; que neste caso, será igual a $ORACLE_HOME/hs/admin/initoracle_mysql.ora. O conteúdo deste arquivo deverá ser:
   
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_FDS_RECOVERY_ACCOUNT = RECOVER
HS_FDS_RECOVERY_PWD = RECOVER
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
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ê terá problemas. 

    Se tudo funcionou, aguarde o próximo artigo para ver como acessar uma Stored Procedure do BD MySQL a partir do dblink criado no Oracle. 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)
     - [ORACLE/MYSQL] Criando um dblink entre Oracle e MysQL
  

10 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. 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

 

Meus últimos Links Favoritos

Suporte remoto alunos

Seguidores

Meu One Drive (antigo Sky Drive)