sábado, 8 de junio de 2013

Oracle Replicacion Stream 11g R2 (Sincrona)

El siguiente post trata de explicar una de las tantas formas provistas por oracle para realizar una replicacion stream entre 2 bases de datos, cabe resaltar que este tipo de replicacion es la unica forma de realizar un stream en la instalacion standard del oracle 11g r2 citando la mismisima documentacion de oracle (y en letras pequeñas como toda informacion importantisima)


Bueno ahora un poco de informacion hacerca de la replicacion sincrona, esta es una forma bastante sencilla de replicar tablas que se encuentre en 2 bases de datos diferentes utilizando QUEUES (o colas), esta tambien es una de sus limitantes ya que solo se pueden replicar ciertas tablas otra situacion es que solo se pueden replicar DML con este metodo. Este tipo de replicacion es usada en aplicaciones sencillas en las cuales el flujo de datos a replicar es pequeño (unas pocas tablas), si se quiere replicar todo un esquema o toda una base de datos se recomienta realizar una instalacion enterprise (si se puede) y realizar el stream con un metodo que utilize PROCESOS para realizar el stream.

Para mas informacion:

http://docs.oracle.com/cd/B28359_01/server.111/b28321/strms_capture.htm#STRMS168


Antes que todo, debemos crear las Bases de Datos en modo archive log. En nuestro caso se creara la base de datos BDA en el servidor #1 y BDB en el servidor #2.


Ahora manos a la obra!!! :D

CONFIGURACION DEL ENTORNO DE RED.


Ambos servidores se encuentran conectados punto-punto utilizando la subred 172.16.0.0/24.

El servidor #1 tiene la dirección 172.16.0.1 y
el servidor #2 la dirección 172.16.0.2.

Si usted olvido crear la Base de Datos en modo Archive log, puede  empezar por el paso 2, de lo contrario vea el paso 3.

1. Agregar las cadenas de conexión respectivas en el archivo TNSNAMES.ORA.
El directorio en el que se encuentra el archivo es C://app/Oracle/product/11.2.0/dbhome_1/NETWORKADMIN/tnsnames.ora

1.1 Editar el archivo tnsnames.ora en Servidor #1 (BDA) agregando la siguiente cadena de conexión referente a la Base de Datos BDB.

BDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.0.2)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = BDB)
    )
  )

1.2 Editar el archivo tnsnames.ora en Servidor #2 (BDB) agregando la siguiente cadena de conexión referente a la Base de Datos BDA.

BDA =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.0.1)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = BDA)
    )
  )

2. Habilitar el modo Archive log en ambas Bases de Datos.

SQL> shutdown immediate
SQL> startup mount;
SQL> ALTER DATABASE ARCHIVELOG;
SQL> ALTER DATABASE OPEN;
SQL> ALTER DATABASE ARCHIVE LOG START

3.Creación de Usuario, tablespace y asignación de privilegios.
Estos pasos deben hacer de igual forma en ambas bases de Datos
3.1-Creación de Tablespace y Datafiles.
•En su navegador abra el Enterprise Manager y conéctese como usuario sys.
•De click en la ficha Servidor, luego diríjase a la sección Almacenamiento y de click a Tablespaces.
•Dar click el boton crear; esto abrira una ventana, En la seccion Crear Trablespace coloca el nombre que se le dara al tablespace, en nuestro caso se llama streams_tbs. Ver Imagen 2.
•En la seccion Archivo de Datos, dar click en el boton Agregar. Esto abrira la seccion Agregar Archivos de Datos
•Escribimos el nombre, el cual sera streams_tbs.dbf.
•En la seccion Almacenamiento damos un incremento de 100MB. El tamaño maximo del archivo debe de     quedar en Ilimitado. Ver configuracion completa en Imagen 3.
•Damos click en Continuar.
•Vamos al final de la pagina y damos click en Aceptar







Imagen2

 Imagen3


Imagen 4

3.2-Crear el usuario strmadmin.
•Ir a ficha Servidor.
•En el apartado Seguridad damos click en la opción Usuarios.
•Se nos abre una ventana en la que hay varios usuarios creados, estos no nos interesan, por lo tanto crearemos uno nuevo, para ello damos click en el botón Crear.
•Creamos el usuario strmadmin, con contraseña strmadmin y le asignamos  el tablespace creado recientemente streams_tbs y como tablespace Temporal le asignamos el TEMP. Ver Imagen 5.
•Damos click en Aceptar y listo hemos creado nuestro usuario.

Imagen 5

3.3-Privilegios a otorgarle
•Dar click en la ficha Servidor.
•Ir a la sección Administración de Enterprise Manager y seleccionamos Usuarios de Enterprise Manager. Nos abrirá una nueva ventana.
•En la sección Crear Administrador, agregamos el usuario strmadmin creado recientemente, para ello damos click en la lamparita que se muestra en la Figura 6, se abrirá una ventana en la que debemos seleccionar nuestro usuario strmadmin, damos click en Seleccionar.
•Una vez seleccionamos el usuario, damos click en el botón Revisar, luego Terminar.
•Ahora lo que queda es dejar nuestro Usuario como Superadministrador, para ello seleccionamos el usuario recién agregado, se abrirá la ventana en la que lo dejamos como Superadministrador como se muestra en la Imagen 7. Damos click en Revisar, luego en Terminar y listo.



 Imagen 6

Imagen 7

La lista de usuarios debe quedar como se muestra en la Imagen 8. Con esto tenemos a nuestro usuario strmadmin con privilegios de Superadministrador.




Imagen 8

3.3.1- Agregacion de Privilegios requeridos con GRANT.
Abrimos una consola y nos conectamos como usuarios sys.

SQL> grant execute on dbms_aqadm   to   strmadmin;
SQL> grant execute on dbms_capture_adm     to   strmadmin;
SQL> grant execute on dbms_propagation_adm   to   strmadmin;
SQL> grant execute on dbms_streams_adm  to    strmadmin;
SQL> grant execute on dbms_apply_adm      to    strmadmin;
SQL> grant execute on dbms_flashback    to     strmadmin;

SQL> begin dbms_streams_auth.grant_admin_privilege
 (grantee => 'strmadmin',
grant_privileges => true);
end;
/

3.3.2-Agregar el rol DBA

SQL> grant connect, resource, dba to strmadmin;

3.3.3-Agregación de los roles EXP_FULL_DATABASE e  IMP_FULL_DATABASE.

SQL> grant exp_full_database  to strmadmin;
SQL> grant imp_full_database  to strmadmin;

3.3.4-Agregación de variables de entorno necesarias para el Streams.
SQL> alter system set global_names=true;
SQL> alter system set Streams_pool_size=100m;

4.Crear el Database link y la conexión de red
El dblink debe tener el mismo nombre global de la base de datos de destino, en nuestro caso BDA y BDB; el dblink debe ser creado en el esquema del Database Stream Administrator.
Nos conectamos en nuestra Base de Datos y creamos un enlace hacia la Base de Datos a la que nos deseamos conectar.

4.1-Creación de Database Link en Base de Datos de Servidor #1: BDA.
Se crea el enlace hacia la Base de Datos de servidor #2 BDB

SQL> CONNECT strmadmin/strmadmin@BDA
SQL> CREATE DATABASE LINK BDB CONNECT TO strmadmin
SQL> IDENTIFIED BY strmadmin USING 'BDB';

4.2- Creación de Database Link en Base de Datos de servidor #2: BDB.
Se crea el enlace hacia la Base de Datos de servidor #1 BDA.

SQL> CONNECT strmadmin/strmadmin@BDB
SQL> CREATE DATABASE LINK BDA CONNECT TO strmadmins
SQL>IDENTIFIED BY strmadmin USING 'BDA';

5.Creación de las colas.
Este paso debe llevarse a cabo en el Enterprise Manager, ingresando con el usuario que se creó anteriormente y con su respectiva contraseña. Esto debe de realizarse en ambas Bases de Datos.
Se crearan 2 parámetros de inicialización, con nombres, capture_queue y apply_queue .
Vea el siguiente enlace y diríjase a la sección To set the GLOBAL_NAMES initialization parameter to TRUE at a database:

http://docs.oracle.com/cd/B28359_01/server.111/b28324/tdpii_common_ii.htm#CHDJHCAI

•Ir a la pestaña Movimiento de Datos
•En la sección Streams seleccionar la opción Gestionar Colas Avanzadas. Esto abrirá una nueva ventana
•Buscamos un botón que dice Crear.
•Seleccionamos Cola Normal, Tipo de Dato SYS.ANYDATA
•Creamos las colas capture_queue y apply_queue como se muestran en las Figuras Imagen 9.




Imagen 9



Imagen 10

6.Creación de tabla en usuario HR.
Conectarse al esquema de la Base de Datos en el que se desea crear una nueva tabla.
Si no ha desbloqueado el esquema, puede hacer lo siguiente en SQLPLUS desde el usuario sys. Para este caso se usara el esquema hr.

SQL> alter user hr account unlock identified by hr;

Con esto desbloqueamos el esquema hr y le asignamos la contraseña hr.
Nos conectamos a dicho esquema.

SQL> connect hr/hr@BDX

Donde X representa A o B, Si está en maquina Servidor #1 reemplace BDX por BDA, de lo contrario reemplácela por BDB. Ahora creamos la tabla.

SQL> create table alumno ( ID number primary key, nombre varchar2(20),
          carrera varchar2(20));

7.Creación y agregación de reglas del apply process en ambas Bases de  Datos.
7.1.1-Creación del apply process en BDA ubicada en Servidor #1.

BEGIN
  DBMS_APPLY_ADM.CREATE_APPLY(
    queue_name     => 'strmadmin.apply_queue',
    apply_name     => 'apply_emp_dep',
    apply_captured => FALSE);
END;
/

7.1.2- Agregación de reglas del apply process en BDA ubicada en Servidor #1.

BEGIN
  DBMS_STREAMS_ADM.ADD_TABLE_RULES(
    table_name      => 'hr.alumno',
    streams_type    => 'apply',
    streams_name    => 'apply_emp_dep',
    queue_name      => 'strmadmin.apply_queue',
    source_database => 'BDB');
END;
/

7.2.1-Creación del apply process en BDB ubicada en Servidor #2.

BEGIN
  DBMS_APPLY_ADM.CREATE_APPLY(
    queue_name     => 'strmadmin.apply_queue',
    apply_name     => 'apply_emp_dep',
    apply_captured => FALSE);
END;
/


7.2.2- Agregación de reglas del apply process en BDB ubicada en Servidor #2.

BEGIN
  DBMS_STREAMS_ADM.ADD_TABLE_RULES(
    table_name      => 'hr.alumno',
    streams_type    => 'apply',
    streams_name    => 'apply_emp_dep',
    queue_name      => 'strmadmin.apply_queue',
    source_database => 'BDA');
END;
/
8.Configuración de la Propagación para la notificación de cambios.
8.1.En Base de Datos BDA.

BEGIN
  DBMS_STREAMS_ADM.ADD_TABLE_PROPAGATION_RULES(
    table_name              => 'hr.alumno',
    streams_name            => 'send_emp_dep',
    source_queue_name       => 'strmadmin.capture_queue',
    destination_queue_name  => 'strmadmin.apply_queue@BDB',
    source_database         => 'BDA',
    queue_to_queue          => TRUE);
END;
/

8.2.En Base de Datos BDB.

BEGIN
  DBMS_STREAMS_ADM.ADD_TABLE_PROPAGATION_RULES(
    table_name              => 'hr.alumno',
    streams_name            => 'send_emp_dep',
    source_queue_name       => 'strmadmin.capture_queue',
    destination_queue_name  => 'strmadmin.apply_queue@BDA',
    source_database         => 'BDB',
    queue_to_queue          => TRUE);
END;
/

9.Configuración de Captura Síncrona.
En ambas Bases de Datos hacer lo siguiente. Esto es necesario para capturar lo que se propaga de la otra Base de Datos con la que se está conectado.

BEGIN
  DBMS_STREAMS_ADM.ADD_TABLE_RULES(
    table_name    => 'hr.alumno',
    streams_type  => 'sync_capture',
    streams_name  => 'sync_capture',
    queue_name    => 'strmadmin.capture_queue');
END;
/


10.Configuración de instanciación de SCN.
10.1En Base de Datos BDA.

DECLARE
  iscn  NUMBER;   
BEGIN
  iscn := DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER();
  DBMS_APPLY_ADM.SET_TABLE_INSTANTIATION_SCN@BDB(
    source_object_name    => 'hr.alumno',
    source_database_name  => 'BDA',
    instantiation_scn     => iscn);
END;
/

10.2En Base de Datos BDB.

DECLARE
  iscn  NUMBER;   
BEGIN
  iscn := DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER();
  DBMS_APPLY_ADM.SET_TABLE_INSTANTIATION_SCN@BDA(
    source_object_name    => 'hr.alumno',
    source_database_name  => 'BDB',
    instantiation_scn     => iscn);
END;
/

11.Iniciar apply process.
Esta configuración se hace en ambas Bases de Datos.

BEGIN
  DBMS_APPLY_ADM.START_APPLY(
    apply_name => 'apply_emp_dep');
END;
/

Ahora solo quedaria probar la replicacion


En el servidor 1 en el sqlplus nos conectamos como el usuario hr

SQL> conn hr/hr@BDA
SQL>insert in to alumno values(1,'Pablo','Moran');
SQL>commit;

Ahora en el servidor 2 en el sqlplus nos conectamos como el usuario hr

SQL>conn hr/hr@BDB
SQL>select * from alumno;

Ahora nos deberia aparecer el valor pablo moran q acabamos de ingresar :), tambien se puede monitorear las colas stream en el Enterprise Manager en la pestaña

>Movimiento de datos (data movement) > Gestionar colas avanzadas

Eso es todo :) Para cualquier duda estamos a la orden! saludos desde El Salvador! Dios les bendiga! :D  :P  ^^

Los que prefieran les dejo el video :) en HD 

https://www.youtube.com/watch?v=x_Pm0iwo-Eg


Nuestros nombres y correos de contacto :)
Herber Gomez ----> devaky_5000@hotmail.com
Pablo Portillo ------> oswalxtiyo@gmail.com
Flor Grissel Chicas Blanco
Rebeca Mendez -------> rebemmz@gmail.com






2 comentarios:

Unknown dijo...

hola buenos días, muy útil la guía, quería saber sirve para ser usada entre 2 o mas base de datos oracle 11g standard

Unknown dijo...

Si se puede, pero solo de tipo sincorno , por tablas