Configuration de la réplication bidirectionelle

Une fois la réplication unidirectionnelle configurée, quelques étapes supplémentaires suffisent pour répliquer les données dans la direction opposée. Cet exemple de démarrage rapide utilise Autonomous Transaction Processing et Autonomous Data Warehouse comme bases de données cloud.

Avant de commencer

Vous devez disposer de deux bases de données existantes dans les mêmes location et région pour pouvoir effectuer ce démarrage rapide. Si vous avez besoin de données échantillon, téléchargez Archive.zip, puis suivez les instructions fournies dans l'atelier pratique 11, Tâche 3 : charger le schéma ATP.

Présentation

Les étapes suivantes vous guident tout au long de l'instanciation d'une base de données cible à l'aide d'Oracle Data Pump et de la configuration de la réplication bidirectionnelle entre deux bases de données d'une même région.

Description de l'image bidirectional.png
description de l'illustration bidirectional.png,

Tâche 1 : configurer l'environnement

  1. Créez un déploiement.
  2. Créez des connexions à vos bases de données.
  3. Affectez les connexions au déploiement.
  4. Activez la journalisation supplémentaire :
    ALTER DATABASE ADD SUPPLEMENTAL LOG DATA
  5. Exécutez la requête suivante afin de vous assurer que support_mode=FULL pour toutes les tables de la base de données source :
    
    select * from DBA_GOLDENGATE_SUPPORT_MODE where owner = 'SRC_OCIGGLL';
  6. Exécutez la requête suivante sur la base de données B afin de vous assurer que support_mode=FULL pour toutes les tables de la base de données :
    select * from DBA_GOLDENGATE_SUPPORT_MODE where owner = 'SRCMIRROR_OCIGGLL';

Tâche 2 : ajouter des informations relatives aux transactions et une table de point de reprise pour les deux bases de données

Dans la console de déploiement OCI GoldenGate, accédez à l'écran Configuration du service d'administration, puis effectuez les opérations suivantes :

  1. Ajoutez des informations relatives aux transactions sur les bases de données A et B :
    1. Pour la base de données A, entrez SRC_OCIGGLL dans Nom de schéma.
    2. Pour la base de données B, entrez SRCMIRROR_OCIGGLL dans Nom de schéma.

    Remarques :

    Les noms de schéma doivent être uniques et correspondre aux noms de schéma de base de données si vous utilisez un ensemble de données différent de celui de cet exemple.
  2. Créez une table de point de reprise pour les bases de données A et B :
    1. Pour la base de données A, entrez "SRC_OCIGGLL"."ATP_CHECKTABLE" dans Table de point de reprise.
    2. Pour la base de données B, entrez "SRCMIRROR_OCIGGLL"."CHECKTABLE" dans Table de point de reprise.

Tâche 3 : créer l'extraction intégrée

L'extraction intégrée capture les modifications continues apportées à la base de données source.

  1. Sur la page Détails du déploiement, cliquez sur Lancer de la console.
  2. Ajoutez et exécutez une extraction intégrées.

    Remarques :

    Pour plus d'informations sur les paramètres que vous pouvez utiliser pour spécifier des tables source, reportez-vous à Options de paramètre d'extraction supplémentaires.
    1. Sur la page Paramètres d'extraction, ajoutez les lignes suivantes sous EXTTRAIL <extract-name> :
      -- Capture DDL operations for listed schema tables
      ddl include mapped
      
      -- Add step-by-step history of 
      -- to the report file. Very useful when troubleshooting.
      ddloptions report 
      
      -- Write capture stats per table to the report file daily.
      report at 00:01 
      
      -- Rollover the report file weekly. Useful when IE runs
      -- without being stopped/started for long periods of time to
      -- keep the report files from becoming too large.
      reportrollover at 00:01 on Sunday 
      
      -- Report total operations captured, and operations per second
      -- every 10 minutes.
      reportcount every 10 minutes, rate 
      
      -- Table list for capture
      table SRC_OCIGGLL.*;
      
      -- Exclude changes made by GGADMIN
      tranlogoptions excludeuser ggadmin

    Remarques :

    tranlogoptions excludeuser ggadmin évite de recapturer les transactions appliquées par ggadmin dans les scénarios de réplication bidirectionnelle.
  3. Recherchez les éventuelles transactions à longue durée d'exécution :
    1. Exécutez le script suivant sur la base de données source :
      select start_scn, start_time from gv$transaction where start_scn < (select max(start_scn) from dba_capture);

      Si la requête renvoie des lignes, vous devez localiser le numéro SCN de la transaction, puis valider ou annuler la transaction.

Tâche 4 : exporter des données à l'aide d'Oracle Data Pump (ExpDP)

Utilisez Oracle Data Pump (ExpDP) pour exporter des données de la base de données source vers la banque d'objets Oracle.

  1. Créez un bucket de banque d'objets Oracle.

    Notez le nom de l'espace de noms et du bucket en vue de leur utilisation avec les scripts d'export et d'import.

  2. Créez un jeton d'authentification, puis copiez la chaîne de jeton et collez-la dans un éditeur de texte pour une utilisation ultérieure.
  3. Créez des informations d'identification dans la base de données source, en remplaçant <user-name> et <token> par le nom utilisateur de compte Oracle Cloud et par la chaîne de jeton que vous avez créée à l'étape précédente :
    BEGIN
      DBMS_CLOUD.CREATE_CREDENTIAL(
        credential_name => 'ADB_OBJECTSTORE', 
        username => '<user-name>',
        password => '<token>'
      );
    END;
  4. Exécutez le script suivant dans la base de données source pour créer le travail Exporter les données. Veillez à remplacer <region>, <namespace> et <bucket-name> dans l'URI de banque d'objets de façon appropriée. SRC_OCIGGLL.dmp est un fichier qui sera créé lors de l'exécution du script.
    DECLARE
    ind NUMBER;              -- Loop index
    h1 NUMBER;               -- Data Pump job handle
    percent_done NUMBER;     -- Percentage of job complete
    job_state VARCHAR2(30);  -- To keep track of job state
    le ku$_LogEntry;         -- For WIP and error messages
    js ku$_JobStatus;        -- The job status from get_status
    jd ku$_JobDesc;          -- The job description from get_status
    sts ku$_Status;          -- The status object returned by get_status
    
    BEGIN
    -- Create a (user-named) Data Pump job to do a schema export.
    h1 := DBMS_DATAPUMP.OPEN('EXPORT','SCHEMA',NULL,'SRC_OCIGGLL_EXPORT','LATEST');
    
    -- Specify a single dump file for the job (using the handle just returned
    -- and a directory object, which must already be defined and accessible
    -- to the user running this procedure.
    DBMS_DATAPUMP.ADD_FILE(h1,'https://objectstorage.<region>.oraclecloud.com/n/<namespace>/b/<bucket-name>/o/SRC_OCIGGLL.dmp','ADB_OBJECTSTORE','100MB',DBMS_DATAPUMP.KU$_FILE_TYPE_URIDUMP_FILE,1);
    
    -- A metadata filter is used to specify the schema that will be exported.
    DBMS_DATAPUMP.METADATA_FILTER(h1,'SCHEMA_EXPR','IN (''SRC_OCIGGLL'')');
    
    -- Start the job. An exception will be generated if something is not set up properly.
    DBMS_DATAPUMP.START_JOB(h1);
    
    -- The export job should now be running. In the following loop, the job
    -- is monitored until it completes. In the meantime, progress information is displayed.
    percent_done := 0;
    job_state := 'UNDEFINED';
    while (job_state != 'COMPLETED') and (job_state != 'STOPPED') loop
      dbms_datapump.get_status(h1,dbms_datapump.ku$_status_job_error + dbms_datapump.ku$_status_job_status + dbms_datapump.ku$_status_wip,-1,job_state,sts);
      js := sts.job_status;
    
    -- If the percentage done changed, display the new value.
    if js.percent_done != percent_done
    then
      dbms_output.put_line('*** Job percent done = ' || to_char(js.percent_done));
      percent_done := js.percent_done;
    end if;
    
    -- If any work-in-progress (WIP) or error messages were received for the job, display them.
    if (bitand(sts.mask,dbms_datapump.ku$_status_wip) != 0)
    then
      le := sts.wip;
    else
      if (bitand(sts.mask,dbms_datapump.ku$_status_job_error) != 0)
      then
        le := sts.error;
      else
        le := null;
      end if;
    end if;
    if le is not null
    then
      ind := le.FIRST;
      while ind is not null loop
        dbms_output.put_line(le(ind).LogText);
        ind := le.NEXT(ind);
      end loop;
    end if;
      end loop;
    
      -- Indicate that the job finished and detach from it.
      dbms_output.put_line('Job has completed');
      dbms_output.put_line('Final job state = ' || job_state);
      dbms_datapump.detach(h1);
    END;

Tâche 5 : instancier la base de données cible à l'aide d'Oracle Data Pump (ImpDP)

Utilisez Oracle Data Pump (ImpDP) pour importer des données dans la base de données cible à partir du fichier SRC_OCIGGLL.dmp exporté depuis la base de données source.

  1. Créez des informations d'identification dans la base de données cible pour accéder à la banque d'objets Oracle (à l'aide des mêmes informations que dans la section précédente).
    BEGIN
      DBMS_CLOUD.CREATE_CREDENTIAL( 
        credential_name => 'ADB_OBJECTSTORE',
        username => '<user-name>',
        password => '<token>'
      );
    END;
  2. Exécutez le script suivant dans la base de données cible pour importer des données à partir du fichier SRC_OCIGGLL.dmp. Veillez à remplacer <region>, <namespace> et <bucket-name> dans l'URI de banque d'objets de façon appropriée :
    DECLARE
    ind NUMBER;  -- Loop index
    h1 NUMBER;  -- Data Pump job handle
    percent_done NUMBER;  -- Percentage of job complete
    job_state VARCHAR2(30);  -- To keep track of job state
    le ku$_LogEntry;  -- For WIP and error messages
    js ku$_JobStatus;  -- The job status from get_status
    jd ku$_JobDesc;  -- The job description from get_status
    sts ku$_Status;  -- The status object returned by get_status
    BEGIN
    
    -- Create a (user-named) Data Pump job to do a "full" import (everything
    -- in the dump file without filtering).
    h1 := DBMS_DATAPUMP.OPEN('IMPORT','FULL',NULL,'SRCMIRROR_OCIGGLL_IMPORT');
    
    -- Specify the single dump file for the job (using the handle just returned)
    -- and directory object, which must already be defined and accessible
    -- to the user running this procedure. This is the dump file created by
    -- the export operation in the first example.
    
    DBMS_DATAPUMP.ADD_FILE(h1,'https://objectstorage.<region>.oraclecloud.com/n/<namespace>/b/<bucket-name>/o/SRC_OCIGGLL.dmp','ADB_OBJECTSTORE',null,DBMS_DATAPUMP.KU$_FILE_TYPE_URIDUMP_FILE);
    
    
    -- A metadata remap will map all schema objects from SRC_OCIGGLL to SRCMIRROR_OCIGGLL.
    DBMS_DATAPUMP.METADATA_REMAP(h1,'REMAP_SCHEMA','SRC_OCIGGLL','SRCMIRROR_OCIGGLL');
    
    -- If a table already exists in the destination schema, skip it (leave
    -- the preexisting table alone). This is the default, but it does not hurt
    -- to specify it explicitly.
    DBMS_DATAPUMP.SET_PARAMETER(h1,'TABLE_EXISTS_ACTION','SKIP');
    
    -- Start the job. An exception is returned if something is not set up properly.
    DBMS_DATAPUMP.START_JOB(h1);
    
    -- The import job should now be running. In the following loop, the job is
    -- monitored until it completes. In the meantime, progress information is
    -- displayed. Note: this is identical to the export example.
    percent_done := 0;
    job_state := 'UNDEFINED';
    while (job_state != 'COMPLETED') and (job_state != 'STOPPED') loop
      dbms_datapump.get_status(h1,
        dbms_datapump.ku$_status_job_error +
        dbms_datapump.ku$_status_job_status +
        dbms_datapump.ku$_status_wip,-1,job_state,sts);
        js := sts.job_status;
    
      -- If the percentage done changed, display the new value.
      if js.percent_done != percent_done
      then
        dbms_output.put_line('*** Job percent done = ' ||
        to_char(js.percent_done));
        percent_done := js.percent_done;
      end if;
    
      -- If any work-in-progress (WIP) or Error messages were received for the job, display them.
      if (bitand(sts.mask,dbms_datapump.ku$_status_wip) != 0)
      then
        le := sts.wip;
      else
        if (bitand(sts.mask,dbms_datapump.ku$_status_job_error) != 0)
        then
          le := sts.error;
        else
          le := null;
        end if;
      end if;
      if le is not null
      then
        ind := le.FIRST;
        while ind is not null loop
          dbms_output.put_line(le(ind).LogText);
          ind := le.NEXT(ind);
        end loop;
      end if;
    end loop;
    
    -- Indicate that the job finished and gracefully detach from it.
    dbms_output.put_line('Job has completed');
    dbms_output.put_line('Final job state = ' || job_state);
    dbms_datapump.detach(h1);
    END;

Tâche 6 : ajouter et exécuter une réplication non intégrée

  1. Ajoutez et exécutez une réplication.
    1. Sur l'écran Fichier de paramètres, remplacez MAP *.*, TARGET *.*; par le script suivant :
      -- Capture DDL operations for listed schema tables
      --
      ddl include mapped
      --
      -- Add step-by-step history of ddl operations captured
      -- to the report file. Very useful when troubleshooting.
      --
      ddloptions report
      --
      -- Write capture stats per table to the report file daily.
      --
      report at 00:01
      --
      -- Rollover the report file weekly. Useful when PR runs
      -- without being stopped/started for long periods of time to
      -- keep the report files from becoming too large.
      --
      reportrollover at 00:01 on Sunday
      --
      -- Report total operations captured, and operations per second
      -- every 10 minutes.
      --
      reportcount every 10 minutes, rate
      --
      -- Table map list for apply
      --
      DBOPTIONS ENABLE_INSTANTIATION_FILTERING;
      MAP SRC_OCIGGLL.*, TARGET SRCMIRROR_OCIGGLL.*;

      Remarques :

      DBOPTIONS ENABLE_INSTATIATION_FILTERING active le filtrage de numéros CSN sur les tables importées en utilisant Oracle Data Pump. Pour plus d'informations, reportez-vous à Référence DBOPTIONS.
  2. Apportez des modifications à la base de données A pour les voir répliquées vers la base de données B.

Tâche 7 : configurer la réplication de la base de données B vers la base de données A

Les tâches 1 à 6 ont établi la réplication de la base de données A vers la base de données B. Les étapes suivantes configurent la réplication de la base de données B vers la base de données A.

  1. Ajoutez et exécutez une extraction sur la base de données B. Sur la page des paramètres d'extraction après EXTRAIL <extract-name>, veillez à inclure les éléments suivants :
    -- Table list for capture
    table SRCMIRROR_OCIGGLL.*;
    
    -- Exclude changes made by GGADMIN
    tranlogoptions excludeuser ggadmin
  2. Ajoutez et exécutez une réplication vers la base de données A. Sur la page Paramètres, remplacez MAP *.*, TARGET *.*; par l'élément suivant :
    MAP SRCMIRROR_OCIGGLL.*, TARGET SRC_OCIGGLL.*;
  3. Apportez des modifications à la base de données B pour les voir répliquées vers la base de données A.

Tâche 8 : surveiller les processus et en assurer la maintenance

  1. Surveillez les performances.
  2. Gérez les fichiers de trace.