Valider la cohérence des données avec les déploiements de vérification des données

Découvrez comment valider la cohérence des données entre les bases de données source et cible à l'aide d'OCI GoldenGate.

Avant de commencer

Pour mener à Bien ce démarrage rapide, vous devez disposer des éléments suivants :

Tâche 1 : configurer l'environnement

  1. Créer un déploiement de réplication de données.

  2. Créez une connexion Oracle Autonomous AI Transaction Processing (ATP) source.

  3. Créez une connexion Autonomous AI Lakehouse (ALK) cible.

  4. Affecter une connexion au déploiement.

  5. Utilisez l'outil SQL pour activer la journalisation supplémentaire :

    ALTER DATABASE ADD SUPPLEMENTAL LOG DATA
  6. Exécutez la requête suivante dans l'outil SQL pour vous assurer que support_mode=FULL pour toutes les tables la base de données source :

    select * from DBA_GOLDENGATE_SUPPORT_MODE where owner = 'SRC_OCIGGLL';

Tâche 2 : 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, sélectionnez Lancer la console.

  2. Si nécessaire, entrez oggadmin pour le nom utilisateur et le mot de passe que vous avez utilisés lors de la création du déploiement, puis sélectionnez Connexion.

  3. Ajouter des données de transaction et une table de points de reprise :

    1. Ouvrez le menu de navigation, puis sélectionnez Connexions de base de données.

    2. Sélectionnez Connexion à la base de données SourceDB.

    3. Dans le menu de navigation, sélectionnez Trandata, puis Ajouter Trandata (icône Plus).

    4. Dans Nom du schéma, entrez SRC_OCIGGLL, puis sélectionnez Soumettre.

    5. Pour vérifier, entrez SRC_OCIGGLL dans le champ Rechercher et sélectionnez Rechercher.

    6. Ouvrez le menu de navigation, puis sélectionnez Connexions de base de données.

    7. Sélectionnez Connexion à la base de données TargetDB.

    8. Dans le menu de navigation, sélectionnez Point de reprise, puis Ajouter un point de reprise (icône Plus).

    9. Dans Table de point de reprise, entrez "SRCMIRROR_OCIGGLL"."CHECKTABLE", puis sélectionnez Soumettre.

  4. Ajoutez une extraction.

    Remarque : Pour plus d'informations sur les paramètres que vous pouvez utiliser pour spécifier des tables source, voir Options de paramètre d'extraction supplémentaires.

    Sur la page Paramètres d'extraction, ajoutez les lignes suivantes sous EXTTRAIL <trail-name> :

    -- Capture DDL operations for listed schema tables
    ddl include mapped
    
    -- Add step-by-step history of to the report file. 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.*;
  5. Recherchez les éventuelles transactions à longue durée d'exécution. 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 3 : 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 4 : 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 5 : ajouter et exécuter une réplication non intégrée

  1. Ajoutez et exécutez une réplication.

    Sur l'écran Fichier de paramètre, 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.*;

    Remarque : 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. Effectuez des insertions dans la base de données source :

    1. Revenez à la console Oracle Cloud et utilisez le menu de navigation pour revenir à Oracle AI Database, à Autonomous AI Transaction Processing, puis à SourceDB.

    2. Sur la page Détails de la base de données source, sélectionnez Database actions, puis SQL.

    3. Entrez les insertions suivantes, puis sélectionnez Exécuter le script :

      Insert into SRC_OCIGGLL.SRC_CITY (CITY_ID,CITY,REGION_ID,POPULATION) values (1000,'Houston',20,743113);
      Insert into SRC_OCIGGLL.SRC_CITY (CITY_ID,CITY,REGION_ID,POPULATION) values (1001,'Dallas',20,822416);
      Insert into SRC_OCIGGLL.SRC_CITY (CITY_ID,CITY,REGION_ID,POPULATION) values (1002,'San Francisco',21,157574);
      Insert into SRC_OCIGGLL.SRC_CITY (CITY_ID,CITY,REGION_ID,POPULATION) values (1003,'Los Angeles',21,743878);
      Insert into SRC_OCIGGLL.SRC_CITY (CITY_ID,CITY,REGION_ID,POPULATION) values (1004,'San Diego',21,840689);
      Insert into SRC_OCIGGLL.SRC_CITY (CITY_ID,CITY,REGION_ID,POPULATION) values (1005,'Chicago',23,616472);
      Insert into SRC_OCIGGLL.SRC_CITY (CITY_ID,CITY,REGION_ID,POPULATION) values (1006,'Memphis',23,580075);
      Insert into SRC_OCIGGLL.SRC_CITY (CITY_ID,CITY,REGION_ID,POPULATION) values (1007,'New York City',22,124434);
      Insert into SRC_OCIGGLL.SRC_CITY (CITY_ID,CITY,REGION_ID,POPULATION) values (1008,'Boston',22,275581);
      Insert into SRC_OCIGGLL.SRC_CITY (CITY_ID,CITY,REGION_ID,POPULATION) values (1009,'Washington D.C.',22,688002);
    4. Dans la console de déploiement OCI GoldenGate, sélectionnez le nom d'extraction (UAEXT), puis sélectionnez Statistiques. Vérifiez que SRC_OCIGGLL.SRC_CITY est répertorié avec 10 insertions.

    5. Revenez à l'écran Overview, sélectionnez le nom de réplication (REP), puis sélectionnez Statistics. Vérifiez que SRCMIRROR_OCIGGLL.SRC_CITY est répertorié avec 10 insertions

Tâche 6 : créer des ressources de vérification des données

  1. Créez un déploiement de serveur de vérification des données.

  2. Créez 2 déploiements d'agent de vérification des données.

  3. Créez une connexion GoldenGate.

  4. Affectez la connexion ATP créée dans la tâche 1 à l'un des déploiements d'agent.

  5. Affectez la connexion ALK créée dans la tâche 1 à l'autre déploiement d'agent.

  6. Affectez la connexion GoldenGate au déploiement du serveur.

  7. Une fois les déploiements activés, vérifiez les environnements de vérification des données :

    1. Sur la page de détails du déploiement de serveur, sélectionnez Lancer la console.

    2. Dans le menu de navigation, sélectionnez Connexions.

    3. Dans la page Connexions, vérifiez que vos agents apparaissent dans la liste et que leur statut est Actif.

Tâche 7 : créer un groupe et comparer une paire

Dans le déploiement du serveur, créez une configuration de comparaison :

  1. Dans le menu de navigation, sélectionnez Groupes et paires de comparaison.

  2. Sur la page Groupes et paires de comparaison, sélectionnez Créer.

  3. Sur la page Configuration Créer un groupe et comparer une paire, renseignez les champs comme suit, puis sélectionnez Suivant :

    1. Entrez un nom.

    2. Sélectionnez la source et les connexions cible dans leurs listes déroulantes respectives.

    3. Sélectionnez la source et les catalogues cible dans leurs listes déroulantes respectives.

    4. Ajouter une paire de comparaison

  4. Vérifiez les règles de mise en correspondance, puis sélectionnez Suivant.

  5. Consultez la page Mise en correspondance, puis sélectionnez Générer des paires de comparaison.

  6. Enregistrez le groupe.

Tâche 8 : créer et exécuter le travail de comparaison

  1. Dans le menu de navigation, sélectionnez Travaux.

  2. Sur la page Travaux, sélectionnez Créer.

  3. Sur la page Créer un travail, renseignez les champs comme suit, puis sélectionnez Soumettre :

    1. Entrez un nom pour le travail.

    2. Sélectionnez Ajouter un groupe, sélectionnez le groupe créé dans la tâche 7, puis Ajouter et enregistrer.

  4. Dans le menu de navigation, sélectionnez Exécuter le travail.

  5. Sur la page Exécuter le travail, sélectionnez le travail créé à l'étape 3 et le profil par défaut, puis sélectionnez Exécuter le travail.

Tâche 9 : analyser les résultats

  1. Dans le menu de navigation, sélectionnez Surveiller les travaux.

  2. Sélectionnez Travaux terminés.

  3. Sélectionnez votre travail pour en afficher les détails, puis vérifiez les points suivants :

    • Aucune ligne n'est marquée comme désynchronisée.
    • Aucune ligne manquante ou supplémentaire n'a été déclarée

A ce stade, les bases de données source et cible sont synchronisées.

Tâche 10 : présenter les incohérences de données

Dans cette tâche, vous allez introduire des incohérences contrôlées dans la base de données cible à l'aide de la table SRCMIRROR_OCIGGLL.SRC_CITY.

  1. Vérifiez les données existantes sur la cible. Dans la feuille de calcul SQL ALK cible, entrez les informations suivantes :

    SELECT CITY_ID, CITY, REGION_ID, POPULATION
    FROM SRCMIRROR_OCIGGLL.SRC_CITY
    WHERE CITY_ID BETWEEN 1000 AND 1009
    ORDER BY CITY_ID;
  2. Effacez la feuille de calcul, puis entrez les informations suivantes pour introduire une non-concordance de données :

    UPDATE SRCMIRROR_OCIGGLL.SRC_CITY
    SET POPULATION = 999999
    WHERE CITY_ID = 1003;
    
    COMMIT;
  3. Effacez la feuille de calcul, puis saisissez les informations suivantes pour introduire une ligne manquante :

    DELETE FROM SRCMIRROR_OCIGGLL.SRC_CITY
    WHERE CITY_ID = 1005;
    
    COMMIT;
  4. Effacez la feuille de calcul, puis saisissez les informations suivantes pour ajouter une ligne supplémentaire :

    INSERT INTO SRCMIRROR_OCIGGLL.SRC_CITY (CITY_ID, CITY, REGION_ID, POPULATION)
    VALUES (1010, 'Test City', 99, 123456);
    
    COMMIT;
  5. Effacez la feuille de travail, puis saisissez les informations suivantes pour valider les problèmes introduits :

    SELECT CITY_ID, CITY, REGION_ID, POPULATION
    FROM SRCMIRROR_OCIGGLL.SRC_CITY
    WHERE CITY_ID BETWEEN 1000 AND 1010
    ORDER BY CITY_ID;

    Vous devez observer les points suivants :

    • CITY_ID 1003 comporte une population incorrecte
    • CITY_ID 1005 est manquant
    • CITY_ID 1010 existe uniquement dans la cible

Tâche 11 : réparer les écarts de données avec Veridata

Maintenant que vous avez des différences de données entre la source et la cible, vous pouvez réexécuter la comparaison et les réparer.

  1. Dans le menu de navigation de la console de déploiement du serveur, sélectionnez Exécuter les travaux.

  2. Sélectionnez votre travail de comparaison, puis Exécuter le travail.

  3. Dans le menu de navigation, sélectionnez Surveiller les travaux.

  4. Sélectionnez votre travail de comparaison pour en afficher les détails. Confirmez les éléments suivants :

    • Les lignes sont marquées comme non synchronisées
    • Les différences incluent :
      • Lignes manquantes
      • Lignes supplémentaires
      • Non-concordance de colonne
  5. Dans la page Détails du travail, recherchez SRC_CITY=SRC_CITY, puis sélectionnez le nom de la paire de comparaison pour en afficher les détails.

  6. Dans les détails de la paire de comparaison, sélectionnez Lignes non synchronisées, puis vérifiez les divergences.

  7. Sélectionnez Réparation.

  8. Dans la boîte de dialogue Travail de réparation, sélectionnez Réparer toutes les lignes non synchronisées, puis Soumettre.

    Vous créez ainsi un travail de réparation qui synchronise la cible avec la source.

  9. Dans le menu de navigation, sélectionnez Surveiller le travail de réparation. Recherchez le travail de réparation et surveillez-le jusqu'à ce qu'il soit terminé.

  10. Une fois le travail de réparation terminé, sélectionnez-le pour afficher ses détails. Confirmez les éléments suivants :

    • Les lignes ont été mises à jour, insérées ou supprimées selon les besoins.
    • Aucune erreurs ne s'est produite.
  11. Réexécutez la comparaison.

    1. Dans le menu de navigation, sélectionnez Travaux.

    2. Sélectionnez votre travail de comparaison, puis Exécuter le travail.

    3. Revenez à Surveiller les travaux et attendez que le travail soit terminé.

    4. Une fois le travail terminé, affichez ses détails pour confirmer ce qui suit :

      • Aucune ligne n'est marquée comme non synchronisée
      • Aucune ligne manquante
      • Aucune ligne supplémentaire
      • Aucune non-concordance de colonne

Les jeux de données source et cible sont désormais entièrement synchronisés.