충돌 해결 루틴 개발
이 섹션에서는 다양한 사용자 정의 충돌 해결 루틴에 대한 정보를 제공합니다.
충돌이란?
충돌은 동기화 중단 상태로 정의됩니다. 즉, 소스 테이블과 타겟 테이블이 동일하지 않은 것입니다. SharePlex로 생성된 DML 문이 타겟 테이블의 행에서 실행되지 않는 경우 다음과 같은 이유로 동기화 중단(충돌) 상황이 발생할 것으로 예측할 수 있습니다.
-
Post가 복제된 INSERT를 적용했지만 동일한 키를 가진 행이 이미 타겟에 존재합니다. Post는 다음 논리를 적용합니다.
- 타겟 행의 현재 값이 모두 INSERT 값과 동일한 경우 Post는 행이 동기화된 것으로 간주하고 작업을 삭제합니다.
- 값 중 하나라도 INSERT의 값과 다른 경우 Post는 이를 동기화 중단 상태로 간주합니다.
참고: INSERT를 게시할 때 키가 아닌 값을 고려하지 않도록 Post를 구성할 수 있습니다(Oracle에서 Oracle로 데이터를 복제하는 경우에만 해당). SharePlex 참조 안내서의 SP_OPO_SUPPRESSED_OOS 매개변수를 참조하십시오.
-
Post는 복제된 UPDATE를 적용하지만 타겟에서 UPDATE의 키 값과 동일한 키 값을 가진 행을 찾을 수 없거나, Post가 올바른 행을 찾았지만 행 값이 UPDATE의 이전 값과 일치하지 않습니다. Post는 다음 논리를 적용합니다.
- 타겟 행의 현재 값이 UPDATE 이후 값과 일치하는 경우 Post는 행이 동기화된 것으로 간주하고 작업을 삭제합니다.
- 타겟 행의 값이 UPDATE 이전 또는 이후 값과 일치하지 않는 경우 Post는 이를 동기화 중단 상태로 간주합니다.
참고: 타겟 행의 현재 값이 UPDATE 이후 값과 일치하는 경우 동기화 중단 메시지를 반환하도록 Post를 구성할 수 있습니다(Oracle에서 Oracle로 데이터를 복제하는 경우에만 해당). SharePlex 참조 안내서의 SP_OPO_SUPPRESSED_OOS 매개변수를 참조하십시오.
- 소스 데이터에 대해 DELETE가 수행되었지만 Post가 키를 사용하여 타겟 행을 찾을 수 없습니다. Post가 DELETE 문을 구성할 때 WHERE 절에 키 값만 포함됩니다. 행이 타겟에 없으면 Post는 작업을 삭제합니다.
Oracle에서 Oracle로의 사용자 정의 충돌 해결 루틴
충돌 해결 루틴을 생성하려면 충돌이 발생할 때 SharePlex 작업을 지시하는 PL/SQL 프로시저를 작성합니다. 비즈니스 규칙은 회사마다 매우 다양하므로 모든 상황에 적용되는 표준 충돌 해결 규칙 및 구문 세트를 만드는 것은 불가능합니다. 사용자는 자체적인 루틴을 작성해야 할 것입니다. 사이트 또는 시스템 우선순위를 기본 루틴으로 설정하고 타임스탬프를 보조 루틴으로 설정하는 등 두 개 이상의 프로시저를 작성하는 것이 좋습니다. SharePlex는 루틴이 성공하거나 사용 가능한 프로시저가 더 이상 없을 때까지 루틴을 차례로 호출합니다.
SharePlex는 루틴의 기본으로 사용할 수 있는 다음 도구를 제공합니다.
중요!
- 이 문서는 사용자를 지원하기 위한 가이드라인, 예 및 템플릿을 제공하며, 이를 사용자 본인의 루틴으로 사용해서는 안 됩니다.
- 충돌 해결 루틴을 프로덕션에 적용하기 전에 테스트하여 의도한 대로 작동하는지 확인하고, 한 루틴이 다른 루틴을 방해하지 않는지 확인합니다.
- 기본적으로 SharePlex는 동기화 중단 상태에서도 중지되지 않습니다. 실패한 충돌 해결 시도가 해결되지 않으면 데이터베이스가 점점 더 동기화되지 않을 수 있습니다. sp_ctrl의 show log 명령을 사용하여 이벤트 로그를 자주 확인하고 동기화 중단 경고를 모니터링하십시오. show log 및 기타 SharePlex 명령에 대한 자세한 내용은 SharePlex 참조 안내서를 참조하십시오.
- 충돌 해결 논리가 업데이트되는 경우가 있으므로 이러한 지침을 보완하거나 대체하는 추가 정보는 SharePlex 버전에 대한 릴리스 노트 및 문서를 참조하십시오.
|
SharePlex 일반 인터페이스를 사용하여 루틴을 작성하는 방법
SharePlex는 작성한 프로시저 루틴과 정보를 주고받는 데 사용할 수 있는 일반 충돌 해결 PL/SQL 패키지를 제공합니다.
참고: 사용자 지정 루틴은 Oracle에서 Oracle로의 소스-타겟 조합으로만 지원됩니다.
시작하기 전에 다음 가이드라인을 숙지합니다.
- 일반 충돌 해결과 변환 모두에 동일한 PL/SQL 패키지가 사용됩니다(이름: sp_cr). 테이블에 대해 일반 충돌 해결이나 변환 중 하나를 사용하되 둘 다 사용하지는 마십시오. 변환된 테이블은 SharePlex로 비교할 수 없으며 충돌 해결에 성공할 수 없습니다. 둘 다 사용하는 경우 SharePlex는 변환 루틴만 호출합니다. 해당하는 경우 동일한 구성의 여러 테이블에 대해 일반 충돌 해결 및 변환을 사용할 수 있습니다. 자세한 내용은 데이터 변환 구성를 참조하십시오.
- DDL 변경에는 충돌 해결을 사용할 수 없습니다.
- 충돌 해결을 위해 PL/SQL을 통해 접근할 테이블에는 객체 소유자로부터 SharePlex에 대해 암시적으로 부여된 권한이 필요합니다.
- 충돌 해결은 LONG 또는 LOB 컬럼에 대한 변경을 지원하지 않습니다.
참고: SharePlex 설치 및 설정 안내서의 SharePlex 충돌 해결 데모를 실행한 경우, 데모에 사용된 데이터베이스에 설치된 od_employee_gen 루틴을 보면 일반 충돌 해결 루틴 샘플을 확인할 수 있습니다.
프로시저 인터페이스
프로시저를 생성하려면 이 템플릿을 따릅니다.
(table_info in outsplex.sp_cr.row_typ, col_values insplex.sp_cr.col_def_tabtyp) |
여기서,
- splex는 SharePlex 스키마입니다.
- sp_cr은 PL/SQL 레코드와 테이블 구조를 포함하는 패키지의 이름입니다.
- row_typ는 변수 입력/출력을 전달하는 PL/SQL 레코드의 이름입니다(패키지 정의 참조).
- col_def_type은 컬럼 정보를 저장하는 PL/SQL 테이블의 이름입니다(col_def_type 테이블 참조).
패키지 정의
SharePlex는 SharePlex 데이터베이스 스키마에 있는 sp_cr이라는 공용 패키지의 PL/SQL 레코드 및 테이블 구조를 정의합니다. 패키지는 다음 매개변수를 사용합니다.
CREATE or REPLACE PACKAGE sp_cr AS
TYPE row_typ IS RECORD
src_host VARCHAR2(32),
src_ora_sid VARCHAR2(32),
src_ora_time VARCHAR2(20),
source_rowid VARCHAR2(20),
target_rowid VARCHAR2(20),
statement_type VARCHAR2(6),
source_table VARCHAR2(78),
target_table VARCHAR2(78),
oracle_err NUMBER,
status NUMBER,
action NUMBER,
reporting NUMBER
);
IN 변수
충돌을 일으키는 각 행 작업에 대해 SharePlex는 이 메타데이터 정보를 프로시저에 전달합니다.
src_host |
소스 시스템의 이름(작업이 발생한 위치)입니다. 대소문자를 구분하며 소스 시스템과 동일한 대소문자를 사용하여 전달됩니다(예: SysA). 타겟 시스템에서 사용 중인 명명된 Post 큐가 있는 경우 이 변수는 Post 큐의 이름으로 구성됩니다(예: postq1).
참고: 최대 길이는 32자입니다. 32자보다 긴 호스트 이름은 32자에서 잘립니다. |
src_ora_sid |
소스 데이터베이스의 ORACLE_SID입니다. 대소문자를 구분하며 oratab 파일 또는 V$PARAMETER 테이블에서와 동일한 대소문자로 전달됩니다. |
src_ora_time |
소스 리두 로그에 있는 변경 레코드의 타임스탬프입니다. |
source_rowid |
소스 행의 행 ID입니다. 작은따옴표로 묶여 리터럴로 전달됩니다(예: '123456'). |
target_rowid |
타겟 데이터베이스에 있는 해당 행의 행 ID입니다. SharePlex는 타겟 데이터베이스를 쿼리하여 행 ID를 얻습니다. 작은따옴표로 묶여 리터럴로 전달됩니다(예: '123456'). PRIMARY 키를 사용하여 행을 찾을 수 없는 경우 값은 NULL입니다. |
statement_type |
작업이 INSERT, UPDATE 또는 DELETE 문인지 여부를 나타내는 문자(I, U 또는 D)입니다. |
source_table |
소스 테이블의 소유자 및 이름이며 owner.table로 표시됩니다. 이 값은 대소문자를 구분하며 데이터베이스에서 테이블 이름이 지정되는 방식과 일치합니다. 예를 들어 "scott"."emp"와 같이 큰따옴표로 묶여 전달됩니다. |
target_table |
타겟 테이블의 소유자 및 이름이며 owner.table로 표시됩니다. 이 값은 대소문자를 구분하며 데이터베이스에서 테이블 이름이 지정되는 방식과 일치합니다. 예를 들어 "scott"."emp"와 같이 큰따옴표로 묶여 전달됩니다. |
oracle_err |
프로시저가 충돌 해결 또는 변환에 사용되는지 여부에 따라 다르게 작동합니다.
변환: SharePlex는 이 변수에 대해 값 0을 전달합니다. 이 변수는 충돌 해결에만 사용됩니다.
충돌 해결: 충돌을 일으킨 Oracle 오류 번호입니다. |
OUT 변수
이러한 변수는 프로시저의 성공 여부에 따라 SharePlex의 작업을 지시합니다.
status |
프로시저의 성공 여부를 정의합니다. 이 매개변수의 값을 지정해야 합니다.
|
action |
SharePlex가 수행할 작업을 정의합니다. 이는 프로시저가 변환 또는 충돌 해결에 사용되는지 여부에 따라 다릅니다.
변환: 이 매개변수에 대해 값 0을 지정해야 하며, 이는 SQL 문을 게시하지 않도록 SharePlex에 지시합니다. 변환 루틴은 변환 결과를 타겟 테이블이나 다른 테이블에 게시하는 역할을 합니다. 이 작업의 결과는 보고 변수에 대해 지정한 사항에 따라 달라집니다.
충돌 해결: 실패한 충돌 해결 프로시저의 결과에 따라 수행할 작업을 지정합니다. 이 매개변수의 값을 지정해야 합니다.
|
reporting |
SharePlex가 실패한 프로시저 결과를 보고하는 방법을 결정합니다. 이 매개변수의 값을 지정해야 합니다.
|
col_def_type 테이블
SharePlex는 각 복제 작업에 대해 col_def_tabtyp PL/SQL 테이블을 생성합니다. 이 테이블은 컬럼 정보를 저장합니다. 이는 프로시저가 변환 또는 충돌 해결에 사용되는지 여부에 따라 다릅니다.
- 변환: 각 행 작업에 대해 SharePlex는 컬럼 정보를 col_def_type에 작성합니다.
- 충돌 해결: 충돌을 일으키는 각 행 작업에 대해 SharePlex는 컬럼 정보를 col_def_tabtyp에 작성합니다.
모든 필드는 SharePlex에 의해 루틴에 전달되지만 SharePlex가 행을 찾을 수 없는 경우 모든 필드에 값이 포함되지는 않습니다.
다음은 col_def_tabtyp 테이블을 채우는 데 사용되는 데이터 유형입니다.
type col_def_typ is record
(column_name user_tab_columns.column_name%type
,data type user_tab_columns.data type%type
,is_key boolean
,is_changed boolean
,old_value varchar2(32764)
,new_value varchar2(32764)
,current_value varchar2(32764)
);
type col_def_tabtyp is table of col_def_typ
Description of col_def_tabtyp
column_name |
소스 테이블에서 복제된 컬럼의 이름을 프로시저에 알려줍니다(예: emp_last_name). 이 값은 대소문자를 구분하지 않습니다. |
data type |
복제된 컬럼에 있는 데이터의 데이터 유형(예: VARCHAR2)을 프로시저에 알려줍니다. 이 값은 항상 대문자로 표시됩니다. |
is_key |
해당 컬럼이 키 컬럼인지 여부를 프로시저에 알려줍니다. 키 컬럼인 경우 SharePlex는 TRUE 값을 전달합니다. 컬럼이 키의 일부가 아닌 경우 SharePlex는 FALSE 값을 전달합니다. |
is_changed |
컬럼 값이 변경되었는지 여부를 프로시저에 알려줍니다. 변경된 경우 SharePlex는 TRUE 값을 전달합니다. 컬럼이 변경되지 않은 경우 SharePlex는 FALSE 값을 전달합니다.
|
old_value |
소스 시스템에서 변경되기 전 복제된 컬럼의 이전 값을 프로시저에 알려줍니다. INSERT 이전에는 해당 행이 타겟 데이터베이스에 없었기 때문에 이 컬럼은 INSERT의 경우 NULL입니다.
충돌 해결만: SharePlex가 UPDATE 및 DELETE에 대한 동기화 확인의 일환으로 소스 및 타겟 컬럼을 비교한 사전 이미지입니다. SharePlex에 의해 전달된 이전 값이 타겟 행에서 얻은 current_value 값과 일치하지 않으면 충돌이 발생합니다. |
new_value |
소스 시스템에서 변경된 복제된 컬럼의 새 값을 프로시저에 알려줍니다. |
current_value |
타겟 테이블에 있는 컬럼의 현재 값을 프로시저에 알려줍니다. SharePlex가 타겟 행을 찾을 수 없는 경우 값은 NULL입니다. |
작업 유형별 col_def_tabtyp 테이블의 항목 예
다음 테이블에서는 각 작업 유형의 가능한 결과를 보여줍니다.
INSERT 작업
C1 |
TRUE |
NULL |
bind |
NULL |
FALSE |
C2 |
TRUE |
NULL |
bind |
NULL |
TRUE |
C3 |
FALSE |
NULL |
NULL |
NULL |
TRUE | FALSE |
1 INSERT가 실패하는 이유는 동일한 PRIMARY 키를 가진 행이 타겟 데이터베이스에 이미 있기 때문입니다. SharePlex는 INSERT의 현재 값을 반환하지 않습니다.
UPDATE 작업
C1 |
TRUE |
bind |
bind |
NULL | target_value |
FALSE |
C2 |
FALSE |
bind |
NULL |
NULL | target_value |
TRUE |
C3 |
TRUE |
bind |
bind |
NULL | target_value |
TRUE |
1 (충돌 해결) UPDATE가 실패하는 이유는 SharePlex가 PRIMARY 키와 사전 이미지를 사용하여 행을 찾을 수 없기 때문입니다. 행을 찾을 수 없는 경우 SharePlex는 PRIMARY 키만 사용하여 행을 검색합니다. SharePlex가 행을 찾으면 변경된 컬럼뿐만 아니라 키 컬럼의 현재 값도 반환합니다. SharePlex가 PRIMARY 키만 사용하여 행을 찾을 수 없는 경우 SharePlex는 NULL을 반환합니다.
2 (변환) UPDATE의 경우 변환으로 인해 사전 이미지가 다르기 때문에 SharePlex는 PRIMARY 키와 사전 이미지를 사용하여 행을 찾을 수 없습니다. 대안으로 PRIMARY 키만 사용하여 행을 검색합니다. SharePlex가 행을 찾으면 변경된 컬럼뿐만 아니라 키 컬럼의 현재 값도 반환합니다. PRIMARY 키만 사용하여 행을 찾을 수 없는 경우 current_value는 NULL입니다.
DELETE 작업
C1 |
FALSE |
bind |
NULL |
NULL |
TRUE |
1 DELETE가 실패하는 이유는 SharePlex가 PRIMARY 키를 사용하여 행을 찾을 수 없기 때문입니다. 따라서 SharePlex는 NULL을 반환합니다.
conflict_resolution.SID에 루틴 나열
충돌 해결 프로시저를 생성한 후 충돌 해결 파일을 구성합니다. 이 파일은 어떤 객체와 작업 유형에 어떤 프로시저를 사용하고 어떤 순서로 사용할지 SharePlex에 알려줍니다.
충돌 해결 파일을 찾을 수 있는 곳
빈 conflict_resolution.SID 파일입니다. 여기서, SID는 타겟 인스턴스의 ORACLE_SID이며, SharePlex 설치 시 SharePlex variable-data 디렉토리의 data 하위 디렉토리에 포함되었습니다. 타겟 시스템의 파일을 사용합니다.
이 파일이 없으면 ASCII 텍스트 편집기에서 ASCII 형식으로 파일을 생성할 수 있습니다. 이름은 conflict_resolution.SID로 표시됩니다. 여기서, SID는 타겟 인스턴스의 ORACLE_SID입니다.
참고: SID는 대소문자를 구분합니다.
중요! conflict_resolution.SID 파일은 활성 구성당 하나만 있을 수 있습니다.
충돌 해결 파일에 항목을 만드는 방법
다음 템플릿을 사용하여 프로시저를 하나 이상의 객체 및 작업 유형에 연결합니다.
owner.object |
{i | u | d | iud} |
owner.procedure |
여기서,
- owner.object는 target 객체의 소유자 및 이름이거나 와일드카드 항목입니다. (구문 규칙를 참조)
- i| u | d는 지정된 프로시저로 해결되는 충돌을 생성하는 작업 유형입니다. 일부 또는 모든 작업 유형(예: id 또는 iud)을 지정할 수 있습니다. 대문자나 소문자 모두 유효합니다.
- owner.procedure는 지정된 객체 및 작업 유형을 처리할 충돌 해결 프로시저의 소유자 및 이름입니다.
구문 규칙
- 객체 사양, 동작 유형 사양, 프로시저 사양 사이에는 공백이 하나 이상 있어야 합니다.
- LIKE 연산자와 SQL 와일드카드(%)를 사용하면 검색 문자열을 통해 여러 객체를 지정할 수 있습니다. (예 참조)
- 밑줄(_)을 사용하여 단일 문자 와일드카드를 나타낼 수 있습니다. 밑줄 문자(예: emp_sal)가 포함된 테이블 이름의 경우 SharePlex는 백슬래시(\)를 이스케이프 문자로 인식하여 밑줄을 와일드카드가 아닌 리터럴로 나타냅니다(예: like:scott.%\_corp\_emp). LIKE 연산자를 사용하지 않는 경우 객체 이름에 밑줄이 포함되어 있으면 백슬래시 이스케이프 문자가 필요하지 않습니다.
- 충돌 해결 파일에 프로시저를 나열하는 순서에 따라 사용 우선순위가 결정됩니다(내림차순). 테이블별 프로시저를 나열하는 경우 SharePlex는 와일드카드 객체 이름으로 지정된 프로시저 앞에 해당 프로시저를 사용합니다.
- 파일의 어느 곳에나 주석 줄이 있습니다. 파운드 기호(#)로 주석 줄을 시작합니다.
충돌 해결 파일 예
scott.sal |
IUD |
scott.sal_cr |
like:scott.%\_corp\_emp |
IUD |
scott.emp_cr1 |
like:scott.%\_corp\_emp |
IUD |
scott.emp_cr2 |
like:scott% |
IUD |
scott.emp_cr3 |
scott.cust |
U |
scott.sal_cr |
작동 방식:
- scott.sal_cr routine은 scott.emp_cr1 프로시저가 해당 테이블에 사용되기 전에 scott.sal 테이블에 사용됩니다.
- scott.emp_cr1 프로시저는 검색 기준을 충족하는 모든 테이블에 대해 scott.emp_cr2 프로시저 앞에 사용됩니다.
- scott.cust의 경우 모든 작업에 다른 루틴이 사용되기 전에 UPDATE를 위한 프로시저가 호출됩니다.
충돌 해결 파일에서 SharePlex 준비 루틴을 지정하는 방법
복제 구성의 모든 테이블에 대해 SharePlex 준비 루틴을 사용하려면 소유자 및 객체 이름을 지정하는 대신 !DEFAULT 매개변수를 사용합니다.
사용자 지정 루틴은 SharePlex 준비 루틴보다 우선합니다. 준비 루틴은 사용자 지정 루틴이 실패한 경우에만 사용됩니다. 이는 !DEFAULT 관련 루틴이 파일에 나타나는 순서와 관계없이 적용됩니다.
!DEFAULT 매개변수는 대소문자를 구분합니다. 모두 대문자로 입력해야 합니다.
다음 예에서는 !UpdateUsingKeyOnly 프로시저가 james.table1을 비롯해 모든 테이블의 UPDATE 및 DELETE에 사용됩니다. 단, james.table1에 나열된 사용자 정의 프로시저가 우선 적용됩니다.
!DEFAULT |
U |
!UpdateUsingKeyOnly |
!DEFAULT |
D |
!UpdateUsingKeyOnly |
james.table1 |
U |
james.procedure_upd |
james.table1 |
I |
james.procedure_ins |
james.table1 |
D |
james.procedure_del |
복제가 활성화된 동안 충돌 해결 파일을 변경하는 방법
복제 중에 언제든지 충돌 해결 파일을 변경하여 테이블과 프로시저를 추가 및 제거할 수 있습니다. 충돌 해결 파일을 변경한 후에는 Post 프로세스를 중지하고 재시작합니다.
Oracle 데이터베이스에 대해 해결된 충돌에 관한 로그 정보
SharePlex 준비 루틴을 사용하는 경우 성공적인 충돌 해결 작업에 대한 정보를 기록하도록 Post 프로세스를 구성할 수 있습니다. 이 기능은 기본적으로 비활성화되어 있습니다. 자세한 내용은 Oracle 데이터베이스에 대해 해결된 충돌에 관한 로그 정보를 참조하십시오.
PostgreSQL 또는 PostgreSQL Database as a Service에서 PostgreSQL로의 사용자 정의 충돌 해결 루틴
복제 전략 구성 > 충돌 해결 루틴 개발 > PostgreSQL 또는 PostgreSQL Database as a Service에서 PostgreSQL로의 사용자 정의 충돌 해결 루틴
충돌 해결 루틴을 생성하려면 충돌이 발생할 때 SharePlex 작업을 지시하는 PL/PGSQL 프로시저를 작성합니다. 비즈니스 규칙은 회사마다 매우 다양하므로 모든 상황에 적용되는 표준 충돌 해결 규칙 및 구문 세트를 만드는 것은 불가능합니다. 사용자는 자체적인 루틴을 작성해야 할 것입니다. 사이트 또는 시스템 우선순위를 기본 루틴으로 설정하고 타임스탬프를 보조 루틴으로 설정하는 등 두 개 이상의 프로시저를 작성하는 것이 좋습니다. SharePlex는 루틴이 성공하거나 사용 가능한 프로시저가 더 이상 없을 때까지 루틴을 차례로 호출합니다.
SharePlex는 루틴의 기본으로 사용할 수 있는 다음 도구를 제공합니다.
중요!
-
이 문서는 사용자를 지원하기 위한 가이드라인, 예 및 템플릿을 제공하며, 이를 사용자 본인의 루틴으로 사용해서는 안 됩니다.
-
충돌 해결 루틴을 프로덕션에 적용하기 전에 테스트하여 의도한 대로 작동하는지 확인하고, 한 루틴이 다른 루틴을 방해하지 않는지 확인합니다.
-
기본적으로 SharePlex는 동기화 중단 상태에서도 중지되지 않습니다. 실패한 충돌 해결 시도가 해결되지 않으면 데이터베이스가 점점 더 동기화되지 않을 수 있습니다. sp_ctrl의 show log 명령을 사용하여 이벤트 로그를 자주 확인하고 동기화 중단 경고를 모니터링하십시오. show log 및 기타 SharePlex 명령에 대한 자세한 내용은 SharePlex 참조 안내서를 참조하십시오.
-
충돌 해결 논리가 업데이트되는 경우가 있으므로 이러한 지침을 보완하거나 대체하는 추가 정보는 SharePlex 버전에 대한 릴리스 노트 및 문서를 참조하십시오. |
SharePlex 일반 인터페이스를 사용하여 루틴을 작성하는 방법
SharePlex는 작성한 프로시저 루틴과 정보를 주고받는 데 사용할 수 있는 일반 충돌 해결 인터페이스를 제공합니다.
참고: 사용자 지정 루틴은 Oracle에서 PostgreSQL로 및 PostgreSQL에서 PostgreSQL로의 소스-타겟 조합으로만 지원됩니다.
시작하기 전에 다음 가이드라인을 숙지합니다.
- DDL 변경에는 충돌 해결을 사용할 수 없습니다.
- 충돌 해결을 위해 PL/PGSQL 프로시저를 통해 접근할 테이블에는 객체 스키마로부터 SharePlex에 대해 암시적으로 부여된 권한이 필요합니다.
- 사용자 지정 충돌 해결은 CHAR > 2000, VARCHAR > 4000 or without length, TEXT, BYTEA 등의 대규모 데이터 유형을 지원하지 않습니다.
프로시저 인터페이스
프로시저를 생성하려면 이 템플릿을 따릅니다.
(table_info sp_cr.row_typ, col_values sp_cr.col_def_typ[], INOUT status INTEGER, INOUT action INTEGER, INOUT reporting INTEGER) |
여기서,
- sp_cr은 PL/PGSQL 레코드와 테이블 구조를 포함하는 스키마의 이름입니다.
- row_typ는 변수에서 전달하는 PL/PGSQL 레코드의 이름입니다(스키마 정의 참조).
- col_def_typ은 컬럼 정보를 저장하는 PL/PGSQL 테이블의 이름입니다(col_def_typ 유형 참조).
스키마 정의
SharePlex는 SharePlex 데이터베이스의 sp_cr이라는 스키마에 PL/PGSQL 레코드와 테이블 구조를 정의합니다.
스키마는 다음 매개변수를 사용합니다.
CREATE SCHEMA IF NOT EXISTS sp_cr;
CREATE TYPE sp_cr.row_typ AS
(src_host VARCHAR(32),
src_db VARCHAR(32),
src_time VARCHAR(20),
statement_type VARCHAR(6),
source_table VARCHAR(128),
target_table VARCHAR(128),
native_error INTEGER,
sql_state VARCHAR(10)
);
IN Variables
충돌을 일으키는 각 행 작업에 대해 SharePlex는 이 메타데이터 정보를 프로시저에 전달합니다.
src_host |
소스 시스템의 이름(작업이 발생한 위치)입니다. 대소문자를 구분하며 소스 시스템과 동일한 대소문자를 사용하여 전달됩니다(예: SysA). 타겟 시스템에서 사용 중인 명명된 Post 큐가 있는 경우 이 변수는 Post 큐의 이름으로 구성됩니다(예: postq1). 참고: 최대 길이는 32자입니다. 32자보다 긴 호스트 이름은 32자에서 잘립니다. |
src_db |
소스의 데이터베이스 이름입니다. |
src_time |
Capture 프로세스에서 변경 레코드를 수신할 때의 타임스탬프입니다. |
statement_type |
작업이 INSERT, UPDATE 또는 DELETE 문인지 여부를 나타내는 문자(I, U 또는 D)입니다. |
source_table |
소스 테이블의 소유자 및 이름이며 owner.table로 표시됩니다. 이 값은 대소문자를 구분하며 데이터베이스에서 테이블 이름이 지정되는 방식과 일치합니다. |
target_table |
타겟 테이블의 소유자 및 이름이며 owner.table로 표시됩니다. 이 값은 대소문자를 구분하며 데이터베이스에서 테이블 이름이 지정되는 방식과 일치합니다. |
native_error |
이 필드는 DML 충돌 시 ODBC API에 의해 생성됩니다.* |
sql_state |
이 필드는 DML 충돌 시 ODBC API에 의해 생성됩니다.* |
참고: *Update 및 Delete 작업의 경우 행을 찾을 수 없으면 기본 오류는 100으로 설정되고 SQL_state는 '00000'으로 설정됩니다.
OUT 변수
이러한 변수는 프로시저의 성공 여부에 따라 SharePlex의 작업을 지시합니다.
status |
프로시저의 성공 여부를 정의합니다. 이 매개변수의 값을 지정해야 합니다.
|
action |
SharePlex가 수행할 작업을 정의합니다. 이는 프로시저가 충돌 해결에 사용되는지 여부에 따라 다릅니다.
충돌 해결: 실패한 충돌 해결 프로시저의 결과에 따라 수행할 작업을 지정합니다. 이 매개변수의 값을 지정해야 합니다.
|
reporting |
SharePlex가 실패한 프로시저 결과를 보고하는 방법을 결정합니다. 이 매개변수의 값을 지정해야 합니다.
|
col_def_typ 유형
SharePlex는 각 복제 작업에 대해 col_def_typ 유형을 생성합니다. 이 유형은 컬럼 정보를 저장합니다.
- 충돌 해결: 충돌을 일으키는 각 행 작업에 대해 SharePlex는 컬럼 정보를 col_def_typ에 작성합니다.
모든 필드는 SharePlex에 의해 루틴에 전달되지만 SharePlex가 행을 찾을 수 없는 경우 모든 필드에 값이 포함되지는 않습니다.
다음은 col_def_typ 테이블을 채우는 데 사용되는 데이터 유형입니다.
type col_def_typ is record
(column_name user_tab_columns.column_name%type
,data type user_tab_columns.data type%type
CREATE TYPE sp_cr.col_def_typ AS
(column_name VARCHAR,
datatype VARCHAR,
is_key BOOLEAN,
is_changed BOOLEAN,
old_value VARCHAR ,
new_value VARCHAR
);
type col_def_tabtyp is table of col_def_typ
col_def_typ 설명
column_name |
소스 테이블에서 복제된 컬럼의 이름을 프로시저에 알려줍니다(예: emp_last_name). 이 값은 대소문자를 구분하지 않습니다. |
data type |
복제된 컬럼에 있는 데이터의 데이터 유형(예: VARCHAR)을 프로시저에 알려줍니다. 이 값은 항상 대문자로 표시됩니다. |
is_key |
해당 컬럼이 키 컬럼인지 여부를 프로시저에 알려줍니다. 키 컬럼인 경우 SharePlex는 TRUE 값을 전달합니다. 컬럼이 키의 일부가 아닌 경우 SharePlex는 FALSE 값을 전달합니다. |
is_changed |
컬럼 값이 변경되었는지 여부를 프로시저에 알려줍니다. 변경된 경우 SharePlex는 TRUE 값을 전달합니다. 컬럼이 변경되지 않은 경우 SharePlex는 FALSE 값을 전달합니다.
|
old_value |
소스 시스템에서 변경되기 전 복제된 컬럼의 이전 값을 프로시저에 알려줍니다. INSERT 이전에는 해당 행이 타겟 데이터베이스에 없었기 때문에 이 컬럼은 INSERT의 경우 NULL입니다.
충돌 해결만: SharePlex가 UPDATE 및 DELETE에 대한 동기화 확인의 일환으로 소스 및 타겟 컬럼을 비교한 사전 이미지입니다. SharePlex에 의해 전달된 이전 값이 타겟 행에서 얻은 current_value 값과 일치하지 않으면 충돌이 발생합니다. |
new_value |
소스 시스템에서 변경된 복제된 컬럼의 새 값을 프로시저에 알려줍니다. |
작업 유형별 col_def_typ 테이블의 항목 예
다음 테이블에서는 각 작업 유형의 가능한 결과를 보여줍니다.
INSERT 작업
C1 |
TRUE |
NULL |
bind |
FALSE |
C2 |
TRUE |
NULL |
bind |
TRUE |
C3 |
FALSE |
NULL |
NULL |
TRUE | FALSE |
UPDATE 작업
C1 |
TRUE |
bind |
bind |
FALSE |
C2 |
FALSE |
bind |
NULL |
TRUE |
C3 |
TRUE |
bind |
bind |
TRUE |
DELETE 작업
conflict_resolution.dbname에 루틴 나열
충돌 해결 프로시저를 생성한 후 충돌 해결 파일을 구성합니다. 이 파일은 어떤 객체와 작업 유형에 어떤 프로시저를 사용하고 어떤 순서로 사용할지 SharePlex에 알려줍니다.
충돌 해결 파일을 찾을 수 있는 곳
빈 conflict_resolution.testdb입니다. 여기서, testdb는 DB 이름이며, SharePlex 설치 시 SharePlex variable-data 디렉토리의 data 하위 디렉토리에 포함되었습니다. 타겟 시스템의 파일을 사용합니다.
이 파일이 없으면 ASCII 텍스트 편집기에서 ASCII 형식으로 파일을 생성할 수 있습니다. 이름은 conflict_resolution.DB로 지정해야 하며 여기서, DB는 데이터베이스 이름입니다.
중요! conflict_resolution.DB 파일은 활성 구성당 하나만 있을 수 있습니다.
충돌 해결 파일에 항목을 만드는 방법
다음 템플릿을 사용하여 프로시저를 하나 이상의 객체 및 작업 유형에 연결합니다.
SchemaName.tableName |
IUD |
schema.procedure |
여기서,
- IUD는 지정된 프로시저로 해결되는 충돌을 생성하는 작업 유형입니다.
- schema.procedure는 지정된 객체 및 작업 유형을 처리할 충돌 해결 프로시저의 스키마 및 이름입니다.
구문 규칙
- 객체 사양, 동작 유형 사양, 프로시저 사양 사이에는 공백이 하나 이상 있어야 합니다.
- 충돌 해결 파일에 프로시저를 나열하는 순서에 따라 사용 우선순위가 결정됩니다(내림차순). 테이블별 프로시저를 나열하는 경우 SharePlex는 와일드카드 객체 이름으로 지정된 프로시저 앞에 해당 프로시저를 사용합니다.
충돌 해결 파일 예
scott.sal |
IUD |
scott.sal_cr |
scott.cust |
IUD |
scott.cust_cr |
!DEFAULT |
IUD |
scott.sal_cr5 |
작동 방식:
- scott.sal_cr routine은 scott.sal_cr5 프로시저가 해당 테이블에 사용되기 전에 scott.sal 테이블에 사용됩니다.
- scott.cust의 경우 모든 작업에 기본 루틴이 사용되기 전에 IUD에 대해 scott.cust_cr 프로시저가 호출됩니다.
충돌 해결 파일에서 SharePlex 준비 루틴을 지정하는 방법
복제 구성의 모든 테이블에 대해 SharePlex 준비 루틴을 사용하려면 스키마 및 객체 이름을 지정하는 대신 !DEFAULT 매개변수를 사용합니다.
사용자 지정 루틴은 SharePlex 준비 루틴보다 우선합니다. 준비 루틴은 사용자 지정 루틴이 실패한 경우에만 사용됩니다. 이는 !DEFAULT 관련 루틴이 파일에 나타나는 순서와 관계없이 적용됩니다.
!DEFAULT 매개변수는 대소문자를 구분합니다. 모두 대문자로 입력해야 합니다.
!DEFAULT |
IUD |
proc0 |
schema.table1 |
IUD |
proc1 |
james.table1 |
IUD |
proc2 |
james.table1 |
IUD |
proc3 |
복제가 활성화된 동안 충돌 해결 파일을 변경하는 방법
복제 중에 언제든지 충돌 해결 파일을 변경하여 테이블과 프로시저를 추가 및 제거할 수 있습니다. 충돌 해결 파일을 변경한 후에는 Post 프로세스를 중지하고 재시작합니다.
PostgreSQL 데이터베이스에 대해 해결된 충돌에 관한 로그 정보
SharePlex 준비 루틴을 사용하는 경우 성공적인 충돌 해결 작업에 대한 정보를 기록하도록 Post 프로세스를 구성할 수 있습니다. 이 기능은 기본적으로 비활성화되어 있습니다. 자세한 내용은 PostgreSQL 데이터베이스에 대해 해결된 충돌에 관한 로그 정보를 참조하십시오.
PostgreSQL 또는 PostgreSQL Database as a Service에서 Oracle로의 사용자 정의 충돌 해결 루틴
복제 전략 구성 > 충돌 해결 루틴 개발 > PostgreSQL 또는 PostgreSQL Database as a Service에서 Oracle로의 사용자 정의 충돌 해결 루틴
충돌 해결 루틴을 생성하려면 충돌이 발생할 때 SharePlex 작업을 지시하는 PL/SQL 프로시저를 작성합니다. 비즈니스 규칙은 회사마다 매우 다양하므로 모든 상황에 적용되는 표준 충돌 해결 규칙 및 구문 세트를 만드는 것은 불가능합니다. 사용자는 자체적인 루틴을 작성해야 할 것입니다. 사이트 또는 시스템 우선순위를 기본 루틴으로 설정하고 타임스탬프를 보조 루틴으로 설정하는 등 두 개 이상의 프로시저를 작성하는 것이 좋습니다. SharePlex는 루틴이 성공하거나 사용 가능한 프로시저가 더 이상 없을 때까지 루틴을 차례로 호출합니다.
SharePlex는 루틴의 기본으로 사용할 수 있는 다음 도구를 제공합니다.
중요!
- 이 문서는 사용자를 지원하기 위한 가이드라인, 예 및 템플릿을 제공하며, 이를 사용자 본인의 루틴으로 사용해서는 안 됩니다.
- 충돌 해결 루틴을 프로덕션에 적용하기 전에 테스트하여 의도한 대로 작동하는지 확인하고, 한 루틴이 다른 루틴을 방해하지 않는지 확인합니다.
- 기본적으로 SharePlex는 동기화 중단 상태에서도 중지되지 않습니다. 실패한 충돌 해결 시도가 해결되지 않으면 데이터베이스가 점점 더 동기화되지 않을 수 있습니다. sp_ctrl의 show log 명령을 사용하여 이벤트 로그를 자주 확인하고 동기화 중단 경고를 모니터링하십시오. show log 및 기타 SharePlex 명령에 대한 자세한 내용은 SharePlex 참조 안내서를 참조하십시오.
- 충돌 해결 논리가 업데이트되는 경우가 있으므로 이러한 지침을 보완하거나 대체하는 추가 정보는 SharePlex 버전에 대한 릴리스 노트 및 문서를 참조하십시오.
|
SharePlex 일반 인터페이스를 사용하여 루틴을 작성하는 방법
SharePlex는 작성한 프로시저 루틴과 정보를 주고받는 데 사용할 수 있는 일반 충돌 해결 PL/SQL 패키지를 제공합니다.
시작하기 전에 충돌 해결을 위해 PL/SQL을 통해 접근할 테이블에는 객체 소유자로부터 SharePlex에 대해 암시적으로 부여된 권한이 필요하다는 점을 숙지합니다. Oracle에 대한 추가 가이드라인은 Oracle에 대한 루틴을 작성하는 방법 섹션을 참조하고 PostgreSQL의 경우 루틴을 작성하는 방법 섹션을 참조하십시오.
참고: SharePlex 설치 및 설정 안내서의 SharePlex 충돌 해결 데모를 실행한 경우, 데모에 사용된 데이터베이스에 설치된 od_employee_gen 루틴을 보면 일반 충돌 해결 루틴 샘플을 확인할 수 있습니다.
프로시저 인터페이스
Oracle의 프로시저 인터페이스 정보는 Oracle용 프로시저 인터페이스를 참조하십시오.
PostgreSQL의 프로시저 인터페이스 정보는 PostgreSQL용 프로시저 인터페이스를 참조하십시오.
conflict_resolution.sid
에 루틴 나열
충돌 해결 프로시저를 생성한 후 충돌 해결 파일을 구성합니다. 이 파일은 어떤 객체와 작업 유형에 어떤 프로시저를 사용하고 어떤 순서로 사용할지 SharePlex에 알려줍니다.
충돌 해결 파일을 찾을 수 있는 곳
빈 conflict_resolution.oraA입니다. 여기서, oraA는 OracleDB의 sid이며, SharePlex 설치 시 SharePlex variable-data 디렉토리의 data 하위 디렉토리에 포함되었습니다. 타겟 시스템의 파일을 사용합니다.
이 파일이 없으면 ASCII 텍스트 편집기에서 ASCII 형식으로 파일을 생성할 수 있습니다. 이름은 conflict_resolution.oraA로 지정해야 하며 여기서, oraA는 OracleDB의 sid입니다.
중요! 활성 구성당 하나의 conflict_resolution.sid 파일만 있을 수 있습니다.
충돌 해결 파일에 항목을 만드는 방법
다음 템플릿을 사용하여 프로시저를 하나 이상의 객체 및 작업 유형에 연결합니다.
SchemaName.tableName |
IUD |
schema.procedure |
여기서,
- IUD는 지정된 프로시저로 해결되는 충돌을 생성하는 작업 유형입니다.
- schema.procedure는 지정된 객체 및 작업 유형을 처리할 충돌 해결 프로시저의 스키마 및 이름입니다.
구문 규칙
- 객체 사양, 동작 유형 사양, 프로시저 사양 사이에는 공백이 하나 이상 있어야 합니다.
- 충돌 해결 파일에 프로시저를 나열하는 순서에 따라 사용 우선순위가 결정됩니다(내림차순). 테이블별 프로시저를 나열하는 경우 SharePlex는 와일드카드 객체 이름으로 지정된 프로시저 앞에 해당 프로시저를 사용합니다.
충돌 해결 파일 예
scott.sal |
IUD |
scott.sal_cr |
scott.cust |
IUD |
scott.cust_cr |
!DEFAULT |
IUD |
scott.sal_cr5 |
작동 방식:
- scott.sal_cr routine은 scott.sal_cr5 프로시저가 해당 테이블에 사용되기 전에 scott.sal 테이블에 사용됩니다.
- scott.cust의 경우 모든 작업에 기본 루틴이 사용되기 전에 IUD에 대해 scott.cust_cr 프로시저가 호출됩니다.
충돌 해결 파일에서 SharePlex 준비 루틴을 지정하는 방법
복제 구성의 모든 테이블에 대해 SharePlex 준비 루틴을 사용하려면 스키마 및 객체 이름을 지정하는 대신 !DEFAULT 매개변수를 사용합니다.
사용자 지정 루틴은 SharePlex 준비 루틴보다 우선합니다. 준비 루틴은 사용자 지정 루틴이 실패한 경우에만 사용됩니다. 이는 !DEFAULT 관련 루틴이 파일에 나타나는 순서와 관계없이 적용됩니다.
!DEFAULT 매개변수는 대소문자를 구분합니다. 모두 대문자로 입력해야 합니다.
!DEFAULT |
IUD |
proc0 |
schema.table1 |
IUD |
proc1 |
james.table1 |
IUD |
proc2 |
james.table1 |
IUD |
proc3 |
복제가 활성화된 동안 충돌 해결 파일을 변경하는 방법
복제 중에 언제든지 충돌 해결 파일을 변경하여 테이블과 프로시저를 추가 및 제거할 수 있습니다. 충돌 해결 파일을 변경한 후에는 Post 프로세스를 중지하고 재시작합니다.
Oracle 데이터베이스에 대해 해결된 충돌에 관한 로그 정보
SharePlex 준비 루틴을 사용하는 경우 성공적인 충돌 해결 작업에 대한 정보를 기록하도록 Post 프로세스를 구성할 수 있습니다. 이 기능은 기본적으로 비활성화되어 있습니다. 자세한 내용은 Oracle 데이터베이스에 대해 해결된 충돌에 관한 로그 정보를 참조하십시오.