- Oracle l'essentiel
- Installation d'Oracle
- Les Scripts
Creation d'une réplication de schema - table
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;
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.
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)
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'
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)))';;
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;
/