Forum Stats

  • 3,728,034 Users
  • 2,245,522 Discussions
  • 7,853,255 Comments

Discussions

Crear database link de Oracle 12cR2 a SQL Server 2017

Amin Chavarria
Amin Chavarria Member Posts: 117 Blue Ribbon

Hola,

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

Tagged:
Amin Chavarria

Answers

  • L. Fernigrini
    L. Fernigrini Data Engineer Sr Consultant Member Posts: 3,529 Bronze Crown
    edited March 2019

    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

    Amin Chavarria
  • Amin Chavarria
    Amin Chavarria Member Posts: 117 Blue Ribbon
    edited March 2019

    Hola  L. Fernigrini,

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

    saludos

  • L. Fernigrini
    L. Fernigrini Data Engineer Sr Consultant Member Posts: 3,529 Bronze Crown
    edited March 2019

    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.

    Amin Chavarria
  • Amin Chavarria
    Amin Chavarria Member Posts: 117 Blue Ribbon
    edited March 2019

    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?

  • L. Fernigrini
    L. Fernigrini Data Engineer Sr Consultant Member Posts: 3,529 Bronze Crown
    edited March 2019

    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.

  • Amin Chavarria
    Amin Chavarria Member Posts: 117 Blue Ribbon
    edited March 2019

    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 [email protected]_ils;

    select 1 from [email protected]_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

  • Amin Chavarria
    Amin Chavarria Member Posts: 117 Blue Ribbon
    edited March 2019

    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)

  • L. Fernigrini
    L. Fernigrini Data Engineer Sr Consultant Member Posts: 3,529 Bronze Crown
    edited March 2019

    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!

  • ManuelGonzalez
    ManuelGonzalez Member Posts: 5 Blue Ribbon
    edited June 2020

    Date una pasadita por esta web www.maengora.com ahi tengo un tutorial paso a paso sobre lo que necesitas.

  • User_T8SVS
    User_T8SVS Member Posts: 0 Green Ribbon

    Una consulta: se pretende usar un DBLINK para conectar la base de datos Oracle12c a PostGreSQL ... saben si existe algún problema de Vulnerabilidades en esta solución ???

  • L. Fernigrini
    L. Fernigrini Data Engineer Sr Consultant Member Posts: 3,529 Bronze Crown

    Hola, lo ideal seria que generes una nueva consulta en vez de preguntar en una consulta ya existente! De esa forma queda mas claro el problema, así como lo hiciste es probable que lo lea gente que conoce de SQL Server (la pregunta es sobre Oracle y SQL Server) y no sobre Oracle y Postgres

    User_T8SVS
Sign In or Register to comment.