segunda-feira, 24 de dezembro de 2012

[ORACLE/MYSQL] Criando um dblink entre Oracle e MysQL:


Passo 1:
No servidor MySQL crie um usuário com os privilégios necessários de acesso ao database que será feito o dblink:

Exemplo:
mysql> grant all privileges on db_mysql.* to 'usuario'@'192.168.%' identified by 'senha';
Query OK, 0 rows affected (0.00 sec)

Passo 2:
Instale no servidor Oracle o Connector/ODBC.
Link para download http://www.mysql.com/downloads/connector/odbc/#downloads

[root@oraserver ~]# rpm -ivh mysql-connector-odbc-5.1.11-1.rhel5.x86_64.rpm

Passo 3:
Após instalado o Connector/ODBC, vamos configura-lo:

O arquivo /etc/odbcinst.ini contém os dados dos drivers:

[root@oraserver ~]# cat /etc/odbcinst.ini
[PostgreSQL]
Description             = ODBC for PostgreSQL
Driver          = /usr/lib/libodbcpsql.so
Setup           = /usr/lib/libodbcpsqlS.so
FileUsage               = 1

[MySQL ODBC 5.1 Driver]
Driver          = /usr/lib64/libmyodbc5.so
UsageCount              = 1

Adicione a seguinte entrada no arquivo /etc/odbc.ini:

[root@oraserver ~]# cat /etc/odbc.ini
[oracle_mysql]
Driver          = MySQL ODBC 5.1 Driver
DATABASE        = db_mysql
PWD             = senha
PORT            = 3306
SERVER          = 10.145.0.181
UID             = usuario
SOCKET          = /tmp/oracle/mysql.sock
CHARSET         = latin1

Dessa forma criamos um acesso com o nome de oracle_mysql, usando o driver 'MySQL ODBC 5.1 Driver' no database db_mysql.

Passo 4:
Testando o acesso:

[root@oraserver ~]# isql oracle_mysql
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL>
SQL> show tables;
+-----------------------------------------------------------------+
| Tables_in_db_mysql                                              |
+-----------------------------------------------------------------+
| tabela01                                                        |
| tabela02                                                        |
+-----------------------------------------------------------------+
SQLRowCount returns 1
1 rows fetched
SQL> select * from tabela02;
+-----------+-------------------
| campo1    | name          
+-----------+-------------------
| 1         | RAFAEL SILVA  
| 2         | MARIA JOSEFINA  
| 3         | JOSE GALDERIO  
+-----------+-------------------
SQLRowCount returns 3
3 rows fetched

Passo 5:
Deve ser criado um 'init' no servidor Oracle em $ORACLE_HOME/hs/admin/initmysqloracle.ora com as seguintes configurações:

[oracle@oraserver admin]$ cat initmysqloracle.ora
HS_FDS_CONNECT_INFO = oracle_mysql
HS_FDS_TRACE_LEVEL = DEBUG
HS_FDS_SHAREABLE_NAME = /usr/lib64/libmyodbc5.so
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
HS_NLS_NCHAR=UCS2
set ODBCINI=/etc/odbc.ini
set SQL_MODE='ANSI_QUOTES'

Atenção aos parâmetros HS_LANGUAGE e HS_NLS_NCHAR para garantir que não haja problemas com o charset.

Link com mais detalhes sobre os parâmetros acima:
http://docs.oracle.com/cd/E18283_01/gateways.112/e12070/apd.htm#BABEFBHB

Passo 6:
Adicione ao listener uma entrada para o novo init fazendo acesso ao ODBC:

(SID_DESC =
       (PROGRAM = dg4odbc)
       (ORACLE_HOME = /u00/app/oracle/product/11.2.0)
       (SID_NAME = oracle_mysql)
       (ENVS = LD_LIBRARY_PATH=/usr/lib64:/u00/app/oracle/product/11.2.0/lib:/lib64:/usr/lib64)
    )
)


E faça um reload:

[oracle@oraserver admin]$ lsnrctl reload

Passo 7:
Adicione uma entrada no tnsnames.ora:

MYSQLORACLE =
  (DESCRIPTION =
    (ADDRESS_LIST =
       (ADDRESS = (PROTOCOL = TCP)(HOST = mysqlserver)(PORT = 1521))
    )
    (CONNECT_DATA =
        (SID =  oracle_mysql))
        (HS = OK)
    )


Passo 8:
Crie o dblink:

SQL> create public database link mysql_orcl_db connect to "usuario" identified by "senha" using 'MYSQLORACLE';

Database link created.

Teste o acesso:

SQL> desc "tabela01"@mysql_orcl_db;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 campo1                                             NUMBER(10)
 campo2                                             CHAR(255)

SQL>select * from "tabela01"@mysql_orcl_db;
    campo1 campo2
---------- ------------------------------
         1 RAFAEL STOEVER
         2 JOSE GALDERIO
         3 MARIA DAS GRACAS

Considerações:
Lembrando que tudo que usar no MySQL em  minusculo, no Oracle deverá ser tratado como string em minusculo contendo as aspas.

Para o Oracle 11g deve ser usado o (PROGRAM = dg4odbc)
E para 10g 64bits não há suporte hsodbc conforme feito neste artigo, desta forma deve ser comprado o Oracle Gateway para conseguir efetuar o procedimento.
Fonte: DESUPPORTED: How to Setup Generic Connectivity – HSODBC – to MySQL (Doc ID 260981.1)

Adaptado de:
http://www.oraclehome.com.br/2011/10/14/oracle-linux-acessando-mysql-em-windows-heterogeno/

Nenhum comentário:

Postar um comentário