miércoles, 3 de junio de 2009

Replicacion dinamica de datos en oracle

Pase semanas tratando de hacer una replica de datos en oracle, foreando y foreando gracias Dios y a la investigacion en blog iguales a este, por fin pude lograrlo. Por eso quiero compartir con ustedes este post, si estan interasados en trabajar bases de datos distribuidas (Oracle).

Para aplicar la distribuicion/replicacion de datos haremos un ejemplo típico. Supongamos que tenemos dos sitios o nodos (uno local y uno remoto)en los cuales se ejecuta un SGBDD Oracle y ademas cada uno tiene una replica de base de datos de cualquier tipo, por ejemplos de empleados de una empresa.

Para la replicacion necesitamos en cada sitio, un enlace de base de datos (que apunte al otro nodo), un log de vista materializada (para reflejar los cambios locales) y una vista materializada para reflejar los cambios remotos.

Enlace de base de datos, log y vista materializada en el nodo local:


CREATE DATABASE LINK "ENLACE_NODOREMOTO"
   CONNECT TO "CAMILO" IDENTIFIED BY VALUES '05D70065BE99C0DDFEC78C7B9C3070591D'
   USING '(DESCRIPTION =
       (ADDRESS_LIST =
         (ADDRESS = (PROTOCOL = TCP)(HOST = NODOREMOTO)(PORT = 1521))
       )
       (CONNECT_DATA =
         (SID = xe)
       )
     )'


CREATE MATERIALIZED VIEW LOG ON TABLA_REMOTA
WITH PRIMARY KEY
EXCLUDING NEW VALUES;

Esta vista se crea en el nodo remoto
CREATE MATERIALIZED VIEW empleado_vm
REFRESH FORCE
START WITH sysdate NEXT sysdate + numtodsinterval(1, 'MINUTE')
FOR UPDATE
AS
select * from empleado@ENLACE_NODOLOCAL


En el nodo remoto se crea


CREATE DATABASE LINK "ENLACE_NODOLOCAL"
   CONNECT TO "CAMILO" IDENTIFIED BY VALUES '05D70065BE99C0DDFEC78C7B9C3070591D'
   USING '(DESCRIPTION =
       (ADDRESS_LIST =
         (ADDRESS = (PROTOCOL = TCP)(HOST = NODOLOCAL)(PORT = 1521))
       )
       (CONNECT_DATA =
         (SID = xe)
       )
     )'


Log de vista
CREATE MATERIALIZED VIEW LOG ON empleado
WITH PRIMARY KEY
EXCLUDING NEW VALUES;


y la vista siguiente se crea en el nodo local


CREATE MATERIALIZED VIEW empleado_vm
REFRESH FORCE
START WITH sysdate NEXT sysdate + numtodsinterval(1, 'MINUTE')
FOR UPDATE
AS select * from empleado@ENLACE_NODOREMOTO;


Y listo...con esto puedes hacer cualquier cambio en cualquier nodo, e inmediantamente este cambio se reflejara en el otro nodo.

Suerte....

2 comentarios:

  1. Muy bueno, gracias lo probaré para mi proyecto, Me es de gran ayuda este blog. =)

    ResponderEliminar
  2. Men muchas gracias me salvaste la vida estube semana buscando una manera de replicar que si funcianara y esta es la unica, gracias por compartirla

    ResponderEliminar

Copia aquí tus comentarios