데이터 검증 배포를 통해 데이터 일관성 검증

OCI GoldenGate를 사용하여 소스 및 타깃 데이터베이스 간의 데이터 일관성을 검증하는 방법을 살펴보세요.

시작하기 전에

이 빠른 시작을 성공적으로 완료하려면 다음이 있어야 합니다.

작업 1: 환경 설정

  1. 데이터 복제 배치를 생성합니다.

  2. 소스 Oracle Autonomous AI Transaction Processing(ATP) 연결을 생성합니다.

  3. 대상 자율운영 AI 레이크하우스(ALK) 접속을 생성합니다.

  4. 배포에 연결을 지정합니다.

  5. SQL 툴을 사용하여 보완 로깅 활성화:

    ALTER DATABASE ADD SUPPLEMENTAL LOG DATA
  6. SQL 도구에서 다음 질의를 실행하여 소스 데이터베이스의 모든 테이블에 대해 support_mode=FULL을 확인합니다.

    select * from DBA_GOLDENGATE_SUPPORT_MODE where owner = 'SRC_OCIGGLL';

작업 2: 통합 Extract 생성

통합 추출은 소스 데이터베이스에 대한 지속적인 변경사항을 캡처합니다.

  1. 배치 세부정보 페이지에서 콘솔 실행을 선택합니다.

  2. 필요한 경우 사용자 이름으로 oggadmin을 입력하고 배치를 생성할 때 사용한 암호를 입력한 다음 사인인을 선택합니다.

  3. 트랜잭션 데이터 및 체크포인트 테이블 추가:

    1. 탐색 메뉴를 열고 DB 접속을 선택합니다.

    2. 데이터베이스 SourceDB에 접속을 선택합니다.

    3. 탐색 메뉴에서 Trandata를 선택한 다음 Trandata 추가(더하기 아이콘)를 선택합니다.

    4. 스키마 이름SRC_OCIGGLL을 입력한 다음 제출을 선택합니다.

    5. 확인하려면 검색 필드에 SRC_OCIGGLL을 입력하고 검색을 선택합니다.

    6. 탐색 메뉴를 열고 DB 접속을 선택합니다.

    7. 데이터베이스 TargetDB에 접속을 선택합니다.

    8. 탐색 메뉴에서 체크포인트를 선택한 다음 체크포인트 추가(더하기 아이콘)를 선택합니다.

    9. 체크포인트 테이블"SRCMIRROR_OCIGGLL"."CHECKTABLE"을 입력한 다음 제출을 선택합니다.

  4. 추출 추가.

    주: 소스 테이블을 지정하는 데 사용할 수 있는 매개변수에 대한 자세한 내용은 추가 추출 매개변수 옵션을 참조하십시오.

    [매개변수 추출] 페이지에서 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. 장기 실행 트랜잭션을 확인합니다. 소스 데이터베이스에서 다음 스크립트를 실행합니다.

    select start_scn, start_time from gv$transaction where start_scn < (select max(start_scn) from dba_capture);

    query에서 행을 반환하면 트랜잭션의 SCN을 찾은 다음 트랜잭션을 커밋하거나 롤백해야 합니다.

작업 3: Oracle Data Pump를 사용하여 데이터 엑스포트(ExpDP)

Oracle Data Pump(ExpDP)를 사용하여 원본 데이터베이스의 데이터를 Oracle Object Store로 엑스포트합니다.

  1. Oracle Object Store 버킷을 생성합니다.

    Export 및 Import 스크립트에 사용할 네임스페이스와 버킷 이름을 기록해 둡니다.

  2. 인증 토큰을 생성한 다음 나중에 사용할 수 있도록 토큰 문자열을 복사하여 텍스트 편집기에 붙여 넣습니다.

  3. 소스 데이터베이스에 인증서를 생성하고 <user-name><token>를 이전 단계에서 생성한 Oracle Cloud 계정 사용자 이름 및 토큰 문자열로 바꿉니다.

    BEGIN
      DBMS_CLOUD.CREATE_CREDENTIAL(
        credential_name => 'ADB_OBJECTSTORE',
        username => '<user-name>',
        password => '<token>'
      );
    END;
  4. 소스 데이터베이스에서 다음 스크립트를 실행하여 데이터 익스포트 작업을 생성합니다. 객체 저장소 URI의 <region>, <namespace><bucket-name>를 적절히 바꿔야 합니다. SRC_OCIGGLL.dmp은 이 스크립트가 실행될 때 생성되는 파일입니다.

    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;

작업 4: Oracle Data Pump(ImpDP)를 사용하여 대상 데이터베이스 인스턴스화

Oracle Data Pump(ImpDP)를 사용하여 소스 데이터베이스에서 익스포트된 SRC_OCIGGLL.dmp에서 대상 데이터베이스로 데이터를 임포트합니다.

  1. 이전 섹션의 동일한 정보를 사용하여 Oracle Object Store에 액세스할 수 있도록 Target Database에 인증서를 생성합니다.

    BEGIN
      DBMS_CLOUD.CREATE_CREDENTIAL(
        credential_name => 'ADB_OBJECTSTORE',
        username => '<user-name>',
        password => '<token>'
      );
    END;
  2. 대상 데이터베이스에서 다음 스크립트를 실행하여 SRC_OCIGGLL.dmp에서 데이터를 임포트합니다. 객체 저장소 URI의 <region>, <namespace><bucket-name>를 적절하게 바꿔야 합니다.

    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;

작업 5: 통합되지 않은 Replicat 추가 및 실행

  1. 복제 추가 및 실행.

    Parameter File 화면에서 MAP *.*, TARGET *.*;을 다음 스크립트로 바꿉니다.

    -- 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.*;

    주: DBOPTIONS ENABLE_INSTATIATION_FILTERING는 Oracle Data Pump를 사용하여 임포트된 테이블에 대해 CSN 필터링을 사용으로 설정합니다. 자세한 내용은 DBOPTIONS Reference를 참조하십시오.

  2. 원본 데이터베이스에 삽입 수행:

    1. Oracle Cloud 콘솔로 돌아가서 탐색 메뉴를 사용하여 Oracle AI Database, Autonomous AI Transaction Processing, SourceDB 순으로 돌아갑니다.

    2. SourceDB 세부 정보 페이지에서 데이터베이스 작업을 선택한 다음 SQL을 선택합니다.

    3. 다음 삽입을 입력한 다음 스크립트 실행을 선택합니다.

      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. OCI GoldenGate 배치 콘솔에서 이름 추출(UAEXT)을 선택한 다음 통계를 선택합니다. SRC_OCIGGLL.SRC_CITY가 10개의 삽입과 함께 나열되는지 확인합니다.

    5. Overview 화면으로 돌아가서 Replicat name (REP)을 선택한 다음 Statistics를 선택합니다. 10개의 삽입과 함께 SRCMIRROR_OCIGGLL.SRC_CITY가 나열되는지 확인합니다.

작업 6: 데이터 확인 리소스 생성

  1. 데이터 확인 서버 배치를 생성합니다.

  2. 2개의 데이터 확인 에이전트 배치를 생성합니다.

  3. GoldenGate 접속 생성.

  4. 태스크 1에서 생성된 ATP 연결을 에이전트 배치 중 하나에 지정합니다.

  5. 작업 1에서 생성한 ALK 연결을 다른 에이전트 배치에 할당합니다.

  6. GoldenGate 접속을 서버 배치에 지정합니다.

  7. 배포가 활성화되면 데이터 확인 환경을 검토합니다.

    1. 서버 배치의 세부정보 페이지에서 콘솔 실행을 선택합니다.

    2. 탐색 메뉴에서 연결을 선택합니다.

    3. Connections 페이지에서 에이전트가 리스트에 나타나고 해당 상태가 Active인지 확인합니다.

작업 7: 그룹 생성 및 비교 쌍

Server 배치에서 비교 구성을 생성합니다.

  1. 탐색 메뉴에서 그룹 및 비교 쌍을 선택합니다.

  2. 그룹 및 비교 쌍 페이지에서 생성을 선택합니다.

  3. 그룹 생성 및 비교 쌍 구성 페이지에서 다음과 같이 필드에 정보를 입력한 다음 다음을 선택합니다.

    1. 이름을 입력합니다.

    2. 해당 드롭다운에서 소스대상 접속을 선택합니다.

    3. 해당 드롭다운에서 소스대상 카탈로그를 선택합니다.

    4. 비교 쌍 추가

  4. 매핑 규칙을 검토한 후 다음을 선택합니다.

  5. 매핑 페이지를 검토한 다음 비교 쌍 생성을 선택합니다.

  6. 그룹을 저장합니다.

작업 8: 비교 작업 생성 및 실행

  1. 탐색 메뉴에서 작업을 선택합니다.

  2. [작업] 페이지에서 생성을 선택합니다.

  3. [작업 생성] 페이지에서 다음과 같이 필드에 정보를 입력한 다음 제출을 선택합니다.

    1. 작업에 대한 이름을 입력합니다.

    2. 그룹 추가를 선택하고 태스크 7에서 생성된 그룹을 선택한 다음 추가 및 저장을 선택합니다.

  4. 탐색 메뉴에서 작업 실행을 선택합니다.

  5. [작업 실행] 페이지에서 3단계에서 생성한 작업과 기본 프로파일을 선택한 다음 작업 실행을 선택합니다.

작업 9: 결과 분석

  1. 탐색 메뉴에서 Monitor Jobs를 선택합니다.

  2. 완료된 작업을 선택합니다.

  3. 작업을 선택하여 해당 세부 정보를 확인한 후 다음을 확인합니다.

    • 동기화되지 않음으로 표시된 행이 없습니다.
    • 누락되거나 추가 행이 보고되지 않았습니다.

이 단계에서는 소스 및 대상 데이터베이스가 동기화됩니다.

작업 10: 데이터 불일치 소개

이 작업에서는 SRCMIRROR_OCIGGLL.SRC_CITY 테이블을 사용하여 제어된 불일치를 대상 데이터베이스에 삽입합니다.

  1. 대상의 기존 데이터를 확인합니다. 대상 ALK SQL Worksheet에서 다음을 입력합니다.

    SELECT CITY_ID, CITY, REGION_ID, POPULATION
    FROM SRCMIRROR_OCIGGLL.SRC_CITY
    WHERE CITY_ID BETWEEN 1000 AND 1009
    ORDER BY CITY_ID;
  2. 워크시트를 지운 후 다음을 입력하여 데이터 불일치를 삽입합니다.

    UPDATE SRCMIRROR_OCIGGLL.SRC_CITY
    SET POPULATION = 999999
    WHERE CITY_ID = 1003;
    
    COMMIT;
  3. 워크시트를 지운 후 다음을 입력하여 누락된 행을 삽입합니다.

    DELETE FROM SRCMIRROR_OCIGGLL.SRC_CITY
    WHERE CITY_ID = 1005;
    
    COMMIT;
  4. 워크시트를 지운 후 다음을 입력하여 추가 행을 삽입합니다.

    INSERT INTO SRCMIRROR_OCIGGLL.SRC_CITY (CITY_ID, CITY, REGION_ID, POPULATION)
    VALUES (1010, 'Test City', 99, 123456);
    
    COMMIT;
  5. 워크시트를 지운 후 다음을 입력하여 도입된 문제를 검증합니다.

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

    다음 사항을 확인해야 합니다.

    • CITY_ID 1003에 잘못된 모집단이 있습니다.
    • CITY_ID 1005가 누락되었습니다.
    • CITY_ID 1010는 대상에만 존재합니다.

작업 11: Veridata를 사용하여 데이터 불일치 복구

이제 소스와 대상 간에 약간의 데이터 불일치가 있으므로 비교를 다시 실행하고 복구할 수 있습니다.

  1. 서버 배치 콘솔 탐색 메뉴에서 작업 실행을 선택합니다.

  2. 비교 작업을 선택한 다음 작업 실행을 선택합니다.

  3. 탐색 메뉴에서 Monitor Jobs를 선택합니다.

  4. 세부 정보를 보려면 비교 작업을 선택합니다. 다음을 확인합니다.

    • 행이 동기화되지 않음으로 표시됨
    • 차이점은 다음과 같습니다.
      • 행 누락
      • 추가 행
      • 열 불일치
  5. Job Details 페이지에서 SRC_CITY=SRC_CITY을 찾은 다음 Compare Pair 이름을 선택하여 세부 정보를 확인합니다.

  6. 비교 쌍 세부정보에서 동기화되지 않은 행을 선택한 다음 불일치를 검토합니다.

  7. 복구를 선택합니다.

  8. 복구 작업 대화상자에서 동기화되지 않은 모든 행 복구를 선택한 다음 제출을 선택합니다.

    이렇게 하면 대상을 소스와 동기화하는 복구 작업이 생성됩니다.

  9. 탐색 메뉴에서 수리 작업 모니터링을 선택합니다. 복구 작업을 찾아 완료될 때까지 모니터합니다.

  10. 복구 작업이 완료된 후 해당 작업을 선택하여 세부정보를 봅니다. 다음을 확인합니다.

    • 필요에 따라 행이 갱신, 삽입 또는 삭제되었습니다.
    • 오류가 발생하지 않았습니다.
  11. 비교를 다시 실행합니다.

    1. 탐색 메뉴에서 작업을 선택합니다.

    2. 비교 작업을 선택한 다음 작업 실행을 선택합니다.

    3. 작업 모니터링으로 돌아가서 작업이 완료될 때까지 기다립니다.

    4. 작업이 완료되면 세부 정보를 확인하여 다음을 확인합니다.

      • 동기화되지 않음으로 표시된 행이 없습니다.
      • 누락된 행 없음
      • 추가 행 없음
      • 열 불일치 없음

이제 소스 및 대상 데이터 세트가 완전히 동기화됩니다.