HANDLECOLLISIONS | NOHANDLECOLLISIONS

유효 기간

Replicat

설명

HANDLECOLLISIONS 및 NOHANDLECOLLISIONS 매개변수를 사용하여 Replicat가 대상에 SQL을 적용할 때 중복 레코드 및 누락된 레코드 오류를 해결하려고 할지 여부를 제어합니다. 충돌이라고 하는 이 오류는 초기 로드 중, 즉 Oracle GoldenGate가 테이블에 발생한 트랜잭션 변경사항을 복제하는 동안 소스 데이터베이스의 데이터를 대상 테이블로 실행할 때 발생합니다. Oracle GoldenGate가 로드가 완료된 후 복제된 변경사항을 적용하는 경우 HANDLECOLLISIONS는 이러한 충돌에 대한 오류 처리 논리를 Replicat에 제공합니다.

다음과 같은 방법으로 HANDLECOLLISIONS 및 NOHANDLECOLLISIONS를 사용할 수 있습니다.

앞의 메소드를 결합할 수 있습니다. 글로벌 충돌 처리 규칙을 지정한 다음 MAP 문에서 다른 충돌 처리 규칙으로 해당 규칙을 대체할 수 있습니다. MAP 사양은 항상 전역 사양을 대체합니다.

참고: 통합 Replicat의 오류 처리는 HANDLECOLLISIONS에 적합하지 않습니다. Oracle은 HANDLECOLLISIONS를 사용하는 대신 정확한 인스턴스화 방법을 사용할 것을 권장합니다.

HowHANDLECOLLISIONSWorks

다음 예에서는 HANDLECOLLISIONS 작동 방법에 대해 설명합니다.

  1. 애플리케이션이 소스 table1의 레코드 A를 업데이트합니다.

  2. Extract가 업데이트를 추출합니다.

  3. 애플리케이션에서 출처 table1의 레코드 A를 삭제합니다.

  4. 추출은 삭제를 추출합니다.

  5. Oracle GoldenGate는 레코드 A 없이 소스 table1에서 초기 로드 데이터를 추출합니다.

  6. Oracle GoldenGate는 레코드 A 없이 초기 로드를 적용합니다.

  7. Replicat는 레코드 A의 업데이트를 적용하려고 시도합니다.

  8. 데이터베이스에서 "레코드 누락" 오류를 반환합니다.

  9. Replicat는 레코드 A의 삭제를 적용하려고 시도합니다.

  10. 데이터베이스에서 "레코드 누락" 오류를 반환합니다.

Replicat가 후속 오류를 자동으로 처리하지 않도록 초기 로드 중 캡처된 트랜잭션 변경사항이 대상 테이블에 적용된 후 HANDLECOLLISIONS를 사용 안함으로 설정합니다. 초기 동기화 후 생성되는 오류는 비정상적인 조건을 나타내며 해결 방법을 결정할 수 있는 사람이 평가해야 합니다. 예를 들어, 누락된 레코드 오류는 소스 시스템에 있는 레코드가 실수로 대상 시스템에서 삭제되었음을 나타낼 수 있습니다.

다음과 같은 방법으로 HANDLECOLLISIONS를 해제할 수 있습니다.

누락된 열 값을 피하는 가능한 솔루션

데이터베이스가 기본적으로 소스 테이블의 모든 열 값을 기록하지 않는 경우 Replicat가 기본 키 업데이트를 삽입으로 변환하려고 할 때 대상 테이블에 NOT NULL 제약 조건이 있으면 오류가 발생할 수 있습니다. 다음 방법으로 이 시나리오를 해결할 수 있습니다.

데이터베이스에 기본적으로 모든 열이 포함된 경우 HANDLECOLLISIONS가 제대로 작동하려면 NOCOMPRESSUPDATES 및 NOCOMPRESSDELETES를 사용해야 합니다. 데이터베이스가 NOCOMPRESSDELETES를 지원하지 않는 경우 FETCHOPTIONS MISSINGCOLS를 사용해야 합니다.

Oracle GoldenGate 초기 로드 방식에 대한 자세한 내용은 초기 로드 추출을 사용하여 인스턴스화 정보를 참조하십시오.

기본값

NOHANDLECOLLISIONS

구문

HANDLECOLLISIONS | NOHANDLECOLLISIONS [_ALLOWPKMISSINGROWCOLLISIONS]
[THREADS (<threadID>[, <threadID>][, ...][, <thread_range>[, <thread_range>][, ...])]

HANDLECOLLISIONS

충돌 처리를 사용으로 설정합니다.

_ALLOWPKMISSINGROWCOLLISIONS

해당하는 대상 행이 없을 경우 기본 키 UPDATE 작업을 건너뛰려면 _ALLOWPKMISSINGROWCOLLISIONS와 함께 HANDLECOLLISIONS를 사용합니다.

주: 작업을 건너뛰면 데이터가 손상될 수 있습니다. 이 항목의 설명을 참조하십시오.

NOHANDLECOLLISIONS

충돌 처리를 끕니다.

THREADS (<threadID>[, <threadID>][, ...][, <thread_range>[, <thread_range>][, ...])

지정된 스레드에 대해 HANDLECOLLISIONS를 사용으로 설정합니다. 매개변수 파일의 루트 레벨에서 전역 HANDLECOLLISIONS 문에 사용되는 경우 HANDLECOLLISIONS는 모든 MAP 문에 있는 모든 위치에서 지정된 스레드에 대해 사용으로 설정됩니다. MAP 문의 HANDLECOLLISIONS 절에 사용되는 경우 HANDLECOLLISIONS는 해당 MAP 문에 대해서만 사용으로 설정됩니다.

threadID[, threadID][, …]

스레드 ID 또는 threadID, threadID, threadID 형식의 콤마로 구분된 스레드 목록을 지정합니다.

thread_range[, thread_range][, …]

threadIDlow-threadIDhigh 형식의 스레드 범위 또는 threadIDlow-threadIDhigh, threadIDlow-threadIDhigh 형식의 콤마로 구분된 범위 목록을 지정합니다.

threadID, threadID, threadIDlow-threadIDhigh 등의 형식 조합이 허용됩니다.

예제

예 1

이 예에서는 매개변수 파일의 모든 MAP 문에 대해 HANDLECOLLISIONS를 사용으로 설정합니다.

HANDLECOLLISIONS
MAP hr.emp, TARGET hr.emp;
MAP hr.job_hist, TARGET hr.job_hist;
MAP hr.dep, TARGET hr.dep;
MAP hr.country, TARGET hr.country;

예 2

이 예에서는 일부 MAP 문에 대해 HANDLECOLLISIONS를 사용으로 설정하고 다른 문에 대해 사용 안함으로 설정합니다.

HANDLECOLLISIONS
MAP hr.emp, TARGET hr.emp;
MAP hr.job_hist, TARGET hr.job_hist;
NOHANDLECOLLISIONS
MAP hr.dep, TARGET hr.dep;
MAP hr.country, TARGET hr.country;

예 3

이 예에서는 MAP 문 내에서 HANDLECOLLISIONS의 기본 사용을 보여줍니다.

MAP dbo.tcust, TARGET dbo.tcust, HANDLECOLLISIONS;

예 4

이 예에서는 전역 및 MAP 레벨 사용의 조합을 보여줍니다. MAP 지정은 지정된 테이블에 대한 전역 지정을 무효화합니다.

HANDLECOLLISIONS
MAP hr.emp, TARGET hr.emp;
MAP hr.job_hist, TARGET hr.job_hist;
MAP hr.dep, TARGET hr.dep, NOHANDLECOLLISIONS;
MAP hr.country, TARGET hr.country, NOHANDLECOLLISIONS;

예 5

다음 예에서 HANDLECOLLISIONS는 첫번째 MAP 문의 기본 스레드 0과 두번째 MAP 문의 스레드 3을 제외하고 모든 MAP 문에 대해 전역적으로 사용으로 설정됩니다.

HANDLECOLLISIONS
MAP fin.*, TARGET fin.*;
MAP sales.*, TARGET sales.*;
MAP orders.*, TARGET orders.*;
MAP scott.cust, TARGET scott.cust, NOHANDLECOLLISIONS;
MAP amy.cust, TARGET amy.cust, THREAD(3), NOHANDLECOLLISIONS;

예 6

이 예에서 HANDLECOLLISIONS는 전역적으로 사용으로 설정되지만 스레드 3에 대해 해제됩니다. 나머지 스레드 1, 2 및 4는 충돌을 처리합니다.

HANDLECOLLISIONS
NOHANDLECOLLISIONS THREAD(3)
MAP scott.emplyees, TARGET scott.employees, THREADRANGE(1,4, OID);
MAP scott.inventory, TARGET scott.inventory, THREADRANGE(1,4, OID);
MAP scott.cust, TARGET scott.cust, THREADRANGE(1,4, OID);

예 7

이 예에서 HANDLECOLLISIONS는 전역적으로 사용으로 설정된 다음 5 - 7 스레드에 대해 전역적으로 사용 안함으로 설정됩니다. HANDLECOLLISIONS 매개변수는 스레드나 범위를 지정하지 않으므로 첫번째 맵 문에서 모든 스레드가 충돌을 처리합니다. 두번째 맵 문에서는 전역 NOHANDLECOLLISIONS이 스레드 5-7에 적용되므로 스레드 4, 8, 9만 충돌을 처리합니다.

HANDLECOLLISIONS
NOHANDLECOLLISIONS THREADRANGE(5-7)
MAP scott.cust, TARGET scott.cust, THREADRANGE(4,9,OID), HANDLECOLLISIONS;
MAP scott.offices, TARGET scott.offices, THREADRANGE(4,9,OID);
MAP scott.emp, TARGET scott.emp, THREADRANGE(4,9,OID);
MAP scott.ord, TARGET scott.ord, THREADRANGE(4,9,OID);
MAP acct.*, TARGET acct.*;
MAP admin.*, TARGET admin.*;