Oracle

Heterogeneous Services

Hace unos días me surgió la necesidad de conectar mi base de datos Oracle xe con Mysql, quería intentar procesar unos datos de una tabla Mysql para después pasarlos a otra tabla, de entrada tenia la posibilidad de hacerlo con php, ¿pero cada que necesitara procesar datos tendría que hacer una pagina php? Por eso pensé mejor en conectar Oracle con Mysql, me sería mas fácil jalar los datos de Mysql, procesarlos con PL/SQL para después depositarlos en otra tabla Mysql.

Me tope con un concepto que Oracle llama “heterogeneous services” que no es más que una vía rápida para conectarse con otras bases de datos, en este caso Mysql, aquí los pasos que seguí para lograr la conexión, es importante mencionar que esto lo logre bajo Windows:

1) Descargar el producto llamado “Mysql connector/ODBC” para Windows por supuesto e instalarlo.

2) Es necesario crear una conexión vía ODBC, la opción se llama “Orígenes de datos ODBC” esta dentro de “herramientas administrativas”, dentro existen varias opciones, es necesario crearla bajo “System DNS”, al valor de “data source name” en este caso le llame “mysqldb”, los valores servidor, usuario, password, base de datos, etc. no son mas que los usados para conectarte normalmente a Mysql, tiene una opción para probar la conexión, es preferible probar desde ahí si se logra la conexión.

3) Dentro de la estructura de archivos de Oracle ya existe una carpeta llamada “HS”, dentro de esa carpeta existen otras dos “admin” y “bin”, dentro de la carpeta admin es necesario crear un archivo init“nombre de nuestro servicio”.ora quedando: initmysqldb.ora, dentro de el deben de ir las siguientes entradas:

HS_FDS_CONNECT_INFO = mysqldb
HS_FDS_TRACE_LEVEL = 0
HS_FDS_TRACE_FILE_NAME = mysqldb.trc
HS_AUTOREGISTER = TRUE

4) Dentro de la estructura de archivos de Oracle ya existe otra carpeta llamada
“NETWORK”, dentro de ella existe otra llamada “admin”, dentro de la carpeta admin existen tres archivos, “listener.ora”, “sqlnet.ora” y “tnsnames.ora” ( ya muchos los conocerán, el tnsnames.ora se usa para configurar las conexiones a base de datos oracle cuando se esta usando el resolver nombres por tnsnames, dentro del “sqlnet.ora” se define como “names.directory_path = (TNSNAMES, HOSTNAME)” pero eso es harina de otro costal) dentro del archivo “listener.ora” debe de insertarse una nueva entrada (por supuesto la ruta del producto puede variar según tu instalación):

(SID_DESC =
      (SID_NAME = mysqldb)
      (ORACLE_HOME = C:\oraclexe\app\oracle\product\10.2.0\server)
      (PROGRAM = hsodbc)
    )

Que junto con lo que ya tenía el archivo quedaría algo como (dependiendo de tu base de datos y servicios instalados, solo añadí la primera parte del contenido de archivo, debajo de eso no se toca el contenido):

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = C:\oraclexe\app\oracle\product\10.2.0\server)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = C:\oraclexe\app\oracle\product\10.2.0\server)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (SID_NAME = mysqldb)
      (ORACLE_HOME = C:\oraclexe\app\oracle\product\10.2.0\server)
      (PROGRAM = hsodbc)
    )
  )
(…)

5) Al archivo “tnsnames.ora” se le añade una nueva entrada:

mysqldb = 
   (DESCRIPTION=
      (ADDRESS= (PROTOCOL=tcp) 
                (HOST=localhost)
                (PORT=1521)
     )
     (CONNECT_DATA = 
         (SERVICE_NAME=mysqldb)
     )
     (HS = OK)
)

6) Bajas y subes el servicio de tu base de datos, en este caso se llama
“OracleXETNSListener”, una vez levantado entras a tu sql*plus, cuando instalas xe te crea un iconito que llama “Ejecutar línea de comandos SQL” que no es mas que sql*plus ejecutado en un ambiente MSDOS, para los que tengan otra versión de Oracle entran directo a su sql*plus y creas un Database link con el siguiente comando, observa que el usuario y password lleva comillas dobles y el using lleva comillas simples:

1
2
3
4
CREATE database link mysqldb 
 CONNECT TO “usuario_mysql" 
 identified by “password_mysql" 
 using ‘mysqldb’;

Listo, ahora pueden accesar a su base de datos Mysql desde Oracle, simplemente deben referenciar que el objeto viene del dblink, o sea “tabla@mysqldb”

Es importante mencionar que esto lo logre estando tanto Oracle como Mysql en la misma maquina, he intentado conectarlos estando Mysql en otro host pero hasta el momento no han sido exitosas mis pruebas, ahí se los dejo de tarea.

33 thoughts on “Heterogeneous Services

  1. Amigo, te hago la pregunta esta configuración la puedo realizar desde un servidor linux? la eh configurado en un RHEL que es donde la necesito. te agradezco la respuesta

    1. lo configure y me presenta error.

      me dice ORA-28545: error diagnosticado por NT8 al conectar a un agente Unable to retrieve text of NETWORK/NCR message 65535
      ORA-02063: 2 lines procediendo a MYSQLDB.

      creo que esta en la configuracion del listener ya que lo tengo diferente al tuyo.

      LISTENER =
      (DESCRIPTION_LIST =
      (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = oasissrv.cajacopi.com)(PORT = 1521))
      )
      )

      ADR_BASE_LISTENER = /u01/app/oracle

      (SID_DESC =
      (SID_NAME = mysqldb)
      (ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1)
      (PROGRAM = hsodbc)
      )

  2. Hola,el tutorial esta excelente hice todo los pasos al pie de la letra pero me sale el siguiente error.

    ORA-12154: TNS:no se ha podido resolver el identificador de conexión
    especificado

  3. Hola, oye yo tengo que hacer lo mismo, para una materia de DB pero no entiendo el paso 3 a la hora de crear el archivo ‘initmysqldb.ora’ como es que lo genero, trato de hacerlo en block de notas pero nada, espero aun andes por aqui en este blog, y puedas responder a mi pregunta y ayudarme un poco GRACIAS.

  4. Hola! Me parace muy bueno tu tutorial… En mi caso he intentado conectar Oracle con Postgres y al ejecutar esto (select * from “cdestora_estu”@PGSQL), me sale este error “ORA-00942: table or view does not exist [Generic Connectivity Using ODBC]393330(0,0,1[[]]) ORA-02063: preceding 2 lines from PGSQL”

    Tengo el archivo initPGSQL.ora, que contiene:

    HS_FDS_CONNECT_INFO = PGSQL
    HS_FDS_TRACE_LEVEL = OFF

    tnsnames.ora agregue:

    PGSQL.WORLD =
    (DESCRIPTION=
    (ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))
    (CONNECT_DATA=(SID=PGSQL))
    (HS=OK)
    )

    listener.ora agregue:

    (SID_DESC=
    (GLOBAL_DBNAME = PGSQL.WORLD)
    (SID_NAME=PGSQL)
    (ORACLE_HOME=C:\Oracle\Ora81\bin)
    (PROGRAM=hsodbc)
    )

    Y ejecute la instrucción sig.:

    CREATE PUBLIC DATABASE LINK PGSQL CONNECT TO “myuser” IDENTIFIED BY “mypwd” USING ‘PGSQL.WORLD’

    SOS NECESITO AYUDA POR FAVOR…

  5. Cabe mencionar que tanto SQL Server 2005 como Oracle 10G los tengo instalados en la misma PC.
    Si alguien me puede ayudar se lo agradeceria mucho

    Saludos

  6. Hola que tal, hice el ejemplo pero con SQL SERVER 2005 y segun yo todo esta correcto pero al hacer la consulta me manda un error

    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 LDB

    Alguien ya lo hizo para SQL SERVER 2005, o alguien sabe que onda con este error.

    Saludos

  7. buenas tardes perdon por molestar pero me surge una duda el archivo sqlnet.ora hay q modificarlo y que hay que agregar?????
    gracias por la ayuda

  8. Saludos muy completo el manual, quería saber si alguien ya logro hacerlo en diferentes máquinas y no en la misma toda la instalación.

  9. OK, he conseguido que funcione todo correctamente.
    En mi caso se trata de Oracle vs SQLSERVER, ambas bases de datos en Máquinas diferentes.

    La configuración indicada aqui es correcta, tan solo destacar dos cosas:

    Lo que hace el acceso a la base de datos SQlSERVER es el ODBC, es decir, que aunque se trate de una Máquina diferente(mi caso), en el fichero TNSNAMES.ora en la nueva Cadena de Conexión, en HOST hay que seguir poniendo LOCALHOST.

    Y otra cosa, en el caso de SQLSERVER el usuario y password son Case Sensitive por lo que al crear el ODBC tenerlo en cuenta y al crear el DBLink también (usar comillas dobles al poner el usuario o password para distinguir mayusculas y minusculas)

    1. Estoy tratando de hacer la conexion Oracle-Postgres, todo ha funcionado excepto el DBLINK, me da ese error ORA-28545 pero no se me soluciona colocando LOCALHOST en el TNSNAMES.ORA.. Quien tendrá algun tips adicional???

  10. Yo tengo el Servidor SQLSERVER en una máquina diferente al de Oracle.
    Al hacer select usando el DBLINK creado (desde Oracle) me sale esto:

    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 miBDSQLSERVER

  11. Prueba errónea de enlace de base de datos.
    ORA-28545: error diagnosticado por Net8 al conectar a un agente Unable to retrieve text of NETWORK/NCR message 12564 ORA-02063: 2 lines precediendo a MYSQLDB

  12. Saludos he realizado paso a paso el procedimiento y me sale el siguiente error
    ORA-28545: error diagnosticado por Net8 al conectar a un agente
    Unable to retrieve text of NETWORK message

  13. bastante completo tu tutorial pero…

    todo me sale salvo lo ultimo donde se crea el link me aparece este error.

    sp2-0640 not connected

    y lo que estoy ejecutando es esto:

    CREATE database link mysqldb
    CONNECT TO “root”
    identified by “”
    using ‘mysqldb’;

    no tengo password pues es root.

    ahora cual seria el problema te agradesco la respuesta

    1. pues a mi me suena que es por la falta de password, el que sea root no quiere decir que no lleva password, mas bien puede no llevarlo, checa esa parte, saludos

  14. Hola temgo el mismo error que Mariano, alguien podria decirme como resolverlo.

    Gracoas

    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 BDHOA

  15. estoy configurando un “heterogeneous services” entre oracle y mysql, pero me tira el siguiente error después de haber configurado todo y hacer un select,

    select * from tabla@MyDesa;

    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 MYDESA

  16. bueno a nivel oracle supongo que es practicamente la misma historia, solo cambiaria a nivel odbc, en ligar de mandarlo a mysql deberia de ser con sql server aunque nunca lo he intentado, saludos

  17. Hola amigos.. el articulo esta interesa.. yo estoy necesitando hacer lo mismo pero con Sybase y no con Mysql.. Lo procesimientos son los mismo no que me sale un error “TNS-03505: Failed to resolve name” tambien dice Used parameter files: c:\oracle9i\netword\admin\sqlnet.ora. Asi como veo creo que son los parametros que tengo en el sqlnet.ora los que me dan problemas…
    Los paremetros que tengo en el sqlnet.ora son:
    SQLNET.AUTHENTICATION_SERVICES = (NTS)
    #SQLNET.AUTHENTICATION_SERVICES = (Name)
    names.directory_path = (TNSNAMES,HOSTNAME).
    Será que me pueden ayudar con este tema..

    Saludos

    Samuel

  18. lo siento, no te puedo ayudar al respecto, conosco mysql aunque no tanto para hacer lo que pides, si es estricamente necesario hacerlo a la inversa mejor busca documentacion en la pagina de mysql, saludos

  19. Hola amig@s, me parece muy interesante el articulo, pero yo necesito hacerlo de manera inversa, es decir, desde mysql a oracle. Les agradecería muchísimo si me pudieran ayudar.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *