변환은 타겟 데이터베이스에 SQL 작업을 적용하는 대신 PL/SQL 프로시저(변환 루틴으로 정의됨)를 호출하도록 Post 프로세스에 지시합니다. 변환을 사용하면 타겟에 게시하기 전이나 게시하는 대신 복제된 데이터를 조작할 수 있습니다.
예를 들어 사람의 성과 이름이 소스 테이블의 한 컬럼에 있지만 타겟 테이블의 별도 컬럼에 있는 경우처럼 소스 테이블과 타겟 테이블의 구성이 서로 다른 경우, 변환 루틴을 작성하여 복제가 성공하도록 해당 컬럼에 대한 데이터를 저장합니다. 변환 루틴을 사용하여 데이터 유형, 측정 단위 또는 캐릭터셋을 변환할 수 있습니다. 데이터베이스 트리거 대신 이 루틴을 사용하여 I/O 오버헤드를 줄이고 기타 여러 비즈니스 요구 사항을 충족할 수 있습니다.
테이블에 대한 변환을 지정하면 Post는 복제된 데이터에 대해 아무 작업도 수행하지 않습니다. 대신에 데이터 값을 변환 루틴에 전달하여 프로시저를 통해 데이터의 형식과 대상을 모두 제어할 수 있습니다. 타겟 테이블에 게시하거나, 대체 위치에 게시하거나, 둘 다 게시할 수 있습니다. 따라서 루틴을 작성할 때 게시에 필요한 SQL 작업을 프로시저에 포함시키는 것은 사용자의 책임입니다.
지원되는 소스
Oracle
지원되는 타겟
Oracle
지원되는 복제 전략
변환은 SharePlex를 사용하여 동일한 구조나 데이터를 유지할 필요 없이 한 테이블에서 다른 테이블로 데이터를 전송하는 편리한 방법입니다. 이는 보고, 브로드캐스트, 데이터 마트 및 웨어하우징 애플리케이션에 실용적입니다.
변환은 피어-투-피어 또는 고가용성 복제 환경에는 적합하지 않습니다. 고가용성을 위해서는 복제를 통해 동기화를 유지하는 동일한 데이터베이스가 필요합니다. 피어-투-피어 복제의 경우 SharePlex는 동일한 레코드에 대한 동시 변경 사항이 있을 때 충돌을 감지하고 해결할 수 있어야 합니다. 데이터가 변환되면 SharePlex는 이전 값과 이후 값을 비교하여 동기화를 확인하고 충돌을 감지할 수 없습니다.
지원되는 작업
변환은 INSERT, UPDATE 및 DELETE 작업만 지원합니다. 프로시저를 개발할 때 다음을 수행할 수 있습니다.
- 세 가지 작업 유형 모두에 대해 하나의 프로시저를 생성하거나 각 작업 유형에 대해 프로시저를 생성할 수 있습니다.
- 모든 테이블에 대해 하나의 프로시저를 사용하거나 테이블마다 다른 프로시저를 사용할 수 있습니다. SharePlex를 사용하면 와일드카드로 테이블을 지정할 수 있습니다.
개별 테이블에 대해 변환 루틴이 지정되고 해당 테이블이 다른 루틴이 지정된 테이블 그룹에 속하는 경우, 연결된 DML 작업이 발생할 때 해당 테이블에 대해 테이블별 루틴만 사용됩니다.
변환은 데이터를 변경하고 SharePlex는 데이터를 게시하지 않기 때문에 변환은 복제 동작을 변경합니다. 즉, SharePlex 프로세스를 사용자 지정합니다. 변환 프로시저가 성공할 수 있도록 변환을 구현하기 전에 다음 고려 사항을 검토합니다.
권한
변환을 위해 PL/SQL을 통해 접근할 테이블에는 객체 소유자로부터 SharePlex에 대해 암시적으로 부여된 권한이 필요합니다.
키
변환을 사용하는 모든 테이블에는 PRIMARY 또는 UNIQUE 키가 필요합니다. SharePlex는 키를 사용하여 UPDATE 및 DELETE에 대한 타겟 행을 찾습니다. 이를 통해 UPDATE 작업을 위해 타겟 테이블에서 변환 루틴으로 값을 반환할 수 있습니다. 타겟 시스템에서 키가 변경되는 것을 허용하지 마십시오. 변경을 허용하면 SharePlex가 루틴에 값을 전달할 행을 찾을 수 없습니다.
루틴 테스트
변환 루틴을 프로덕션에 적용하기 전에 테스트하여 의도한 대로 작동하는지 확인하고, 한 루틴이 다른 루틴을 방해하지 않는지 확인합니다. 데이터가 변환되면 SharePlex는 루틴이 올바르게 수행되는지 여부를 측정하는 동기화를 확인하는 데 이전 값과 이후 값을 비교할 수 없습니다. 동기화를 확인하는 유일한 방법은 compare 명령과 key 옵션을 함께 사용하는 것입니다. 이 옵션은 비교를 키 값으로만 제한하며 동기화를 완전히 확인하는 것은 아닙니다. 이 옵션은 누락되거나 추가된 행만 감지합니다. 타겟 데이터가 변환되었기 때문에 키가 아닌 컬럼의 값이 소스 컬럼의 값과 적절하게 연관 관계가 있는지 여부를 나타내지 않습니다(나타낼 수 없습니다).
이러한 이유로 repair 명령을 사용하여 데이터를 재동기화할 수 없습니다. 회사의 비즈니스 규칙과 데이터베이스 환경을 기반으로 자체 재동기화 프로시저를 고안해야 합니다.
날짜
SharePlex 변환의 기본 날짜 형식은 MMDDYYYY HH24MISS입니다. 기본 날짜가 포함된 테이블은 해당 형식을 사용해야 합니다. 사용하지 않으면 변환 시 오류가 반환됩니다. 기본 날짜가 포함된 테이블을 생성하기 전에 다음과 같은 명령을 사용하여 SQL*Plus에서 날짜 형식을 변경합니다.
ALTER SESSION SET nls_date_format = 'MMDDYYYYHH24MISS'
기타 고려 사항
- 변환은 LOB 및 LONG 컬럼에 대한 변경을 지원하지 않습니다.
- 프로시저에 데이터를 전달하기 위한 처리 오버헤드와 프로시저 자체를 실행하는 오버헤드가 결합되어 일반 복제 및 게시보다 타겟 시스템의 전반적인 성능이 저하됩니다.
- 일반 충돌 해결과 변환 모두에 동일한 PL/SQL 패키지가 사용됩니다(이름: sp_cr). 테이블에 대해 일반 충돌 해결이나 변환 중 하나를 사용하되 둘 다 사용하지는 마십시오. 변환된 테이블은 SharePlex로 비교할 수 없으며 충돌 해결에 성공할 수 없습니다. 둘 다 사용하는 경우 SharePlex는 변환 루틴만 호출합니다. 해당하는 경우 동일한 구성의 여러 테이블에 대해 일반 충돌 해결 및 변환을 사용할 수 있습니다. 자세한 내용은 피어-투-피어 복제 구성 를 참조하십시오.
변환 배포에는 다음 단계가 포함됩니다.
- 변환할 소스 및 타겟 테이블에 대한 구성 항목을 만듭니다. 변환을 사용하는 테이블에는 특별한 구성 프로시저가 없습니다. 다른 테이블과 마찬가지로 구성합니다. 자세한 내용은 구성 파일 생성를 참조하십시오.
- 변환 루틴을 만듭니다. 자세한 내용은 변환 루틴 생성를 참조하십시오.
- 변환 루틴을 호출하도록 SharePlex에 지시하는 변환 파일을 만듭니다. 자세한 내용은 변환 파일 생성를 참조하십시오.
변환 루틴 생성
동적 PL/SQL 프로시저 언어를 사용하여 변환 루틴을 작성합니다. sp_cr이라는 공개 패키지에 정의된 매개변수와 레코드 및 테이블 구조를 사용합니다. 이 패키지는 데이터베이스의 SharePlex 스키마에 설치되었습니다. 패키지는 다음 매개변수를 사용합니다.
프로시저 인터페이스
프로시저를 생성하려면 이 템플릿을 따릅니다.
(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 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)
);
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
);
CREATE SEQUENCE EXC_SEQ START WITH 1 INCREMENT BY 1 MINVALUE 1 CACHE 20 NO CYCLE ;
IN variables
충돌을 일으키는 각 행 작업에 대해 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 테이블을 채우는 데 사용되는 데이터 유형입니다.
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)
);
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
);
CREATE SEQUENCE EXC_SEQ START WITH 1 INCREMENT BY 1 MINVALUE 1 CACHE 20 NO CYCLE ;
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을 반환합니다.
변환 파일 생성
SQL 작업을 게시하는 대신 변환 루틴을 호출하도록 SharePlex에 지시하려면 transformation.SID 파일을 사용합니다. 여기서, SID는 타겟 데이터베이스의 ORACLE_SID입니다. SQL 작업을 실행하기 전에 Post는 이 파일을 읽어 호출해야 하는 변환 루틴이 있는지 확인합니다.
이 파일을 찾을 수 있는 위치
빈 transformation.SID 파일입니다. 여기서, SID는 타겟 인스턴스의 ORACLE_SID이며, SharePlex 설치 시 SharePlex variable-data 디렉토리의 data 하위 디렉토리에 포함되었습니다. 타겟 시스템의 파일을 사용합니다.
이 파일이 없으면 ASCII 텍스트 편집기에서 ASCII 형식으로 파일을 생성할 수 있습니다. 이름은 transformation.SID로 표시됩니다. 여기서, SID는 타겟 인스턴스의 ORACLE_SID입니다.
참고: SID는 대소문자를 구분합니다.
중요! transformation.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 연산자를 사용하지 않는 경우 객체 이름에 밑줄이 포함되어 있으면 백슬래시 이스케이프 문자가 필요하지 않습니다.
- 파일의 어느 곳에나 주석 줄이 있습니다. 파운드 기호(#)로 주석 줄을 시작합니다.
변환 파일 예
scott.sal |
IUD |
scott.sal_tr |
like:scott.%\_corp\_emp |
IUD |
scott.emp_tr1 |
like:scott% |
IUD |
scott.emp_tr2 |
scott.cust |
U |
scott.sal_tr |
복제 중 파일을 변경하는 방법
복제 중에 언제든지 변환 파일을 변경하여 테이블과 프로시저를 추가 및 제거할 수 있습니다. 파일을 변경한 후에는 Post 프로세스를 중지하고 재시작합니다.