Shape1 Shape2 Shape3

Copyright 2010 le coin du dba oracle

Shape4

Le coin du DBA Oracle

All rights reserved

Oracle est une marque déposée d'Oracle Corporation

2006_0815aout_canal20060093 DBA Oracle
Shape1

Creation d'une réplication de schema - table


Shape2

Dans ce chapitre, nous vous montrerons comment monter une réplication streams facilement, nous détaillerons les éléments de la réplication, pour en expliquer le fonctionnement, les astuces pour maintenir la réplication en état.

Shape3

Il existe un package permettant de faire automatiquement la réplication DBMS_STREAMS_ADM. Mais avant de parler technique, il va falloir préparer le terrain pour cela je propose de créer deux bases de données SourceDB et RepDB.

Sur SourceDB

       create tablespace ts_apps datafile '/serv1/oradata/sourceDB/apps.dbf size 100M;

       create tablespace ts_streams datafile  '/serv1/oradata/sourceDB/streams.dbf size 100M;

Sur RepDB

       create tablespace ts_apps datafile '/serv2/oradata/sourceDB/apps.dbf size 100M;

       create tablespace ts_streams datafile  '/serv2/oradata/sourceDB/streams.dbf size 100M;

Sur SourceDB et RepDB

       create user apps identified by apps default tablespace ts_apps temporary tablespace temp;

       grant connect, resource to apps;

       grant select on v_$database to apps;

Créer les objets du schéma apps sur SourceDB

       connect apps/apps@sourcedb

       create table dept (

               deptno                number(10)        not null,

               name                varchar2(20)        not null,

               NameDatabase        varchar2(20)        not null,

               constraint dept_pk primary key (deptno),

               );


       create table emp(

               empno                number(10)        not null,

               name                varchar2(20)        not null,

               job                varchar2(20)        not null,

               deptno                number(10)        not null,

               NameDatabase        varchar2(20)        not null,

               constraint emp_pk primary key (empno),

               constraint emp_dept_fk foreign key (deptno) reference dept(deptno),

               );


               create sequence deptno_srceSeq start with 1 increment by 5;


Créer les objets du schéma apps sur RepDB

       connect apps/apps@repdb

       create table dept (

               deptno                number(10)        not null,

               name                varchar2(20)        not null,

               NameDatabase        varchar2(20)        not null,

               constraint dept_pk primary key (deptno)

               );


       create table emp(

               empno                number(10)        not null,

               name                varchar2(20)        not null,

               job                varchar2(20)        not null,

               deptno                number(10)        not null,

               NameDatabase        varchar2(20)        not null,

               constraint emp_pk primary key (empno),

               constraint emp_dept_fk foreign key (deptno) reference dept(deptno),

               );


       create sequence deptno_RepSeq start with 2 increment by 5;

Shape4

Amusons nous un peu, nous allons commencer par créer un répertoire pour Oracle, afin que le package puissent écrire le fichier contenant le script pour créer la réplication.


CREATE OR REPLACE DIRECTORY SRCE_DIR AS 'E:\app\source\oradata\apps\replication';


GRANT EXECUTE, READ, WRITE ON DIRECTORY SYS.SRCE_DIR TO APPS WITH GRANT OPTION;

GRANT EXECUTE, READ, WRITE ON DIRECTORY SYS.SRCE_DIR TO REPADMIN WITH GRANT OPTION;


BEGIN

DBMS_STREAMS_ADM.MAINTAIN_SCHEMAS(

       schema_names                        =>        ’APPS',

       source_directory_object                =>        NULL,

       destination_directory_object        =>        NULL,

       source_database                =>        ’SourceDB',

       destination_database                =>        ’RepDB',

       capture_name                        =>        ’capture_Apps',

       capture_queue_table                =>        ’repadmin.streams_table_S_Apps',

       capture_queue_name                =>        ’repadmin.streams_queue_S_Apps',

       capture_queue_user                =>        null,

       apply_name                        =>        ’apply_Apps',

       apply_queue_table                =>        ’repadmin.streams_table_D_Apps',

       apply_queue_name                =>        ’repadmin.streams_D_Apps',

       apply_queue_user                =>        null,

       propagation_name                =>        ’prop_Apps',

           log_file                                       =>             'exp.log',

       bi_directional                        =>        true,

       include_ddl                        =>        false,

       instantiation                        =>        dbms_streams_adm.instantiation_schema_network,

       perform_actions                        =>        false,

       script_name                                    =>          'schema_replicationApps.sql',

       script_directory_object                =>          'SRCE_DIR'

);

END;

/


Il vous suffit de regarder le script généré. Dans ce script il faut faire attention. En effet oracle capture les informations même celles avec TAG Non nul mais ne les propages pas. Ceci pose problème à mon sens, en effet lorsque vous corrigez des problèmes de réplication, vous utilisez le TAG non nul. Les informations seront capturées et conservé dans le streams de capture.

Shape5

Continuons la configuration manuelle de notre réplication.

Il faut activé le niveau d'enregistrement log supplémentaire.

Le but est de permettre une meilleur identification de la ligne, ceci ajoutera des informations dans les fichiers Redo.

Il existe deux types de groupes de journaux supplémentaire:


Groupe de journaux inconditionnel, le group de log peut contenir éventuellement la colone spécifié.

       alter table dept add supplemental log group loggrp_dept(deptno)always;

       alter table emp add supplemental log group loggrp_emp(empno)always;

       

Groupe de journaux conditionnel,

       alter table dept add supplemental log group loggrp_dept(deptno,name,namedatabase);

       alter table emp add supplemental log group loggrp_emp(empno,name_job,depno,namedatabase);


suppression d'un groupe de log

       alter table dept drop supplemental log group loggrp_dept;

       

Il est aussi possible d'intégrés dans les logs des informations data. Juste celle correspondant au clé primaire et clé unique

       alter table dept add supplemental log data (PRIMARY KEY, UNIQUE KEY, FOREIGN KEY) COLUMNS;

       alter table emp add supplemental log data (PRIMARY KEY, UNIQUE KEY, FOREIGN KEY) COLUMNS;


Autre possibilité toutes les colonnes de la table Dans l'hyppothèse ou vous n'avez ni clé primaire ni clé unique. Ce cas de figure ne devrait même pas êtyre envisageable.

       Alter table dept add supplemental log data (ALL) COLUMNS;

       Alter table emp add supplemental log data (ALL) COLUMNS;


suppression d'un log data

       alter alter table dept drop supplemental log data (ALL)

       alter alter table dept drop supplemental log data (PRIMARY KEY)

                                       

Shape6

Continuons la configuration manuelle de notre réplication.

Il faut activé le niveau d'enregistrement log supplémentaire.

Le but est de permettre une meilleur identification de la ligne, ceci ajoutera des informations dans les fichiers Redo.

Il existe deux types de groupes de journaux supplémentaire:


Groupe de journaux inconditionnel, le group de log peut contenir éventuellement la colone spécifié.

       alter table dept add supplemental log group loggrp_dept(deptno)always;

       alter table emp add supplemental log group loggrp_emp(empno)always;

       

Groupe de journaux conditionnel,

       alter table dept add supplemental log group loggrp_dept(deptno,name,namedatabase);

       alter table emp add supplemental log group loggrp_emp(empno,name_job,depno,namedatabase);


suppression d'un groupe de log

       alter table dept drop supplemental log group loggrp_dept;

       

Il est aussi possible d'intégrés dans les logs des informations data. Juste celle correspondant au clé primaire et/ou clé unique et/ou clé étrangère

       alter table dept add supplemental log data (PRIMARY KEY, UNIQUE KEY, FOREIGN KEY) COLUMNS;

       alter table emp add supplemental log data (PRIMARY KEY, UNIQUE KEY, FOREIGN KEY) COLUMNS;


Autre possibilité toutes les colonnes de la table Dans l'hyppothèse ou vous n'avez ni clé primaire ni clé unique. Ce cas de figure ne devrait même pas êtyre envisageable.

       Alter table dept add supplemental log data (ALL) COLUMNS;

       Alter table emp add supplemental log data (ALL) COLUMNS;


suppression d'un log data

       alter alter table dept drop supplemental log data (ALL);

       alter alter table dept drop supplemental log data (PRIMARY KEY);


Visualisation des log supplémentaire

       select log_group_name,table_name from dba_log_groups where owner='APPS'

Shape7

Création d'un utilisateur administrateur de la réplication


create user strmadmin identified by strmadmin default tablespace ts_streams temporary tablespace temp;


grant dba, select_catalog_role to strmadmin;

exec dbms_streams_auth.grant_admin_privilege(

grantee=>'strmadmin',

grant_privileges=>true);


Création d'un lien de base de donnée sur SourceDB pour RepDB et sur RepDB pour SourceDB


Sur SourceDB

create database link repdb connect to strmadmin identified by strmadmin using 'repdb';

ou

create database link repdb connect to strmadmin identified by strmadmin using '(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=SERVERREP)(PORT=1521)))(CONNECT_DATA=(SID=REPDB)(SERVER=DEDICATED)))';;


Sur RepDB

create database link sourcedb connect to strmadmin identified by strmadmin using 'sourcedb';

ou

create database link repdb connect to strmadmin identified by strmadmin using '(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=SERVERSOURCE)(PORT=1521)))(CONNECT_DATA=(SID=SOURCEDB)(SERVER=DEDICATED)))';;

Shape8

Ce connecter à l'aide de l'administrateur de réplication

Sur SourceDB

connect strmadmin/strmadmin@SourceDB


creation d'une file d'attente (queue en anglais)

begin

DBMS_STREAMS_ADM.SET_UP_QUEUE(

queue_table  =>'strmadmin.streams_queue_table_s',

queue_name=>'strmadmin.streams_queue_s');

END;

/


Sur RepDB

connect strmadmin/strmadmin@SourceDB


creation d'une file d'attente (queue en anglais)

begin

DBMS_STREAMS_ADM.SET_UP_QUEUE(

queue_table  =>'strmadmin.streams_queue_table_d',

queue_name=>'strmadmin.streams_queue_d');

END;

/


Ajouter les gestionnaires de file d'attente pour la création, la propagation et l'application des messages sur un schema (streams en anglais)


règle positive pour le processus d'application

begin

dbms_streams_adm.add_shema_rules(

       schena_name =>'APPS',

       streams_type => 'APPLY',

       streams_name=>'APPLY_APPS',

       queue_name => 'strmadmin.streams_queue_d',

       include_dml => true,

       include_ddl => false,

       include_tagged_lcr=>true,

       source_database=>'repdb',

       inclusion_rule => true,

       and_condition=>((((:dml.get_object_owner()='APPS') and :dml.get_source_database_name()='RepDB')) and (:dml.get_compatible()<=dbms_streams.compatible_11_1));

end;

/


begin

  dbms_apply_adm.alter_apply(

    apply_name => '"APPLY_APPS"',

    apply_tag => hextoraw('17'));

end;

/


begin

  dbms_streams_adm.set_up_queue(

    queue_table => '"strmadmin"."streams_table_s"',

    storage_clause => NULL,

    queue_name => '"strmadmin"."streams_queue_s"',

    queue_user => '');

end;

/

Création du processus de propagation


Règle positive

begin

  dbms_streams_adm.add_schema_propagation_rules(

    schema_name => '"APPS"',

    streams_name => '"PROP_APPS"',

    source_queue_name => '"strmadmin"."STREAMS_QUEUE_S"',

    destination_queue_name => '"strmadmin"."STREAMS_D"@Repdb',

    include_dml => TRUE,

    include_ddl => FALSE,

    include_tagged_lcr => TRUE,

    source_database => 'SourceDB',

    inclusion_rule => TRUE,

    and_condition => NULL,

    queue_to_queue => ((:dml.get_object_owner() = APPS') and :dml.get_source_database_name() = SourceDB' )

);

END;

/


Règle négative

begin

  dbms_streams_adm.add_schema_propagation_rules(

    schema_name => '"APPS"',

    streams_name => '"PROP_APPS"',

    source_queue_name => '"strmadmin"."STREAMS_QUEUE_S"',

    destination_queue_name => '"strmadmin"."STREAMS_D"@Repdb',

    include_dml => TRUE,

    include_ddl => FALSE,

    include_tagged_lcr => TRUE,

    source_database => 'SourceDB',

    inclusion_rule => FALSE,

    and_condition => and_condition,

    queue_to_queue => ((((:dml.get_object_owner() = APPS') and :dml.get_source_database_name() = 'SourceDB' )) and ((:dml.get_tag() = hextoraw('17'))))

);

END;

/


  dbms_aqadm.disable_propagation_schedule(

    queue_name => '"strmadmin"."STREAMS_QUEUE_S"',

    destination => 'RepDB',

    destination_queue => '"strmadmin"."STREAMS_D"');


Création du processus de capture


Règle positive

begin

dbms_streams_adm.add_schema_rules(

    schema_name => '"MLSA"',

    streams_type => 'CAPTURE',

    streams_name => '"CAPTURE_MLSA"',

    queue_name => '"REPADMIN"."STREAMS_QUEUE_S_MLSA"',

    include_dml => TRUE,

    include_ddl => FALSE,

    include_tagged_lcr => TRUE,

    source_database => 'ECMORLY',

    inclusion_rule => TRUE,

    and_condition => ((((:dml.get_object_owner() = APPS') and :dml.get_source_database_name() = SourceDB' )) and (:dml.get_compatible() <= dbms_streams.compatible_11_1) and :dml.is_null_tag()='Y' )

);

END;

/


Démarrage du processus de capture

BEGIN

  dbms_capture_adm.start_capture(

    capture_name => '"CAPTURE_APPS"');


Modification du processus d'application

modification du paramètre d'arrêt du processus sur erreur d'application

BEGIN

  dbms_apply_adm.set_parameter(

    apply_name => '"APPLY_MLSA"',

    parameter  => 'disable_on_error',

    value      => 'N');

END;

/


modification du paramètre duplication des lignes en d'autre terme manque de clé primaire et/ou unique sur la table

BEGIN

  dbms_apply_adm.set_parameter(

    apply_name => '"APPLY_MLSA"',

    parameter  => 'allow_duplicate_rows',

    value      => 'y');

END;

/


Démarrage du processus d'application APPLY_APPS


BEGIN

  dbms_apply_adm.start_apply(

    apply_name => '"APPLY_APPS"');

END;

/