Ceci est une ancienne révision du document !
L'objectif ici est de mettre en place une réplication streams bi-directionnelle entre deux bases Oracle 11gR2 nommées YODA et LUKE.
La réplication s'effectue sur un schéma nommé ALICE.
Création des tablespaces dédiés sur YODA
CREATE TABLESPACE "STRM_DATA" DATAFILE '/u03/app/oracle/oradata/YODA/strm_data_01.dbf' SIZE 100M; CREATE TEMPORARY TABLESPACE "STRM_TEMP" TEMPFILE '/u02/app/oracle/oradata/YODA/strm_temp_01.dbf' SIZE 50M;
Création des tablespaces dédiés sur LUKE
CREATE TABLESPACE "STRM_DATA" DATAFILE '/u03/app/oracle/oradata/LUKE/strm_data_01.dbf' SIZE 100M; CREATE TEMPORARY TABLESPACE "STRM_TEMP" TEMPFILE '/u02/app/oracle/oradata/LUKE/strm_temp_01.dbf' SIZE 50M;
Création du user à faire sur les deux bases YODA et LUKE.
create user strmadmin identified by strmadmin default tablespace strm_data temporary tablespace strm_temp;
Affectation des droits à faire sur les deux bases YODA et LUKE.
alter user strmadmin quota unlimited on strm_data; grant dba to strmadmin; execute dbms_streams_auth.grant_admin_privilege('STRMADMIN',TRUE);
La première synchro entre YODA et LUKE se fera via DataPump. Mettre en place sur chaque base un objet directory.
Sur YODA
mkdir -p /u02/app/oracle/dpump/YODA sqlplus strmadmin/strmadmin@yoda SQL> create directory dpump as '/u02/app/oracle/dpump/YODA';
Sur LUKE
mkdir -p /u02/app/oracle/dpump/LUKE sqlplus strmadmin/strmadmin@luke SQL> create directory dpump as '/u02/app/oracle/dpump/LUKE';
Il faut sur chaque bases activer le paramètre Oracle global_names à true.
alter system set global_names=true scope=both;
Sur les deux bases en strmadmin
begin dbms_streams_adm.set_up_queue( queue_table => 'file_envoi', queue_name=> 'file_envoi'); end; / begin dbms_streams_adm.set_up_queue( queue_table => 'file_reception', queue_name=> 'file_reception'); end; /
Très important, en raison du positionement de global_names à true, les dblinks doivent avoir le même nom que la chaine Oracle*Net ( tnsnames.ora ).
Depuis YODA → LUKE
CREATE DATABASE LINK LUKE CONNECT TO STRMADMIN IDENTIFIED BY strmadmin USING 'LUKE';
Depuis LUKE → YODA
CREATE DATABASE LINK YODA CONNECT TO STRMADMIN IDENTIFIED BY strmadmin USING 'YODA';
Sur les deux bases.
begin dbms_capture_adm.prepare_schema_instantiation( schema_name=>'ALICE', supplemental_logging => 'keys'); end; /
Sur YODA
begin dbms_streams_adm.add_schema_rules( schema_name=> 'ALICE', streams_type=>'capture', streams_name=>'CAPTURE_YODA', queue_name=>'file_envoi', include_dml=>true, include_ddl=>true, include_tagged_lcr=>false, source_database=>'YODA'); end; /
Sur LUKE
begin dbms_streams_adm.add_schema_rules( schema_name=> 'ALICE', streams_type=>'capture', streams_name=>'CAPTURE_LUKE', queue_name=>'file_envoi', include_dml=>true, include_ddl=>true, include_tagged_lcr=>false, source_database=>'LUKE'); end; /
Propagation de YODA → LUKE
begin dbms_streams_adm.add_schema_propagation_rules( schema_name =>'ALICE', streams_name=>'PROPA_TO_LUKE', source_queue_name=>'file_envoi', destination_queue_name=>'file_reception@luke', include_dml=>true, include_ddl=>true, include_tagged_lcr=>false, inclusion_rule=>true, source_database=>'YODA', queue_to_queue=>false ); end; /
Propagation de LUKE → YODA
begin dbms_streams_adm.add_schema_propagation_rules( schema_name =>'ALICE', streams_name=>'PROPA_TO_YODA', source_queue_name=>'file_envoi', destination_queue_name=>'file_reception@yoda', include_dml=>true, include_ddl=>true, include_tagged_lcr=>false, inclusion_rule=>true, source_database=>'LUKE', queue_to_queue=>false ); end; /
Sur YODA : application des données de LUKE
begin dbms_streams_adm.add_schema_rules( schema_name=>'ALICE', streams_type=>'apply', streams_name=>'APPLICATION_FOR_LUKE', queue_name=>'file_reception', include_dml=>true, include_ddl=>true, include_tagged_lcr=>false, source_database=>'LUKE' ); end; /
Sur LUKE : application des données de YODA
begin dbms_streams_adm.add_schema_rules( schema_name=>'ALICE', streams_type=>'apply', streams_name=>'APPLICATION_FOR_YODA', queue_name=>'file_reception', include_dml=>true, include_ddl=>true, include_tagged_lcr=>false, source_database=>'YODA' ); end; /
Instanciation de YODA
set serveroutput on size 1000000 declare current_scn number; begin current_scn:=dbms_flashback.get_system_change_number(); dbms_output.put_line( 'SCN Courant : ' || current_scn ); begin dbms_apply_adm.set_schema_instantiation_scn@luke( source_schema_name=>'ALICE', source_database_name=>'YODA', instantiation_scn=>current_scn, recursive=>true ); end; end; /
Instanciation de LUKE
set serveroutput on size 1000000 declare current_scn number; begin current_scn:=dbms_flashback.get_system_change_number(); dbms_output.put_line( 'SCN Courant : ' || current_scn ); begin dbms_apply_adm.set_schema_instantiation_scn@yoda( source_schema_name=>'ALICE', source_database_name=>'LUKE', instantiation_scn=>current_scn, recursive=>true ); end; end; /
Il s'agit ici d'utiliser datapump via un database link afin d'importer depuis YODA dans LUKE les informations du schéma ALICE.
Dans un premier temps il faut relever sur YODA le SCN courant.
select dbms_flashback.get_system_current_number() from dual; -> 855547
Ce numéro SCN servira de marqueur lors de l'import DataPump via la clause flashback_scn. Créer un fichier de paramètres, alice.dpimp, pour l'import. Il est supposé créé sur chaque base la directory dpump.
directory=dpump network_link=yoda logfile=alice.dpimp.log table_exists_action=truncate schemas=alice flashback_scn=855547
Lancer ensuite l'import DataPump sur LUKE.
impdp strmadmin/strmadmin@luke parfile=alice.dpimp
Sur YODA
begin dbms_capture_adm.start_capture('CAPTURE_YODA'); end; /
Sur LUKE
begin dbms_capture_adm.start_capture('CAPTURE_LUKE'); end; /
Sur LUKE
begin dbms_propagation_adm.start_propagation(propagation_name=>'PROPA_TO_YODA'); end; /
Sur YODA
begin dbms_propagation_adm.start_propagation(propagation_name=>'PROPA_TO_YODA'); end; /
Sur YODA
begin dbms_apply_adm.start_apply('APPLICATION_FOR_LUKE'); end; /
Sur LUKE
begin dbms_apply_adm.start_apply('APPLICATION_FOR_YODA'); end; /