HANDLECOLLISIONS | NOHANDLECOLLISIONS
유효 기간
Replicat
설명
HANDLECOLLISIONS 및 NOHANDLECOLLISIONS 매개변수를 사용하여 Replicat가 대상에 SQL을 적용할 때 중복 레코드 및 누락된 레코드 오류를 해결하려고 할지 여부를 제어합니다. 충돌이라고 하는 이 오류는 초기 로드 중, 즉 Oracle GoldenGate가 테이블에 발생한 트랜잭션 변경사항을 복제하는 동안 소스 데이터베이스의 데이터를 대상 테이블로 실행할 때 발생합니다. Oracle GoldenGate가 로드가 완료된 후 복제된 변경사항을 적용하는 경우 HANDLECOLLISIONS는 이러한 충돌에 대한 오류 처리 논리를 Replicat에 제공합니다.
다음과 같은 방법으로 HANDLECOLLISIONS 및 NOHANDLECOLLISIONS를 사용할 수 있습니다.
-
매개변수 파일의 루트 레벨에서 지정하여 전역 방식으로
HANDLECOLLISIONS및NOHANDLECOLLISIONS를 사용으로 설정할 수 있습니다. 반대 매개변수가 나타날 때까지 매개변수 파일의 모든 후속MAP문에 대해 하나의 매개변수가 사용으로 설정된 상태로 유지됩니다. -
특정
MAP매개변수 내에서HANDLECOLLISIONS또는NOHANDLECOLLISIONS를 사용으로 설정하여 해당 소스-대상 매핑에 대해서만 오류 처리를 사용 또는 사용 안함으로 설정할 수 있습니다.
앞의 메소드를 결합할 수 있습니다. 글로벌 충돌 처리 규칙을 지정한 다음 MAP 문에서 다른 충돌 처리 규칙으로 해당 규칙을 대체할 수 있습니다. MAP 사양은 항상 전역 사양을 대체합니다.
참고: 통합 Replicat의 오류 처리는 HANDLECOLLISIONS에 적합하지 않습니다. Oracle은 HANDLECOLLISIONS를 사용하는 대신 정확한 인스턴스화 방법을 사용할 것을 권장합니다.
HowHANDLECOLLISIONSWorks
다음 예에서는 HANDLECOLLISIONS 작동 방법에 대해 설명합니다.
-
Replicat가 Oracle GoldenGate에서 키로 사용 중인 열에 대한 업데이트를 발견하면 처리는 다음과 같습니다.
-
이전 키가 있는 행을 대상에서 찾을 수 없는 경우 추적의 변경 레코드가 삽입으로 변환됩니다.
-
새 키가 있는 행이 대상에 있는 경우 Replicat는 이전 키가 있는 행(업데이트가 성공적으로 실행된 경우 존재하지 않음)을 삭제한 다음 새 키가 있는 행이 트레일 값이 현재 값을 대체하는 오버레이로 업데이트됩니다.
이 논리를 사용하려면 테이블의 모든 열(변경된 열뿐만 아니라)이 기본적으로 또는 강제로 트랜잭션 로그에 기록되어야 합니다(예: Oracle 데이터베이스에 대해
ADD TRANDATA의COLS옵션 사용). 누락된 열 값을 피하는 가능한 솔루션을 참조하십시오. -
-
Replicat가 중복 레코드 오류를 발견하면 초기 로드에 의해 적용된 정적 레코드를 추적의 변경 레코드로 덮어씁니다. 중복 레코드 오류를 무시하는 것보다 운영 관점에서 변경 사항을 오버레이하는 것이 더 안전합니다.
-
HANDLECOLLISIONS를 사용하는 Replicat는 업데이트 또는 삭제 작업이 소스의 키 열에 영향을 주지 않고 Replicat에서 대상의 누락된 레코드 오류가 발생하는 경우에도 추적의 변경 레코드를 무시하지 않습니다. 이러한 오류는 소스 시스템에서 레코드가 변경된 후 초기 로드 프로세스에서 테이블 데이터를 추출하기 전에 레코드가 삭제될 때 발생합니다. 예:
-
애플리케이션이 소스 table1의 레코드 A를 업데이트합니다.
-
Extract가 업데이트를 추출합니다.
-
애플리케이션에서 출처 table1의 레코드 A를 삭제합니다.
-
추출은 삭제를 추출합니다.
-
Oracle GoldenGate는 레코드 A 없이 소스 table1에서 초기 로드 데이터를 추출합니다.
-
Oracle GoldenGate는 레코드 A 없이 초기 로드를 적용합니다.
-
Replicat는 레코드 A의 업데이트를 적용하려고 시도합니다.
-
데이터베이스에서 "레코드 누락" 오류를 반환합니다.
-
Replicat는 레코드 A의 삭제를 적용하려고 시도합니다.
-
데이터베이스에서 "레코드 누락" 오류를 반환합니다.
Replicat가 후속 오류를 자동으로 처리하지 않도록 초기 로드 중 캡처된 트랜잭션 변경사항이 대상 테이블에 적용된 후 HANDLECOLLISIONS를 사용 안함으로 설정합니다. 초기 동기화 후 생성되는 오류는 비정상적인 조건을 나타내며 해결 방법을 결정할 수 있는 사람이 평가해야 합니다. 예를 들어, 누락된 레코드 오류는 소스 시스템에 있는 레코드가 실수로 대상 시스템에서 삭제되었음을 나타낼 수 있습니다.
다음과 같은 방법으로 HANDLECOLLISIONS를 해제할 수 있습니다.
-
Replicat를 정지하고 Replicat 매개변수 파일에서
HANDLECOLLISIONS를 제거합니다(대상 대기 시간 발생). 또는 오류 처리를 사용 안함으로 설정할MAP문 앞에NOHANDLECOLLISIONS를 추가하도록 매개변수 파일을 편집할 수 있습니다. -
Replicat가 실행되는 동안 GGSCI를 실행한 다음
SEND REPLICAT명령을NOHANDLECOLLISIONS옵션과 함께 적용하려는 테이블에 사용합니다.주:
SEND REPLICAT를 사용하는 경우HANDLECOLLISIONS가 다시 활성화되지 않도록 매개변수 파일에서HANDLECOLLISIONS를 제거하거나 다른 Replicat 실행을 시작하기 전에NOHANDLECOLLISIONS매개변수를 추가해야 합니다.
누락된 열 값을 피하는 가능한 솔루션
데이터베이스가 기본적으로 소스 테이블의 모든 열 값을 기록하지 않는 경우 Replicat가 기본 키 업데이트를 삽입으로 변환하려고 할 때 대상 테이블에 NOT NULL 제약 조건이 있으면 오류가 발생할 수 있습니다. 다음 방법으로 이 시나리오를 해결할 수 있습니다.
-
HANDLECOLLISIONS를 사용하려면 테이블에 대상 테이블에 NOTNULL기본 키 또는 NOTNULL고유 제약 조건이 있어야 합니다. -
Extract 매개변수 파일에서
NOCOMPRESSUPDATES매개변수를 사용하여 테이블의 모든 열을 추적으로 전송하고, 모든 열 값을 기록하도록 데이터베이스를 구성합니다. 기본적으로 Extract는 기본 키와 트레일로 변경된 열만 기록합니다. 이 방법은 작업이 수행될 때 현재 값을 기록하며 패치(fetch)할 필요가 없기 때문에 가장 안전한 방법입니다. -
Extract 매개변수 파일에서
FETCHOPTIONS매개변수를FETCHPKUPDATECOLS옵션과 함께 사용합니다. 이 구성으로 인해 소스에서 키 열이 업데이트될 때 Extract가 사용할 수 없는 열을 인출합니다. 패치(fetch)는 특정 갱신 시 값이 아니라 현재 값이므로 데이터 무결성 문제가 발생할 수 있습니다. 실패한 인출을 처리하기 위한 추가 인출 옵션 및 자세한 내용은"[FETCHOPTIONS](fetchoptions.html#GUID-DB7BCF87-E3E8-48CF-868A-A56F6D0B6A07)"을 참조하십시오.
데이터베이스에 기본적으로 모든 열이 포함된 경우 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.*;