Olá pessoal!

Recentemente realizei uma atividade e vou compartilhar com vocês. Surgiu uma demanda para mim para estabelecer conexão entre uma base de dados Microsoft SQL Server 2000 e um Oracle 10G. Para atender à demanda foi utilizada a tecnologia “Oracle Database Gateway for MS SQL Server”.

Existem algumas formas de se configurar o link entre bases heterogêneas (bancos de dados distintos), e o que utilizei foi via ODBC (Open Database Connectivity), conforme figura 1.

Figura 1 Oracle Gateway via ODBC. (Fonte: DATADIRECT)

Vou descrever o passo a passo que realizei para configurar.

1 – Configuração de um Data Source ODBC (fonte de dados)

Primeiramente foi necessário criar um OBDC para o banco SQL Server. Esse passo envolveu outra instituição, que teve que dar permissão ao IP do servidor Oracle para acessar o servidor MS SQL Server. Além da liberação do IP, a empresa me passou um usuário e senha do banco remoto para acesso e configuração.

2 – Configuração do INIT.ORA

Após o estabelecimento de conectividade entre os bancos via ODBC, foi realizada uma configuração no servidor Oracle.

No diretório “<ORACLE_HOME>\hs\admin\ “ (vale lembrar que esse banco Oracle estava instalado em um servidor Windows Server 2003), provavelmente existe um arquivo chamado inithsodbc.ora, que poderia ter sido utilizado, mas como precisava acessar duas bases SQL Server distintas, criei outros init.ora e não alterei o inithsodbc.ora.

Criação dos arquivos .ORA:

init<SID1>.ora

# This is a sample agent init file that contains the HS parameters that are
# needed for an ODBC Agent.

# HS init parameters
HS_FDS_CONNECT_INFO = DS_ODBC_SQLSERVER1
HS_FDS_TRACE_LEVEL = off

# Environment variables required for the non-Oracle system
#set <envvar>=<value>

init<SID2>.ora

# This is a sample agent init file that contains the HS parameters that are
# needed for an ODBC Agent.

# HS init parameters
HS_FDS_CONNECT_INFO = DS_ODBC_SQLSERVER2
HS_FDS_TRACE_LEVEL = off

# Environment variables required for the non-Oracle system
#set <envvar>=<value>

Existem outros parâmetros que podem ser configurados nesse arquivo, a alteração de apenas esses atende a minha necessidade. O parâmetro HS_FDS_CONNECT_INFO está setado para o data source ODBC que criamos anteriormente no passo 1.

É importante saber que o nome do arquivo deve ser iniciado com “init”, e que o SID1 e SID2  serão “interpretados” pela configuração do TNSNAMES.ORA e LISTENER.ORA., então merecem um cuidado especial.

3 – Criação/alteração de LISTENER.ORA

No diretório “<ORACLE_HOME >\network\admin\” foi necessária uma alteração no arquivo LISTENER.ORA. No meu caso, criei um listener dedicado para esse serviço, para não impactar nos demais.

As alterações foram as listadas abaixo:

(...)
SID_LIST_LISTENERHS =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = SID1)
      (ORACLE_HOME = <ORACLE_HOME> )
      (PROGRAM = hsodbc)
    )
    (SID_DESC =
      (SID_NAME = SID2)
      (ORACLE_HOME = <ORACLE_HOME> )
      (PROGRAM = hsodbc)
    )
  )
(...)
LISTENERHS =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = <xxxxxx IP_HOST_ORACLE xxxxx>)(PORT = 1522))
    )
  )
(...)

Foi criado um listener chamado “LISTENERHS” em outra porta: 1522. Atentar para a lista de serviços que o listener vai atender (SID_LIST_LISTENERHS), lá consta o SID1 e SID2, ambos referenciando o programa HSODBC.

Para startar o lisntener novo, utilize o comando:
lsnrctl start LISTENERHS

Se houver necessidade, seguem os comandos para verificar o status e parar o listener.
lsnrctl status LISTENERHS
lsnrctl stop LISTENERHS

4 – Alteração no TNSNAMES.ORA

No diretório “<ORACLE_HOME >\network\admin\”, deve ser alterado o arquivo TNSNAMES.ORA, para acresentar os novos acessos aos bancos SQL Server.

HS_ODBC _SID1 =
   (DESCRIPTION =
     (ADDRESS_LIST =
       (ADDRESS = (PROTOCOL = TCP)(HOST = <xxxxxx IP_HOST_ORACLE xxxxx>)(PORT = 1522))
     )
    (CONNECT_DATA =
       (SID = SID1)
     )
     (HS=OK)
   )

HS_ODBC_SID2 =
   (DESCRIPTION =
     (ADDRESS_LIST =
       (ADDRESS = (PROTOCOL = TCP)(HOST = <xxxxxx IP_HOST_ORACLE xxxxx>)(PORT = 1522))
     )
    (CONNECT_DATA =
       (SID = SID2)
     )
     (HS=OK)
   )

5 – Criação do DBLINK no Oracle Database

Foram criados dois dblinks privados em um schema do Oracle que irá gerenciar (receber e tratar) as informações do MS SQL Server.

CREATE DATABASE LINK "BDLINK_SID1"
 CONNECT TO "<user_bd_sqlserver_1>"
 IDENTIFIED BY "<pass_bd_sqlserver_1>"
 USING ’ HS_ODBC_SID2';

CREATE DATABASE LINK " BDLINK_SID2"
 CONNECT TO "<user_bd_sqlserver_2>"
 IDENTIFIED BY "<pass_bd_sqlserver_2>"
 USING ‘HS_ODBC_SID2’;

Lembrando que para os dblinks no Oracle, foram criados com os mesmos usuário/senha que foi configurado na fonte de dados ODBC, e o tns usado (USING) o que foi configurado no arquivo TNSNAMES.ORA.

Pronto!

Agora é só testar:

select * from tabela_sqlserverSID1@DBLINK_SID1;
e
select * from tabela_sqlserverSID2@DBLINK_SID2;

Bom, pessoal...

É isso!

Espero ter ajudado no entendimento da configuração usada por mim para resolver uma demanda de “comunicação” entre bancos heterogêneos: Oracle 10g e MS SQL Server 2000.

Até a próxima!

Referências:

ORACLE - Configuring Oracle Database Gateway for ODBC. Disponível em: http://docs.oracle.com/cd/B28359_01/gateways.111/b31043/configodbc.htm. Acessado em: 21/08/2013.

ORACLE - Oracle Database Gateway. Installation and Configuration Guide. 11g Release 1 (11.1) for Microsoft Windows. Disponível em: http://docs.oracle.com/cd/B28359_01/gateways.111/b31043.pdf. Acessado em: 20/08/2013.

BURLESON CONSULTING - Creating Multiple Listeners Tips. Disponível em http://www.dba-oracle.com/t_configure_multiple_listeners.htm. Acessado em:21/08/2013.

DATADIRECT - Connect for ODBC with Oracle database. Gateway for ODBC (DG4ODBC). Disponível em: http://www.datadirect.com/resources/odbc/oracle-database-gateway/index.html. Acessado: 21/08/2013.