Oracle Streams - Replicación entre dos BBDD

Y se preguntaran que es Oracle Streams, dejo la definicion de Oracle:

Oracle Streams Propaga y administra datos, transacciones y eventos en una fuente de datos ya sea dentro de una base de datos, o de una base de datos a otra.

Bien a continuacion les dejo un paso a paso un tanto "extenso" para montar el Oracle Streams:

Requisitos:
Oracle version 10.2.0.1 en ambos casos
Windows XP / Windows 2003

Nombres del SID y TNS name:
DB1, db1 (Origen)
DB2, db2 (Destino)

Debemos configurar ambos parametros en cada base de datos (db1, db2):

1. Habilitamos el modo ARCHIVELOG en ambas bases de datos:

DB Origen: DB1
SQL> conn sys/sys as sysdba
Connected.
SQL> shutdown immediate
SQL> startup mount;
SQL> ALTER DATABASE ARCHIVELOG;
SQL> ALTER DATABASE OPEN;
SQL> ALTER DATABASE ARCHIVE LOG START

2. Creamos un usuario administrador para el Stream

DB Origen: DB1
SQL> conn sys/sys as sysdba
Connected.
SQL> create user strmadmin identified by strmadmin;

User created.

SQL> grant connect, resource, dba to strmadmin;

Grant succeeded.

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

PL/SQL procedure successfully completed.

SQL> grant select_catalog_role, select any dictionary to strmadmin;

Grant succeeded.

2.1 Ahora realizamos las mismas operaciones en la base de datos destino: DB2

SQL> conn sys/sys as sysdba
Connected.
SQL> create user strmadmin identified by strmadmin;

User created.

SQL> grant connect, resource, dba to strmadmin;

Grant succeeded.

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

PL/SQL procedure successfully completed.

SQL> grant select_catalog_role, select any dictionary to strmadmin;

Grant succeeded.

3. Ahora deberemos configurar el fichero INIT.ORA con los siguientes parametros:

DB Origen: DB1
SQL> conn sys/sys as sysdba
Connected.
SQL> alter system set global_names=true;

System altered.

SQL> alter system set streams_pool_size = 100 m;

System altered.

DB destino: DB2
SQL> conn sys/sys as sysdba
Connected.
SQL> alter system set global_names=true;

System altered.

SQL> alter system set streams_pool_size = 100 m;

System altered.

4. Ahora crearemos el enlace en cada base de datos apuntando a la otra:

DB Origen: DB1
SQL> conn strmadmin/strmadmin@db1
Connected.
SQL> create database link db2
2 connect to strmadmin
3 identified by strmadmin
4 using 'DB2';

Database link created.

DB Destino: DB2
SQL> conn strmadmin/strmadmin@db2
Connected.
SQL> create database link db1
2 connect to strmadmin
3 identified by strmadmin
4 using 'DB1';

Database link created.

5. Configuramos el origen y el destino de las consultas:

DB origen: DB1
SQL> conn strmadmin/strmadmin@db1
Connected.
SQL> EXEC DBMS_STREAMS_ADM.SET_UP_QUEUE();

PL/SQL procedure successfully completed.

DB Destino: DB2
SQL> conn strmadmin/strmadmin@db2
Connected.
SQL> EXEC DBMS_STREAMS_ADM.SET_UP_QUEUE();

PL/SQL procedure successfully completed.

6. Configuramos el esquema para los streams:

Esquema: SCOTT
Table: pibe

NOTA: El esquema scott viene bloqueado en las versiones 10g asi que deberemos desbloquearlos:

DB Origen: DB1
SQL> conn sys/sys as sysdba
Connected.
SQL> alter user scott account unlock identified by tiger;

User altered.

SQL> conn scott/tiger@db1
Connected.
SQL> create table pibe ( no number primary key,name varchar2(20),ddate date);

Table created.

DB Destino: DB2
SQL> conn sys/sys as sysdba
Connected.
SQL> alter user scott account unlock identified by tiger;

User altered.

SQL> conn scott/tiger@db2
Connected.
SQL> create table pibe ( no number primary key,name varchar2(20),ddate date);

Table created.

7. Creamos un acceso suplementario en la base de datos origen:

DB Origen: DB1
SQL> conn scott/tiger@db1
Connected.
SQL> alter table pibe
2 add supplemental log data (primary key,unique) columns;

Table altered.

8. Configuramos el proceso de captura en la base de datos origen:

DB Origen: DB1
SQL> conn strmadmin/strmadmin@db1
Connected.
SQL> begin dbms_streams_adm.add_table_rules
2 ( table_name => 'scott.pibe',
3 streams_type => 'capture',
4 streams_name => 'capture_stream',
5 queue_name=> 'strmadmin.streams_queue',
6 include_dml => true,
7 include_ddl => true,
8 inclusion_rule => true);
9 end;
10 /

PL/SQL procedure successfully completed.

9. Configuramos el proceso de propagacion:

DB Origen: DB1
SQL> conn strmadmin/strmadmin@db1
Connected.
SQL> begin dbms_streams_adm.add_table_propagation_rules
2 ( table_name => 'scott.pibe',
3 streams_name => 'DB1_TO_DB2',
4 source_queue_name => 'strmadmin.streams_queue',
5 destination_queue_name => 'strmadmin.streams_queue@DB2',
6 include_dml => true,
7 include_ddl => true,
8 source_database => 'DB1',
9 inclusion_rule => true);
10 end;
11 /

PL/SQL procedure successfully completed.

10. Configuramos el SCN:

DB Origen: DB1
SQL> CONN STRMADMIN/STRMADMIN@DB1
Connected.
SQL> declare
2 source_scn number;
3 begin
4 source_scn := dbms_flashback.get_system_change_number();
5 dbms_apply_adm.set_table_instantiation_scn@DB2
6 ( source_object_name => 'scott.pibe',
7 source_database_name => 'DB1',
8 instantiation_scn => source_scn);
9 end;
10 /

PL/SQL procedure successfully completed.

11. Configuramos el proceso de aplicacion en la base de datos destino:

DB Destino: DB2
SQL> conn strmadmin/strmadmin@db2
Connected.
SQL> begin dbms_streams_adm.add_table_rules
2 ( table_name => 'scott.pibe',
3 streams_type => 'apply',
4 streams_name => 'apply_stream',
5 queue_name => 'strmadmin.streams_queue',
6 include_dml => true,
7 include_ddl => true,
8 source_database => 'DB1',
9 inclusion_rule => true);
10 end;
11 /

PL/SQL procedure successfully completed.

12. Iniciamos la captura y el proceso de aplicacion de datos:

DB Origen: DB1
SQL> conn strmadmin/strmadmin@db1
Connected.
SQL> begin dbms_capture_adm.start_capture
2 ( capture_name => 'capture_stream');
3 end;
4 /

PL/SQL procedure successfully completed.

Db Destino: DB2
SQL> conn strmadmin/strmadmin@db2
Connected.
SQL> begin dbms_apply_adm.set_parameter
2 ( apply_name => 'apply_stream',
3 parameter => 'disable_on_error',
4 value => 'n');
5 end;
6 /

PL/SQL procedure successfully completed.

SQL> begin
2 dbms_apply_adm.start_apply
3 ( apply_name => 'apply_stream');
4 end;
5 /

PL/SQL procedure successfully completed.

NOTA: El entorno de replicacion ya esta listo!, lo que debemos hacer a continuacion es probarlo...

SQL> conn scott/tiger@db1
Connected.
SQL> --DDL operation
SQL> alter table pibe add (flag char(1));

Table altered.

SQL> --DML operation
SQL> begin
2 insert into pibe values (1,'first_entry',sysdate,1);
3 commit;
4 end;
5 /

PL/SQL procedure successfully completed.

SQL> conn scott/tiger@db2
Connected.
SQL> --TEST DDL operation
SQL> desc pibe
Name Null? Type
----------------------------------------- -------- ----------------------------

NO NOT NULL NUMBER
NAME VARCHAR2(20)
DDATE DATE
FLAG CHAR(1)

SQL> --TEST DML operation
SQL> select * from pibe;

NO NAME DDATE F
---------- -------------------- --------- -
1 first_entry 28-AGO-10 1

Como pueden ver, hemos actualizado la tabla en la DB1 y el stream se ha replicado a la DB2.

Espero que les resulte util.

Un saludo.
Share on Google Plus
    Blogger Comment

4 comentarios:

annieruci dijo...

De mucha ayuda la informacion que brindas.

Javier Grajales dijo...

Pregunta:

Entiendo esto se aplica solamente para e Oracle EE, pero en la SE y SE1, sería otro el procedimiento ya que solo soportan Capture Sincrónico (NO capture from redo)

Javier Grajales
PANAMA

sguinales dijo...

Es inmprescindible poner en archive las dos bd ? origen y destino, o solo origen? Hay alguna manera de si no funciona la propagacion saber que esta fallando?

Unknown dijo...

Buenisimo me ayudado bastante
Gracias.