사전 요구 사항:
|
이 데모에서는 SharePlex를 구성하여 일반적인 충돌 해결 프로시저를 사용해 복제 충돌을 해결합니다. 일반적인 충돌 해결을 사용하면 하나의 PL/SQL 프로시저를 사용하여 여러 테이블의 충돌을 해결할 수 있습니다.
다음과 같은 충돌 해결 전략이 시연됩니다.
중요! 피어-투-피어 복제가 모든 비즈니스 애플리케이션과 호환되지는 않습니다. 사용 환경에 적합한 경우 일반적으로 이 데모의 프로시저보다 더 복잡한 사용자 지정 충돌 해결 프로시저 생성을 비롯하여 신중한 분석 및 실행이 필요합니다. 이 데모를 프로덕션 피어-투-피어 배포의 기초로 사용하지 마십시오. 피어-투-피어 복제에 대한 자세한 내용은 SharePlex 관리 안내서를 참조하십시오.
데모를 시작하기 전에 아래 설명에 따라 데모 객체를 설치합니다.
참고: 스크립트를 실행하려면 복제에 포함된 테이블에 대해 Replica Identity를 Full로 설정합니다.
pg_p2p.sql 및 pg_od.sql 스크립트는 이러한 데모 중에 사용할 데모 객체를 설치합니다. 이러한 스크립트는 SharePlex product 디렉토리의 util 하위 디렉토리에 저장됩니다.
스크립트를 실행하려면 다음을 수행합니다.
참고: 데모 객체를 설치해야 하는 스키마에 대한 스크립트 프롬프트가 나타납니다. 또한 pg_p2p.sql은 신뢰할 수 있는 정확한 데이터 소스가 될 시스템의 이름을 묻는 메시지를 표시합니다.
od_employee
이름 |
Null인지 여부 |
유형 |
---|---|---|
emp_no | not null | int |
emp_first_name | varchar(20) | |
emp_last_name | varchar(20) | |
emp_dob | date | |
emp_dept_no | int | |
emp_timestamp | date |
이름 |
Null인지 여부 |
유형 |
---|---|---|
exc_no | not null | int |
exc_type | varchar(6) | |
exc_target_table | varchar(66) | |
exc_fixed | varchar(3) | |
exc_info | varchar(500) | |
exc_timestamp | date |
exc_source
이름 |
유형 |
---|---|
pri_system | varchar |
참고: 이러한 테이블 외에도 이 데모에 속하지 않는 다른 데모 객체도 생성됩니다.
참고: 이 데모에서는 데모 객체가 demo라는 스키마에 있다고 가정합니다. 이와 다른 경우 실제 스키마로 대체합니다.
두 시스템 모두에서(두 데이터베이스 모두에 대해) 다음 단계를 수행합니다.
SharePlex를 종료합니다.
sp_ctrl(peer1)>shutdown
SharePlex product 디렉토리의 util 하위 디렉토리에서 pg_p2p.sql 스크립트를 실행합니다. 그러면 od_employee_gen 데모 충돌 해결 루틴이 설치됩니다. 다음 사항을 안내하는 메시지가 표시됩니다.
SharePlex를 구성하려면 다음 단계를 수행합니다.
각 시스템에서 텍스트 편집기의 conflict_resolution.database 파일을 엽니다. 이 파일은 SharePlex variable-data 디렉토리의 data 하위 디렉토리에 있습니다.
참고: Post는 복제 충돌이 있을 때 이 파일을 확인하여 호출할 해결 프로시저가 있는지 확인합니다.
각 시스템에서 conflict_resolution.database 파일에 다음 항목을 생성합니다. 몇 개 이상의 공백이나 한 개의 탭 문자로 각 컬럼을 구분합니다.
demo.od_employee | IUD | demo.od_employee_gen |
참고: 첫 번째 구성 요소는 테이블이고, 두 번째 구성 요소는 해당 테이블에 충돌이 있는 경우 해결 루틴이 호출될 작업 유형을 지정하며, 세 번째 구성 요소는 사용될 해결 루틴의 이름입니다.
peer1(신뢰할 수 있는 소스)에서 od_employee 테이블을 peer2의 od_employee 테이블에 복제하는 od_peer1이라는 구성 파일을 생성합니다.
sp_ctrl(peer1)> create config od_peer1
demo.od_employee | demo.od_employee | peer2@r.database |
peer2(보조 소스)에서 od_employee 테이블을 peer2의 od_employee 테이블에 복제하는 od_peer1이라는 구성 파일을 생성합니다.
sp_ctrl(peer2)> create config od_peer2
demo.od_employee | demo.od_employee | peer1@r.database |
복제를 활성화 및 시작하려면 다음 단계를 수행합니다.
peer1에서 od_peer1 구성을 활성화합니다.
peer2에서 od_peer2 구성을 활성화합니다.
각 시스템에서 구성이 성공적으로 활성화되었는지 확인합니다. od_peer1 또는 od_peer2라는 이름(시스템에 따라 다름)이 File Name 아래에 나타나고 Active라는 단어가 State 아래에 나타나야 합니다.
sp_ctrl (source)>list config
이 데모에서는 peer1에서 시작된 INSERT가 peer2에서 복제된 충돌하는 INSERT를 재정의합니다.
peer2에서 od_employee에 행을 삽입합니다.
insert into od_employee values(1, 'John', 'Doe', '1949-04-01', 1, '2022-01-01');
Peer1에서 동일한 행(동일한 값)을 삽입합니다.
insert into od_employee values(1, 'John', 'Doe', '1949-04-01', 1, '2022-01-01');
이 데모에서는 UPDATE 문에 충돌이 발생할 때마다 emp timestamp 컬럼의 최신 값이 있는 행이 우선순위를 갖습니다.
참고: 타임스탬프 우선순위가 작동하려면 EMP_TIMESTAMP 필드를 다른 컬럼과 함께 null이 아닌 값으로 수정해야 합니다. UPDATE 문의 타임스탬프 컬럼이 업데이트되지 않거나 null 값으로 수정되는 경우 저장된 프로시저가 충돌을 해결할 수 없습니다. 그러면 동기화 중단 문제가 나타납니다.
이 데모에서는 DELETE 문이 충돌을 생성하는 경우 무시됩니다.
데모 객체를 설치할 때 지정한 스키마에 ex_table이라는 테이블이 설치되었습니다. PSQL을 통해 이를 확인하여 각 충돌에 대한 정보를 볼 수 있습니다. 다음은 테이블 설명입니다.
컬럼 | 설명 |
---|---|
EXC_NO | 충돌의 예외 번호입니다. |
EXC_TYPE | INSERT, UPDATE 또는 DELETE 등 SQL 문의 유형입니다. |
EXC_TARGET_TABLE | 충돌이 발생한 테이블입니다. |
EXC_FIXED |
충돌 해결 루틴의 결과입니다. YES는 루틴이 성공했음을 의미합니다. NO는 루틴이 실패했으며 행을 올바른 값으로 수동으로 변경해야 함을 의미합니다. |
EXC_INFO | 충돌의 원인입니다. |
EXC_TIMESTAMP | 이 시스템에서 충돌이 발생한 시간입니다. |
사전 요구 사항: 계속하려면 먼저 SharePlex 데모 객체가 설치되어 있는지 확인하십시오. 데모를 위한 사전 작업을 참조하십시오.
이 데모에서는 SharePlex를 구성하여 일반적인 충돌 해결 프로시저를 사용해 복제 충돌을 해결합니다. 일반적인 충돌 해결을 사용하면 하나의 PL/SQL 프로시저를 사용하여 여러 테이블의 충돌을 해결할 수 있습니다.
다음과 같은 충돌 해결 전략이 시연됩니다.
중요! 피어-투-피어 복제가 모든 비즈니스 애플리케이션과 호환되지는 않습니다. 사용 환경에 적합한 경우 일반적으로 이 데모의 프로시저보다 더 복잡한 사용자 지정 충돌 해결 프로시저 생성을 비롯하여 신중한 분석 및 실행이 필요합니다. 이 데모를 프로덕션 피어-투-피어 배포의 기초로 사용하지 마십시오. 피어-투-피어 복제에 대한 자세한 내용은 SharePlex 관리 안내서를 참조하십시오.
데모를 시작하기 전에 아래 설명에 따라 데모 객체를 설치합니다.
참고: 아래 사전 작업은 Oracle 피어에만 적용됩니다. PostgreSQL 피어 사전 작업에 대한 자세한 내용은 데모 사전 작업 - PostgreSQL을 참조하십시오.
p2p.sql 및 od.sql 스크립트는 이러한 데모 중에 사용할 데모 객체를 설치합니다. 이러한 스크립트는 SharePlex product 디렉토리의 util 하위 디렉토리에 저장됩니다.
스크립트를 실행하려면 다음을 수행합니다.
스크립트는 다음 항목에 대한 프롬프트를 표시합니다.
od_employee
이름 |
Null인지 여부 |
유형 |
---|---|---|
EMP_NO | NOT NULL | NUMBER |
EMP_FIRST_NAME | VARCHAR2 | |
EMP_LAST_NAME | VARCHAR2 | |
EMP_DOB | DATE | |
EMP_DEPT_NO | NUMBER | |
EMP_TIMESTAMP | DATE |
od_timesheet
이름 |
Null인지 여부 |
유형 |
---|---|---|
TS_EMP_NO | NUMBER | |
TS_IN_TIME | date | |
TS_OUT_TIME | DATE | |
TS_MOD_TIME | DATE |
od_department
이름 |
Null인지 여부 |
유형 |
---|---|---|
DEPT_NO | NOT NULL | NUMBER |
DEPT_NAME | VARCHAR2 | |
DEPT_CODE | VARCHAR2 |
od_salary
이름 |
Null인지 여부 |
유형 |
---|---|---|
SALE_EMP_NO | NUMBER | |
SAL_VALUE | NUMBER | |
SAL_CHANGED | DATE |
od_sales_emp_data
이름 |
Null인지 여부 |
유형 |
---|---|---|
EMP_NO_KEY | NOT NULL | NUMBER |
EMPLOYEE_NAME | VARCHAR2(70) | |
SALARY | NUMBER | |
DEPARTMENT | VARCHAR2(50) |
oxc_table
이름 |
Null인지 여부 |
유형 |
---|---|---|
EXC_NO | NOT NULL | NUMBER |
EXC_TYPE | VARCHAR2(6) | |
EXC_TARGET_TABLE | VARCHAR2(66) | |
EXC_FIXED | VARCHAR2(3) | |
EXC_INFO | VARCHAR2(500) | |
EXC_TIMESTAMP | DATE |
참고: 이 데모에서는 데모 객체가 demo라는 스키마에 있다고 가정합니다. 이와 다른 경우 실제 스키마로 대체합니다.
다음 단계에서는 Oracle 피어에 대한 데모 객체를 준비하는 방법에 대한 정보를 제공합니다. PostgreSQL 피어의 데모 객체를 준비하는 방법에 대한 자세한 내용은 객체 준비를 참조하십시오.
Oracle 피어에서 다음 단계를 수행합니다.
SharePlex를 종료합니다.
sp_ctrl(peer1)>shutdown
데모 객체를 소유한 사용자에게 sp_cr 패키지를 실행할 수 있는 시스템 권한을 부여합니다. 이 패키지는 SharePlex가 처음 설치되었을 때 SharePlex 스키마에 설치되었습니다.
SQL>grant execute on sp_cr to user_name
SharePlex product 디렉토리의 util 하위 디렉토리에서 p2p.sql 스크립트를 실행합니다. 그러면 od_employee_gen 데모 충돌 해결 루틴이 설치됩니다. 다음 사항을 안내하는 메시지가 표시됩니다.
SharePlex 데이터베이스 사용자의 이름
SharePlex를 구성하려면 다음 단계를 수행합니다.
참고: 이 구성에서 Peer1은 Postgresql 데이터베이스이고 Peer2는 Oracle 데이터베이스입니다. Oracle의 conflict_solution 파일 이름은 conflict_solution.sid이고 PostgreSQL의 경우 conflict_solution.database입니다.
각 시스템에서 텍스트 편집기의 conflict_solution 파일을 엽니다. 이 파일은 SharePlex variable-data 디렉토리의 data 하위 디렉토리에 있습니다.
참고: Post는 복제 충돌이 있을 때 이 파일을 확인하여 호출할 해결 프로시저가 있는지 확인합니다.
각 시스템에서 conflict_resolution 파일에 다음 항목을 생성합니다. 몇 개 이상의 공백이나 한 개의 탭 문자로 각 컬럼을 구분합니다.
demo.od_employee | IUD | demo.od_employee_gen |
참고: 첫 번째 구성 요소는 테이블이고, 두 번째 구성 요소는 해당 테이블에 충돌이 있는 경우 해결 루틴이 호출될 작업 유형을 지정하며, 세 번째 구성 요소는 사용될 해결 루틴의 이름입니다.
peer1(신뢰할 수 있는 소스)에서 od_employee 테이블을 peer2의 od_employee 테이블에 복제하는 od_peer1이라는 구성 파일을 생성합니다.
sp_ctrl(peer1)> create config od_peer1
datasource:r.dbname | ||
"demo"."od_employee" ("emp_no", "emp_first_name", "emp_last_name", "emp_dob", "emp_dept_no", "emp_timestamp") | "DEMO"."OD_EMPLOYEE" ("EMP_NO", "EMP_FIRST_NAME", "EMP_LAST_NAME", "EMP_DOB", "EMP_DEPT_NO", "EMP_TIMESTAMP") | peer2@o.sid |
peer2(보조 소스)에서 od_employee 테이블을 peer2의 od_employee 테이블에 복제하는 od_peer1이라는 구성 파일을 생성합니다.
sp_ctrl(peer2)> create config od_peer2
datasource:o.sid | ||
"DEMO"."OD_EMPLOYEE" ("EMP_NO", "EMP_FIRST_NAME", "EMP_LAST_NAME", "EMP_DOB", "EMP_DEPT_NO", "EMP_TIMESTAMP") | "demo"."od_employee" ("emp_no", "emp_first_name", "emp_last_name", "emp_dob", "emp_dept_no", "emp_timestamp") | peer2@r.dbname |
참고: 위의 예에서는 두 테이블(소스 및 타겟) 모두 대소문자 구분이 다르기 때문에 컬럼 매핑 기능이 사용되었습니다.
복제를 활성화 및 시작하려면 다음 단계를 수행합니다.
peer1에서 od_peer1 구성을 활성화합니다.
peer2에서 od_peer2 구성을 활성화합니다.
각 시스템에서 구성이 성공적으로 활성화되었는지 확인합니다. od_peer1 또는 od_peer2라는 이름(시스템에 따라 다름)이 File Name 아래에 나타나고 Active라는 단어가 State 아래에 나타나야 합니다.
sp_ctrl (source)>list config
이 데모에서는 peer1에서 시작된 INSERT가 peer2에서 복제된 충돌하는 INSERT를 재정의합니다.
peer1에서 od_employee에 행을 삽입합니다.
insert into od_employee values(1, 'John', 'Doe', '1949-04-01', 1, '2022-01-01');
Peer2에서 동일한 행(동일한 값)을 삽입합니다.
INSERT INTO OD_EMPLOYEE VALUES (1,'John','Doe',to_date ('04/01/1949','MM/DD/RRRR'),1,to_date('01/01/2022','MM/DD/RRRR'));
이 데모에서는 UPDATE 문에 충돌이 발생할 때마다 emp_timestamp 컬럼의 최신 값이 있는 행이 우선순위를 갖습니다.
참고: 타임스탬프 우선순위가 작동하려면 EMP_TIMESTAMP 필드를 다른 컬럼과 함께 null이 아닌 값으로 수정해야 합니다. UPDATE 문의 타임스탬프 컬럼이 업데이트되지 않거나 null 값으로 수정되는 경우 저장된 프로시저가 충돌을 해결할 수 없습니다. 그러면 동기화 중단 문제가 나타납니다.
이 데모에서는 DELETE 문이 충돌을 생성하는 경우 무시됩니다.
데모 객체를 설치할 때 지정한 스키마에 ex_table이라는 테이블이 설치되었습니다. PostgreSQL용 PSQL과 Oracle용 SQLPLUS를 통해 이를 확인하여 각 충돌에 대한 정보를 볼 수 있습니다. 다음은 테이블 설명입니다.
컬럼 | 설명 |
---|---|
EXC_NO | 충돌의 예외 번호입니다. |
EXC_TYPE | INSERT, UPDATE 또는 DELETE 등 SQL 문의 유형입니다. |
EXC_TARGET_TABLE | 충돌이 발생한 테이블입니다. |
EXC_FIXED |
충돌 해결 루틴의 결과입니다. YES는 루틴이 성공했음을 의미합니다. NO는 루틴이 실패했으며 행을 올바른 값으로 수동으로 변경해야 함을 의미합니다. |
EXC_INFO | 충돌의 원인입니다. |
EXC_TIMESTAMP | 이 시스템에서 충돌이 발생한 시간입니다. |
SharePlex는 수행할 작업을 SharePlex에 지시하는 사용자 정의 사양인 "구성"에서 복제 지침을 가져옵니다. 복제할 각 객체 그룹에 대해 구성 파일을 만듭니다.
구성은 소스 시스템에 있으며 다음을 정의합니다.
데모 구성을 생성하려면 다음을 수행합니다.
소스 시스템의 sp_ctrl에서 create config 명령을 실행하여 Sample_config라는 복제 구성을 생성합니다. 복제 구성을 생성하면 기본 텍스트 편집기가 열립니다(Linux 시스템의 경우 vi).
구성을 구성할 때 아래의 템플릿 1을 참조하십시오.
템플릿 1: 기본 데모 구성 sample_config
datasource:r.source_DB | ||
"qarun"."basic_c127" | "splex"."basic_c127" | 10.250.14.105@r.sp_ad |
파일의 주석 처리되지 않은 첫 번째 줄에 다음을 입력하고 항목 사이에 공백을 두지 않습니다.
(source_databasename의 경우 소스 인스턴스의 PostgreSQL 데이터베이스 이름으로 대체합니다.) 이는 데이터가 복제될 테이블을 찾을 위치를 SharePlex에 알립니다. r.은 PostgreSQL 데이터가 복제되고 있음을 SharePlex에 알립니다.
다음 줄에는 소스 테이블의 소유자 이름(splex)과 테이블 이름(demo_src)을 입력합니다. 두 항목은 공백 없이 점(.)으로 구분합니다. 테이블 이름과 함께 소유자 이름을 사용하면 데이터베이스의 여러 스키마에 있는 여러 테이블이 동일한 이름을 가질 수 있으므로 SharePlex가 올바른 테이블을 복제합니다.
두 번째 컬럼에는 타겟 테이블의 소유자 이름(splex)과 테이블 이름(deco_dest)을 입력합니다. 두 항목은 공백 없이 점(.)으로 구분합니다.
세 번째 컬럼을 생성하려면 몇 개의 공백이나 탭을 입력합니다. Enter 키를 누르지 마십시오.
세 번째 컬럼에는 다음 항목을 공백 없이 사이에 입력합니다. 그러면 구성에 대한 라우팅 맵이 생성되어 복제된 데이터를 저장할 위치를 SharePlex에 알립니다.
예:
sysB@r.databasename
[선택 사항] 구성을 보려면 소스 시스템의 sp_ctrl에서 view config 명령을 실행합니다.
소스 시스템에서 sp_ctrl의 구성을 활성화합니다. 구성 이름은 대소문자를 구분합니다.
구성이 활성화되었는지 확인하려면 소스 시스템에서 다음 sp_ctrl 명령을 입력하여 모든 구성 목록을 표시합니다. sample_config 구성이 “File Name” 아래에 나타나고 “Active”라는 단어가 “State” 아래에 나타납니다.
팁: 구성 활성화에 실패하면 sp_ctrl에서 view config example_config 명령을 사용하여 파일을 확인합니다. 이를 템플릿 1과 비교하여 입력한 모든 정보가 올바른지 확인합니다. 예를 들어 없어야 할 추가 공백이나 데이터베이스 이름 앞에 r.과 같은 누락된 구성 요소가 있는지 확인합니다.
구성 파일의 실수를 수정하려면 다음을 수행합니다.
참고: 활성 구성을 변경하려면 먼저 copy config 명령을 사용하여 새 파일에 복사한 다음, 복사본을 편집하고 활성화해야 합니다.
참고: 계속하려면 먼저 SharePlex 데모 객체가 설치되어 있는지 확인하십시오.
이 데모에서는 복제 구성을 생성 및 활성화하고 소스 테이블에 데이터를 로드한 다음, 데이터가 타겟 테이블에 성공적으로 복제되었는지 확인합니다. 또한 동기화 중단 테이블을 복원합니다.
참고: 이 데모에서는 데모 객체가 demo라는 스키마에 있다고 가정합니다. 이와 다른 경우 실제 스키마로 대체합니다.
소스 시스템에서 다음 단계를 수행합니다.
sp_ctrl을 실행합니다.
다음 명령을 실행하여 sample_department, sample_salary, sample_timesheet 및 sample_employee 테이블을 타겟 시스템에 있는 동일한 이름의 타겟 테이블에 복제하는 sample_config 구성 파일을 생성합니다.
sp_ctrl (source)>create config sample_config
텍스트 편집기에서 다음 템플릿을 기반으로 구성 파일을 빌드합니다. 구성 요소(소스 사양, 타겟 사양, 라우팅 맵)의 문자 사이에는 공백이 없어야 하며, 각 구성 요소 사이에는 하나 이상의 공백을 둡니다.
# sample_config configuration file | ||
datasource:r.source_databasename | ||
"demo"."sample_department" |
"demo"."sample_department" |
target_system@r.target_databasename |
"demo"."sample_salary" | "demo"."sample_salary" |
target_system@r.target_databasename |
"demo"."sample_timesheet" | "demo"."sample_timesheet" | target_system@r.target_databasename |
"demo"."sample_employee" | "demo"."sample_employee" | target_system@r.target_databasename |
여기서,
sp_ctrl에서 구성 파일이 성공적으로 활성화되는지 확인합니다.
sp_ctrl (source)>verify config sample_config
PostgreSQL-PostgreSQL 복제를 위한 구성 파일의 예:
# data2k configuration file | ||
datasource:r.source_databasename | ||
"demo"."data2k" | "demo"."data2k" | target_system@r.target_databasename |
PostgreSQL-Oracle 복제를 위한 구성 파일의 예:
# data2k configuration file | ||
datasource:r.source_databasename | ||
"demo"."data2k" | "demo"."data2k" | target_system@o.target_databasename |
소스 시스템에서 다음 단계를 수행합니다. 구성을 활성화하면 SharePlex에서 지정된 소스 데이터에 대한 트랜잭션 변경 사항을 캡처할 수 있습니다.
구성을 활성화합니다.
sp_ctrl (source)>activate config sample_config
참고: 구성 이름은 대소문자를 구분합니다.
구성이 성공적으로 활성화되었는지 확인합니다. config sample_config라는 이름이 File Name 아래에 나타나고 Active라는 단어가 State 아래에 나타나야 합니다.
sp_ctrl (source)>list config
© 2025 Quest Software Inc. ALL RIGHTS RESERVED. 이용 약관 개인정보 보호정책 Cookie Preference Center