8 Replies Latest reply on Mar 20, 2019 10:57 PM by L. Fernigrini

    Crear database link de Oracle 12cR2 a SQL Server 2017

    Amin Chavarria

      Hola,

       

      Cómo crear un database link de Oracle Database 12.2.0.1 a un SQL Server 2017?

        • 1. Re: Crear database link de Oracle 12cR2 a SQL Server 2017
          L. Fernigrini

          El primer paso es instalar y configurar un Database Gateway. Podes optar por la versión ODBC (que utiliza drivers ODBC para establecer la comunicación) la cual no requiere licencia adicional si ya hay una licencia de Oracle Database, o bien directamente el Gateway para SQL Server (que establece una conexión nativa contra SQL Server pero requiere una licencia adicional, bastante cara de por si).

           

          Una vez instalado y configurado el Gateway, se crea un DBLINK como si fuera a otra base de datos Oracle, solo que el mismo apunta al Gateway en vez de una DB Oracle.

           

          El gateway se puede instalar en el mismo equipo que la DB Oracle que lo va a "consumir", en el mismo equipo donde se encuentra la DB SQL Server, o en un tercer equipo.

           

          Con el Gateway ODBC, la comunicación es básicamente así:

          [DB Oracle]  <-- Protocolo de comunicación Oracle --> [Gateway] <-- Lenguaje ODBC --> [Driver ODBC de SQL Server] <-- Protocolo de Comunicación SQL Server --> [DB SQL Server]

           

          Con el Gateway de SQL Server, es así (mas eficiente, pero requiere $$$$):

          [DB Oracle]  <-- Protocolo de comunicación Oracle --> [Gateway] <-- Protocolo de Comunicación SQL Server --> [DB SQL Server]

           

          Yo he utilizado el Gateway de ODBC para comunicarme con bases SQL Server, MySQL, PostgreSQL, Informix, archivos de Excel, etc. etc sin problemas.

           

          La documentacion oficial esta disponible aqui:

          https://docs.oracle.com/en/database/oracle/oracle-database/18/gmswn/index.html

          https://docs.oracle.com/en/database/oracle/oracle-database/18/odbcu/toc.htm

          • 2. Re: Crear database link de Oracle 12cR2 a SQL Server 2017
            Amin Chavarria

            Hola  L. Fernigrini,

             

            Gracias por la respuesta, una pregunta el Oracle Database Gateway requiere licencia?

             

            saludos

            • 3. Re: Crear database link de Oracle 12cR2 a SQL Server 2017
              L. Fernigrini

              Básicamente todos los productos de Oracle requieren algún tipo de licencia, en algunos casos la misma no implica un costo (como APEX o la edición XE de la base de datos).

               

              Sin ser un experto en temas de licenciamiento, te puedo comentar que si ya posees una licencia de base de datos Oracle, la misma incluye la licencia de uso del Gateway ODBC. Si querés utilizar cualquier otro Gateway (para SQL Server u cualquier otro Gateway no genérico) hay que adquirir una licencia particular para los mismos.

               

              Es por ello que en todos los proyectos de migración (de Informix, SQL Server o PostgreSQL a Oracle) en los que participé y en varios proyectos de integración de datos utilizamos la version ODBC, que si bien no es tan eficiente y performante como las versiones específicas de los Gateways, funciona sin mayores problemas y no implica un costo adicional.

              • 4. Re: Crear database link de Oracle 12cR2 a SQL Server 2017
                Amin Chavarria

                Ya lo he instalado pero me pide configurar un nuevo LISTENER es necesario crearlo o puedo utilizar el que ya tengo?,

                 

                Otra cosa que me doy cuenta es que el ORACLE_HOME\hs\admin del gateway ya existe en mi ORACLE_HOME de la base de datos , mi pregunta es, cuando instalé los binarios de la BD igual instaló algo del gateway ODBC y ya no es necesario instalar el Oracle Gateway por a parte?

                 

                 

                ORACLE_HOME gateway software is installed

                ORACLE_HOME=D:\app\tg\product\12.2.0\tghome_1

                 

                ORACLE_HOME RDBMS software is installed

                D:\app\oracle\product\12.2.0\db_1\hs\admin

                 

                 

                Independiente de las preguntas anteriores, he configurado mi datasource ODBC System DSN, agregado las entradas en mi archivos sqlnet.ora, tnsnames.ora reiniciado el listener y creación del archivo de parámetro iniLNK_ILS.ora (ORACLE_HOME\hs\admin) pero me muestra el siguiente error:

                 

                 

                Link Name   : "LNK_ILS"

                Error: ORA-28545: error diagnosticado por Net8 al conectar a un agente

                Unable to retrieve text of NETWORK/NCR message 65535

                ORA-02063: 2 lines precediendo a LNK_ILS

                 

                Qué me falta configurar?

                • 5. Re: Crear database link de Oracle 12cR2 a SQL Server 2017
                  L. Fernigrini

                  Hasta la version 9i, el Gateway se instalaba como un adicional a un Oracle Home de una instalación de DB existente, por eso es que todavía quedan dentro del Oracle Home de la base de datos carpetas de HS.

                   

                  Lo importante es que la configuración  del Gateway se haga en su propio Oracle Home. Hace tiempo que no instalo uno de 12c en el mismo servidor que la DB, por lo que no te puedo asegurar que se pueda usar el mismo Listener, yo lo configuraria por separado para estar seguro.

                   

                  El archivo "iniLNK_ILS.ora" y la configuracion del listener tendrias que hacerlo en el Oracle Home del Gateway, el cambio en el TNSNAMES en el Oracle Home de la DB.

                   

                  Si podes compartir los mismos (no los adjuntes, pega el contenido) mañana los reviso y veo si encuentro algo raro.

                  • 6. Re: Crear database link de Oracle 12cR2 a SQL Server 2017
                    Amin Chavarria

                    Hola Fernigrini,

                     

                    Perdón por la demora pero he enfermado estos días.

                     

                    Seguí la nota 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)

                    Te comento que he instalado Oracle Database 12cR2 con ASM, por lo tanto se creo el LISTENER bajo el GRID_HOME, siguiendo la nota de oracle anterior, he configurado cosas en el GRID_HOME y ORACLE_HOME pero no se si eso es correcto, te copio el contenido de mis archivos de configuración, el ODBC System DSN lo cree en su versión 64bit y el test de conexión funciona OK hacia SQL Server 2017.

                     

                    Pasos según la nota Doc ID 1266572.1

                    0) ODBC SYSTEM DSN  => Paso OK con test de conexión OK a SQL Server

                    1) listener (in the ORACLE_HOME where the gateway software is installed)  => GRID_HOME   D:\app\12.2.0\grid\hs

                    2) tnsnames (in the ORACLE_HOME where the Oracle database software is installed)  => ORACLE_HOME  D:\app\oracle\product\12.2.0\db_1\network\admin

                    3) init<SID>.ora of the hs subsystem (in the ORACLE_HOME where the gateway software is installed)  ¿ en donde configurar GRID_HOME u ORACLE_HOME , ya que ambos tienes el directorio $GRID_HOME/hs  $ORACLE_HOME/hs

                    4) Oracle database => Se crea database link pero cuando se utiliza es cuanto muestra el error

                    Error: ORA-28545: error diagnosticado por Net8 al conectar a un agente

                    Unable to retrieve text of NETWORK/NCR message 65535

                    ORA-02063: 2 lines precediendo a LNK_ILS

                     

                    --System DSN

                    Microsoft SQL Server ODBC Driver Version 10.00.14393

                    Data Source Name: ils

                    Data Source Description: ils

                    Server: svr-sqlserver

                    Database: ILS

                    Language: (Default)

                    Translate Character Data: Yes

                    Log Long Running Queries: No

                    Log Driver Statistics: No

                    Use Regional Settings: No

                    Prepared Statements Option: Drop temporary procedures on disconnect

                    Use Failover Server: No

                    Use ANSI Quoted Identifiers: Yes

                    Use ANSI Null, Paddings and Warnings: Yes

                    Data Encryption: No

                     

                    Microsoft SQL Server ODBC Driver Version 10.00.14393

                    Running connectivity tests...

                    Attempting connection

                    Connection established

                    Verifying option settings

                    Disconnecting from server

                    TESTS COMPLETED SUCCESSFULLY!

                     

                     

                     

                     

                    --initLNK_ILS.ora

                    # This is a sample agent init file that contains the HS parameters that are

                    # needed for the Database Gateway for ODBC

                     

                    HS_FDS_CONNECT_INFO=LNK_ILS

                    HS_FDS_TRACE_LEVEL=off

                     

                     

                    --listener.ora

                    SID_LIST_LSNR1525 =

                      (SID_DESC =

                        (ORACLE_HOME = D:\app\oracle\product\12.2.0\db_1)

                        (SID_NAME = ils)

                        (PROGRAM = dg4odbc)

                      )

                     

                    LSNR1525 =

                      (DESCRIPTION_LIST =

                        (DESCRIPTION =

                          (ADDRESS = (PROTOCOL = TCP)(HOST = SVR-PRODUCCION)(PORT = 1525))

                        )

                      )

                     

                    ADR_BASE_LSNR1525 = D:\app\grid

                    # ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER = ON

                    VALID_NODE_CHECKING_REGISTRATION_LISTENER = SUBNET

                    ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LSNR1525=ON # line added by Agent

                    VALID_NODE_CHECKING_REGISTRATION_LSNR1525=SUBNET # line added by Agent

                     

                     

                    --tnsnames.ora

                    ..

                    LNK_ILS =

                      (DESCRIPTION =

                        (ADDRESS_LIST =

                          (ADDRESS = (PROTOCOL = TCP)(HOST = LOCALHOST)(PORT = 1525))

                        )

                        (CONNECT_DATA =

                          (SID = ils)

                        )

                        (HS = OK)

                      )

                     

                    -- LISTENER STATUS

                     

                    D:\app\12.2.0\grid\bin>lsnrctl status LSNR1525

                     

                    LSNRCTL for 64-bit Windows: Version 12.2.0.1.0 - Production on 20-MAR-2019 13:40:04

                    Copyright (c) 1991, 2016, Oracle.  All rights reserved.

                    Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=SVR-PRODUCCION)(PORT=1525)))

                    STATUS of the LISTENER

                    ------------------------

                    Alias                     LSNR1525

                    Version                   TNSLSNR for 64-bit Windows: Version 12.2.0.1.0 - Production

                    Start Date                16-MAR-2019 03:29:32

                    Uptime                    4 days 10 hr. 10 min. 35 sec

                    Trace Level               off

                    Security                  ON: Local OS Authentication

                    SNMP                      OFF

                    Listener Parameter File   D:\app\12.2.0\grid\network\admin\listener.ora

                    Listener Log File         D:\app\grid\diag\tnslsnr\SVR-PRODUCCION\lsnr1525\alert\log.xml

                    Listening Endpoints Summary...

                      (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=SVR-PRODUCCION)(PORT=1525)))

                      (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.150.x.x)(PORT=1525)))

                      (DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=SVR-PRODUCCION)(PORT=5500))(Security=(my_wallet_directory=D:\APP\ORACLE\admin\callcenter\xdb_wallet))(Presentation=HTTP)(Session=RAW))

                    Services Summary...

                    Service "+ASM" has 1 instance(s).

                      Instance "+asm", status READY, has 1 handler(s) for this service...

                    Service "+ASM_DATA" has 1 instance(s).

                      Instance "+asm", status READY, has 1 handler(s) for this service...

                    Service "+ASM_FRA" has 1 instance(s).

                      Instance "+asm", status READY, has 1 handler(s) for this service...

                    Service "+ASM_REDO1" has 1 instance(s).

                      Instance "+asm", status READY, has 1 handler(s) for this service...

                    Service "+ASM_REDO2" has 1 instance(s).

                      Instance "+asm", status READY, has 1 handler(s) for this service...

                    Service "callcenter" has 1 instance(s).

                      Instance "callcenter", status READY, has 1 handler(s) for this service...

                    Service "callcenterXDB" has 1 instance(s).

                      Instance "callcenter", status READY, has 1 handler(s) for this service...

                    Service "ils" has 1 instance(s).

                      Instance "ils", status UNKNOWN, has 1 handler(s) for this service...

                    The command completed successfully

                     

                     

                    -- CREAR EL DB LINK

                     

                    SQL> CREATE PUBLIC DATABASE LINK LNK_ILS CONNECT TO "sa" IDENTIFIED BY "*****pre" USING 'LNK_ILS';

                    Database link created.

                     

                    SQL> select 1 from dual@lnk_ils;

                    select 1 from dual@lnk_ils

                                       *

                    ERROR at line 1:

                    ORA-28545: error diagnosed by Net8 when connecting to an agent

                    Unable to retrieve text of NETWORK/NCR message 65535

                    ORA-02063: preceding 2 lines from LNK_ILS

                     

                    -- fin

                    • 7. Re: Crear database link de Oracle 12cR2 a SQL Server 2017
                      Amin Chavarria

                      Se realiza un tnsping y todo OK

                       

                      C:\Users\admindb>tnsping lnk_ils

                      TNS Ping Utility for 64-bit Windows: Version 12.2.0.1.0 - Production on 20-MAR-2019 13:45:16

                      Copyright (c) 1997, 2016, Oracle.  All rights reserved.

                      Used parameter files:

                      D:\app\oracle\product\12.2.0\db_1\network\admin\sqlnet.ora

                      Used TNSNAMES adapter to resolve the alias

                      Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = LOCALHOST)(PORT = 1525))) (CONNECT_DATA = (SID = ils)) (HS = OK))

                      OK (0 msec)

                      • 8. Re: Crear database link de Oracle 12cR2 a SQL Server 2017
                        L. Fernigrini

                        Me parece que el problema esta en la configuracion del Listener.

                         

                        El listener cuando recibe un pedido de conexión ejecuta el programa del Gateway (dg4odbc), y por como esta configurado espera encontrarlo en "(ORACLE_HOME = D:\app\oracle\product\12.2.0\db_1)" el cual es el dela DB,  por lo que a mi entender hay dos opciones:

                         

                        1) La que uso siempre, que es configurar la conexion al Gateway en el listener del Gateway, y en tu caso modificar el TNSNAMES para que apunte al listener del Gateway. (Yo siempre instalo el Gateway en un ORACLE_HOME propio y uso un Listener dedicado de dicho ORACLE_HOME).

                         

                        2) Una alternativa que puede funcionar y es mas sencilla es cambiar el valor del ORACLE_HOME en la configuración del Listener, para que apunte al ORACLE_HOME del Gateway en vez de al de la DB (entiendo que debería funcionar):

                         

                        --listener.ora

                        SID_LIST_LSNR1525 =

                          (SID_DESC =

                            (ORACLE_HOME = PATH_TO_GATEWAY_HOME)

                            (SID_NAME = ils)

                            (PROGRAM = dg4odbc)

                          )

                         

                        No conozco mucho (en realidad casi nada) de GRID, por lo que no se si al instalar el Gateway lo instalaste en el mismo ORACLE_HOME que el GRID o si el Gateway crea su propio ORACLE_HOME, yo prefiero siempre tener cada producto por separado. En el caso en que el Gateway se haya instalado en el mismo ORACLE_HOME que el GRID, entonces iría el path del GRID, si no iría el path del ORACLE_HOME que se creó durante la instalación del Gateway. Acordate de reiniciar el Listener luego de hacer el cambio.

                         

                         

                        Respecto al TNSPING, el mismo solo prueba la conexión desde el cliente al Listener, y que el Listener conozca el servicio al que se debe ejecutar, pero no realiza una conexion al servicio, por lo que en este caso es claro que desde la DB llegás sin problema al Listener y que el mismo sabe que hay un servicio ILS, pero no llega a probar establecer una conexion (para lo cual debe ejecutar dg4obc) porque no es lo que hace el TNSPING.

                         

                        Espero haber sido claro, cualquier duda seguimos probando y que la respuesta sea útil!