arrow-left

Only this pageAll pages
1 of 83

ProSync 4.6

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

ProSync 소개

ProSync 제품 소개 및 설계 내용을 안내한다.

제품 소개

hashtag
Change Data Capture

Change Data Capture(이하 CDC) 는 변경 분의 데이터를 peer쪽 서버로 전달해주는 기능을 하는 소프트웨어를 의미한다. 데이터에는 정형 데이터, 반정형 데이터 혹은 비정형 데이터들을 모두 포함한다.

circle-info

참고

정형 데이터는 보통 RDBMS에 저장되는 테이블을 의미하는 경우가 많으며, 반정형 데이터는 Json이나 XML 혹은 NoSQL 기반의 데이터들을 의미한다.

비정형 데이터는 따로 형식이 없는 모든 타입의 데이터를 의미하며, 이는 모든 파일과 디렉토리들을 포함한다.

일반적인 Migration 솔루션들과는 다르게 CDC는 변경 부분에 대해서만 전달함으로써 처리량이 적어 Throughput 등에 있어서 큰 이점을 얻을 수 있다.

hashtag


hashtag
ProSync

ProSync는 TimaxTibero사의 CDC 솔루션이다. 현재 제공되는 데이터 타입은 정형 데이터, 즉 RDBMS에 대한 동기화만을 제공하고 있으며 실시간성이 좋고, 이력관리를 통한 장애복구나 ProSync Manager를 통한 정합성 검사 등의 기능을 모두 제공하고 있다.

circle-info

참고

제품 설계에 대한 상세한 내용은 '제품 설계'에서 확인할 수 있다. ​

hashtag

ProSync Manual

안내서 정보

안내서 제목: ProSync 메뉴얼 발행일: 2026.01.12 소프트웨어 버전: ProSync v4.6.0 안내서 버전: v1.0.1

본 안내서는 TmaxTibero®(이하 Tibero)에서 제공하는 CDC (Change Data Capture) 도구인 ProSync를 사용하는 데이터베이스 개발자를 위한 안내서로, ProSync의 기본적인 사용 방법을 설명한다.

circle-info

참고

본 안내서는 ProSync를 실무에 적용하거나 운용하는 데 필요한 모든 사항을 포함하지 않는다.

안내서의 내용은 ProSync 제품의 개선이나 업그레이드에 따라 변경될 수 있다.

hashtag
사전 필요 지식

  • 데이터베이스의 이해 데이터베이스 기본개념 및 RDBMS(Relational Database Management System)작동 원리에 대한 이해

  • SQL 및 PSM 지식 SQL 문법 및 PSM(Persistent Stored Modules)의 기본적인 사용 방법에 대한 이해

  • 기본적인 Unix 기반 운영체제의 명령어 플랫폼 별 $SHELL 의 사용법이나, 시스템 요구사항 확인에 대한 이해


hashtag
저작권 안내

티맥스티베로 ProSync 매뉴얼에 적용되는 저작권 안내사항 이다.

hashtag
주소

경기도 성남시 분당구 정자일로 45 티맥스타워

hashtag
Website

hashtag
기술서비스센터

Tel : +82-1544-8629

E-Mail : [email protected]envelope

hashtag
Restricted Rights Legend

이 소프트웨어(ProSyncTM) 사용설명서의 내용과 프로그램은 저작권법과 국제 조약에 의해서 보호받고있다. 사용설명서의 내용과 여기에 설명된 프로그램은 TmaxTibero Co., Ltd.와의 사용권 계약 하에서만 사용이 가능하며, 사용설명서는 사용권 계약의 범위 내에서만 배포 또는 복제할 수 있다. 이 사용설명서의 전부 또는 일부분을 TmaxTibero의 사전 서면 동의 없이 전자, 기계, 녹음 등의 수단을 사용하여 전송, 복제, 배포, 2차적 저작물작성 등의 행위를 하여서는 안 된다.

이 소프트웨어 사용설명서와 프로그램의 사용권 계약은 어떠한 경우에도 사용설명서 및 프로그램과 관련된 지적재산권(등록 여부를 불문)을 양도하는 것으로 해석되지 아니하며, 브랜드나 로고, 상표 등을 사용할 권한을 부여하지 않는다. 사용설명서는 오로지 정보의 제공만을 목적으로 하고, 이로 인한 계약상의 직접적 또는 간접적 책임을 지지 아니하며, 사용설명서 상의 내용은 법적 또는 상업적인 특정한 조건을 만족시키는 것을 보장하지는 않는다. 사용설명서의 내용은 제품의 업그레이드나 수정에 따라 그 내용이 예고 없이 변경될 수 있으며, 내용상의 오류가 없음을 보장하지 않는다.

hashtag
Trademarks

ProSync™는 TmaxTibero Co., Ltd.의 등록 상표이다. 기타 모든 제품들과 회사 이름은 각각 해당 소유주의 상표로서 참조용으로만 사용된다.

hashtag
Open Source Software Notice

본 제품의 일부 파일 또는 모듈은 아래의 라이선스를 준수한다.

  • Apache License 2.0

  • BSD 2-Clause License

  • BSD 3-Clause License

  • MIT License

  • ICU license

  • OpenSSL, Inc.,

  • Apache Foundation

  • Jean-loup Gailly and Mark Adler

  • Paul Hsieh's hash

상세정보는 제품 내 위치한 아래의 디렉터리에서 확인할 수 있다. ${PRS_HOME}/licenses/oss_licenses/oss_licenses.txt


hashtag
안내서 구성

본 문서는 총 6개의 본문과 1개의 참고사항으로 구성된다.

chevron-rightProSync 소개hashtag

ProSync 제품 및 설계 내용에 대한 대략적인 설명을 포함한다.

🔎 ProSync 소개 바로가기

chevron-right설치 안내서hashtag

ProSync를 설치하는 과정을 순차적으로 다룬다.

🔎 설치 안내서 바로가기

chevron-right운영 가이드hashtag

Admin, Agent 등 ProSync 운영에 필요한 프로세스를 안내한다.

🔎 운영 가이드 바로가기

chevron-right패치 가이드hashtag

패치 적용을위한 프로세스를 안내한다.

🔎 패치 가이드 바로가기

chevron-right롤백 가이드hashtag

4.4.x로의 패치 이후 문제 발생 시 이전 버전으로 돌아가기 위한 단계를 설명한다.

🔎 롤백 가이드 바로가기

chevron-right장애 대응 가이드hashtag

프로세스 별 장애 상황에 대한 대응방안을 안내한다.

🔎 장애 대응 가이드 바로가기

hashtag
참고 자료

chevron-right파라미터hashtag

ProSync 구성을 설명하는 초기화 매개변수에 대해 안내한다.

🔎 파라미터 바로가기

hashtag

설치 안내서

ProSync를 설치하는 과정을 순차적으로 안내한다. '제품 설계' 페이지에서 소개된 프로세스들의 설치과정과 시스템 요구사항 등의 내용을 모두 포함한다.

시스템 요구사항

ProSync 설치 및 운영을 위해 필요한 시스템 환경 정보를 제공한다. 하드웨어, 운영체제, 데이터베이스, 네트워크, 소프트웨어 요구사항 및 필요한 권한을 항목별로 명시한다.

하드웨어 요구사항

ProSync는 On-Line 으로 운영되는 프로그램으로 혹시 모를 중단이나 비정상 종료가 발생하면 안된다. 이 때문에 프로그램 사용자는 하드웨어 요구사항에 대해서 어느정도 이해하고 있는 것이 좋다.

본 장에서는 CPU와 Memory 그리고 Disk 요구사항을 차례대로 살펴볼 것이다. 기본 값으로 사용해도 동기화 하는 데에는 문제가 없지만, CPU나 Memory가 어떤 부분에서 많이 사용되는지, Disk는 어느정도 사용하는지 등에 대해 대략적인 정보를 정리한다.

소프트웨어 요구사항

ProSync를 설치하고 운영하기 위해 필요한 소프트웨어 환경을 설명한다. 지원되는 데이터베이스 시스템과의 호환성, 운영체제 및 플랫폼, 컴파일러, JDK 등의 시스템 환경 요구사항에 대해 안내한다.

설치 전 준비

ProSync를 설치하기 전에 반드시 확인해야 할 항목들을 안내한다. 환경 변수 설정, DB 사전 설정 등 설치가 원활히 진행되기 위한 준비 과정을 설명한다.

설치 예시

ProSync의 다양한 CDC 구성 예시를 통해 실제 환경에 맞는 설치 방안을 제시한다. 필요 시 '제품 구성도'를 참고한다.

운영 가이드

Extract

본 문서는 ProSync Extract프로세스에 대한 대부분의 내용을 포함하고있다. Extract 프로세스 정의부터 역할 및 세부적인 Configuration 등을 안내한다.

Apply

본 문서는 ProSync Apply 프로세스에 관한 설명 및 운영 등 전반적인 내용을 포함한다. Apply 프로세스 정의 및 역할, 세부적인 Configuration 등을 안내한다.

Llob

Llob 프로세스에 관한 설명 및 운영 방법을 안내한다.

장애 대응 가이드

장애 상황에 대한 조치로서, 프로세스 별 장애 상황과 이에 대한 내용들을 안내한다.

https://www.tibero.com/www.tibero.comchevron-right

제품 구성도

제품소개와 제품설계를 기반으로 ProSync가 어떤 구성으로 설치가 되고 운영이 되는지에 대한 구성도를 설명한다.

앞서 설명한 프로세스 개요 및 설계 구조가 실제 운영 환경 내 구성에 적용되는 사항을 이해하며 설치 절차 및 파라미터 변경 사항을 정확히 파악할 수 있다.

circle-info

참고

Single 과 Cluster DB

ProSync에서 Single이란 Cluster가 아닌 DB를 의미한다. ProSync 관점에서의 Cluster DB란 Active-Active Cluster가 가능한 RDBMS를 의미하며, 단 두 가지 제품군만이 이 기능을 제공한다.

Tibero Active Cluster (TAC)와 Oracle의 Real Application Clusters(RAC) 를 의미한다고 이해할 수 있다.

circle-info

참고

Process의 기동 위치

Extract 프로세스를 제외한 모든 프로세스는 기동 위치에 관계없다. Extract 프로세스는 데이터 변경분이 반드시 해당 서버의 Disk에 남기 때문에 추출하고자 하는 서버에 기동되어야 한다는 제약조건이 있다.

또한 프로싱크는 현재 DBMS에 대한 반영만을 지원하고 있는데, 이 때문에 SQL로 데이터를 가져오거나 반영할 수 있는 Llob 프로세스나 Apply 프로세스 입장에선 기동되는 위치에 크게 제약이 없다.

다만 변경분의 데이터에서 SQL로 데이터를 생성하고 TCP 소켓을 통해 반영쪽에 전달하면 네트워크 쓰루풋 관점에서 크게 손해를 보기 때문에 가능하면 Apply 는 반영하고자 하는 위치에, Llob 프로세스 또한 추출하고자 하는 위치에 기동시키는 것이 일반적이다.

hashtag
Single to Single 구성 예시

아래와 같은 구성을 권장한다.

가장 기본적인 프로싱크의 구성도로, 추출하고자 하는 위치에 관련 프로세스가 기동되고, 반영하고자 하는 위치에 반영프로세스가 기동되는 구조이다. Agent 프로세스의 경우 프로세스들을 모니터링하기 때문에 환경별로 1개씩 기동된다.

편의를 위해 아래와 같은 구성 또한 가능하다.

모든 프로세스를 추출쪽으로 옮겨놓은 구성으로, 설치 및 운영이 매우 간단하다. 하지만 Apply가 Target쪽에 쿼리를 전달한다는 측면에서 네트워크 쓰루풋에 손해를 볼 수 있으며, 하드웨어 자원들도 모두 공유되기 때문에 권장되는 구성은 아니다.

hashtag


hashtag
Cluster to Single/Cluster 구성 예시

Active-Active 구성의 Cluster DB는 Shared Storage가 필수이기 때문에, Shared Storage와 DB Server를 분리하여 작성한다.

반영 쪽이 Cluster인지 여부는 크게 중요하지 않다. 각 DB별 연결정보 파일 (tnsnames.ora 나 tbdns.tbr 파일 등) 을 통해 Cluster 쪽 연결정보를 추상화 하여 접속하기 때문에 반영할 수 있는 DB와 연결만 되면 된다.

circle-info

참고

Admin과 ProSync Manager

위 두 프로세스는 모니터링과 관련된 툴로 Agent 와 연결만 된다면 어디에 기동되어도 무방하다.

hashtag

시스템 환경 요구사항

Platform
CPU
OS
Compiler
JDK Version
Binary Bits

SUN

SPARC

Solaris 11.4

circle-exclamation

주의

HP 플랫폼: HP 플랫폼은 현재 ProSync 지원범위에 포함되지 않는다. HP 플랫폼은 4.4.0까지만 지원가능하다.

Linux 라이브러리: Linux 환경에서는 설치 및 정상 운영을 위해 glibc 2.3.4와 libstdc++ 6.0.3이 사전에 설치되어 있어야 한다.

hashtag

시스템 환경변수 설정

ProSync를 설치하기 위해 필요한 환경변수를 설명한다.

ProSync를 설치하기 위해 필요한 환경변수는 다음과 같다.

환경변수
설명

TB_HOME

Tibero가 Source DB 또는 Target DB에 포함된 경우에만 설정한다. TB_HOME은 Tibero DB가 설치된 홈 디렉토리이다. 반드시 설정되어야 하며 Tibero DB가 존재하지 않는 경우 공백이나 dummy 경로등으로 설정한다.

ORACLE_HOME

Oracle DB가 Source DB 또는 Target DB에 포함된 경우에만 설정한다.

hashtag

hashtag
설치 시 DB 별 주의사항

설치 시 Source/Target DB에 모두 접속하기 때문에 DB별 환경변수가 모두 설정되어야 한다.

hashtag
Tibero

  • tbsql 바이너리 경로가 PATH 환경변수에 존재해야 한다.

  • Tibero 데이터베이스를 사용하지 않는 경우, 참고하여 dsn파일 생성 후 TB_DSN_FILE 환경변수에 해당 파일 경로를 설정한다.

hashtag
Oracle

  • sqlplus 바이너리 경로가 PATH 환경변수에 존재해야 한다.

  • Oracle 데이터베이스를 사용하지 않는 경우,참고하여 tnsnames.ora 파일 생성 후 TNS_ADMIN 환경변수에 해당 파일이 존재하는 폴더 경로를 설정한다.

hashtag
PostgreSQL

  • psql 바이너리 경로가 PATH 환경변수에 존재해야 한다.

  • PostgreSQL 데이터베이스를 사용하지 않는 경우,참고하여 service 파일 생성 후 PGSERVICEFILE 환경변수에 해당 파일 경로를 설정한다.

hashtag

데이터베이스 설정

ProSync 사용을 위한 Source Database 별 설정방법을 안내한다.

hashtag
Source DB가 Tibero인 경우

hashtag
Tibero 설정

hashtag
데이터베이스 TIP 파일 설정

다음 항목을 TIP 파일에 설정한다.

hashtag
Archive 모드 설정

hashtag


hashtag
Source DB가 Oracle인 경우

hashtag
Oracle 설정

hashtag
Archive 모드 및 Supplemental Log 설정

hashtag
파라미터 설정

AQ 및 Archive Log 관련 파라미터는 다음과 같이 설정한다.

hashtag


hashtag
Source DB가 PostgreSQL인 경우

hashtag
PostgreSQL 설정

hashtag
wal_level = logical 설정

hashtag

데이터베이스 별칭(Alias) 확인

ProSync 설치를 시작하기 전에 각 데이터베이스의 SID 설정 파일을 확인하여 접속 가능한 별칭(Alias)을 설정한다.

circle-exclamation

주의

데이터베이스가 클러스터 환경인 경우, 각 인스턴스에 대한 설정이 모두 포함되어야 한다.

또한, 접속하는 모든 db에 대한 별칭 설정이 필요하며, 각 db에 대한 client 바이너리가 PATH에 존재해야 한다.

hashtag
Tibero 별칭 설정

Tibero가 Source DB 또는 Target DB로 사용되는 경우, 다음 경로에 별칭을 설정한다.

hashtag
일반 구성 예시

hashtag


hashtag
Oracle 별칭 설정

Oracle이 Source DB 또는 Target DB로 사용되는 경우, 다음 경로에 별칭을 설정한다.

hashtag
구성 예시

hashtag


hashtag
PostgreSQL 별칭 설정

PostgreSQL이 Source DB 또는 Target DB로 사용되는 경우, 다음 경로에 별칭을 설정한다.

pg_service.conf 경로는 PGSERVICEFILE 환경 변수 값으로 지정하거나 시스템 전역(pg_config --sysconfdir/pg_service.conf) 파일을 사용 또는 PGSYSCONFDIR 환경 변수 값으로 지정된 디렉터리의 pg_service.conf 파일을 사용할 수 있다.

hashtag
구성 예시

hashtag

동기화 대상 테이블 생성 및 등록

ProSync에서 테이블을 동기화하기 전에, 먼저 지원되는 데이터 타입을 확인한다. Source DB에 따라 지원하는 컬럼 타입이 다르므로 주의한다.

hashtag
지원 데이터 타입

구분
지원 타입
circle-info

참고

  • GEOMETRY 컬럼 타입은 Tibero to Tibero 동기화만 지원된다.

  • CLOB

circle-exclamation

주의

서로 다른 Character Set 간의 데이터 처리

  • Source DB와 Target DB의 Character Set이 다른 경우, 프로싱크 제품 내부에서 자동적으로 Character Set 을 Target DB Character Set 에 맞게 변환하여 데이터를 삽입한다.

hashtag


hashtag
테이블 생성

동기화 대상 테이블은 Source DB와 Target DB 각각에 존재해야 하며, 동일한 사용자 계정과 동일한 스키마로 생성되어야 한다.

다음은 TEST 사용자 계정에 테이블 T1, T2, T3을 생성하는 예제이다. Source DB와 Target DB 모두에 수행한다.

hashtag


hashtag
테이블 등록

동기화 대상 테이블은 아래 경로의 파일에 등록한다.

  • 등록 형식은 OWNER_NAME.TABLE_NAME 형태로 작성한다.

  • 특정 OWNER의 모든 테이블 등록 시: OWNER_NAME.%

  • 특정 OWNER로 시작하는 계정들의 모든 테이블 등록 시: OWNER_NAME%.%

hashtag
특정 테이블 등록 예시

hashtag
전체 또는 패턴 등록 예시

circle-info

참고

prs_obj_group#.list 파일 내의 OWNER_NAME과 TABLE_NAME은 대소문자를 구분한다.

hashtag

Agent 설치

hashtag
1. 설치 파라미터 설정

Agent 프로세스를 설치하기 위해 각 계정의 설정 정보를 $PRS_HOME/install/prs_install_agent.cfg 파일에 작성한다.

hashtag
설정 템플릿 예시

hashtag
파라미터 설명

파라미터
설명

hashtag
설정 예시

아래는 4개의 Agent를 설정한 예시이다:

circle-exclamation

주의

AGENT_ID, AGENT_HOST, AGENT_PORT는 반드시 설정해야 하며, 중복되지 않도록 주의해야 한다.

멀티 노드 환경에서는 IP 기반 설정을 권장한다.

hashtag


hashtag
2. Agent 설치

설정 파일(prs_install_agent.cfg)이 준비된 후에는 다음과 같이 설치 스크립트를 실행한다.

hashtag
사용 가능 옵션

옵션
설명

hashtag
예시

옵션 없이 기본 설정 파일로 설치를 수행하는 경우

설치가 진행되면 시스템 환경 체크, 설정 파일 검증, agent 파일 생성 등의 단계가 자동으로 수행된다.

중간에 기존 설정 파일이 존재할 경우 덮어쓸지 여부를 묻는 메시지가 표시되며, 사용자가 Y/N으로 응답해야 한다.

설치 예시

hashtag


hashtag
3. 설치 결과 확인

설치가 완료되면 다음 디렉터리에서 결과 파일을 확인할 수 있다.

hashtag
주요 파일 설명

  • prs_agent_<agent_id>.cfg: 개별 Agent의 설정 파일

  • prs_instance.map: 전체 Agent들의 연결 정보를 관리하는 매핑 파일

hashtag
생성된 설정 파일 예제

hashtag
prs_instance.map 예시

hashtag
prs_agent_agent1.cfg 예시

hashtag


hashtag
4. CM Failover 스크립트 설정

CM Failover 기능을 사용하기 위해 AGENT_CM_GROUP[n] 및 AGENT_CM_ID[n]을 설정한 경우, 설치 시 $PRS_HOME/bin 경로에 prs_<AGENT_CM_ID>.sh 형식의 스크립트 파일이 자동 생성된다.

이 스크립트 파일에는 Agent 기동을 위한 환경 변수를 설정해야 하며, 반드시 TB_HOME ,AGENT_ID 등을 환경에 맞게 수정해야 한다.

hashtag
$PRS_HOME/bin/prs_0.sh예시

hashtag

Instance 설치

hashtag
계정별 필요 권한

ProSync 설치를 위해서는 아래 세 가지 계정 정보가 필요하다.

  • PRS_USER

  • SRC_INSTALL_USER

  • TAR_INSTALL_USER

circle-info

참고

DB가 Oracle 이면서 CDB에서 설치하는 경우, 공통 권한이 필요하다 (예: GRANT CONNECT TO INSTALL_USER CONTAINER=ALL;).

hashtag
PRS_USER

ProSync가 내부적으로 운영에 사용하는 테이블들을 관리하기 위한 계정이다. Source DB와 Target DB 모두에 생성하며, 운영 시 사용된다.

hashtag
Source DB가 Tibero인 경우

hashtag
Source DB가 Oracle인 경우

hashtag
Target DB가 Tibero 또는 Oracle이고 DML 동기화만 사용하는 경우

hashtag
Target DB가 Tibero 또는 Oracle인 경우

hashtag
Target DB가 PostgreSQL인 경우

hashtag
SRC_INSTALL_USER

설치 과정에서만 사용하는 계정으로, PRS_USER 계정을 생성하고 권한을 부여하기 위한 역할을 한다. 설치 완료 후에는 운영과 무관하다.

hashtag
Tibero인 경우

hashtag
Oracle인 경우

circle-exclamation

주의

Oracle PDB에서 설치하는 경우, CDB로 container를 변경할 수 있는 common user여야 하며 CDB나 PDB에 위 권한이 없는 경우 설치에 실패할 수 있다.

circle-info

참고

Oracle CDB에서 설치하는 경우, 사용자 생성 시 C## 접두어 제약이 존재한다. 설치 과정에서 이 제약을 해제하기 위해 ALTER SESSION SET "_ORACLE_SCRIPT"=TRUE; 명령을 실행하며, 해당 명령은 SYS 계정으로 접속한 세션에서만 수행 가능하므로, CDB 환경에서는 SYS 계정으로 설치를 진행해야 한다.

hashtag
PostgreSQL인 경우

hashtag
TAR_INSTALL_USER

SRC_INSTALL_USER와 마찬가지로, 설치 과정에서만 사용하는 계정이다.

hashtag
Tibero인 경우

hashtag
Oracle인 경우

hashtag
PostgreSQL인 경우

hashtag


hashtag
1. 설치 파라미터 설정

Instance를 설치하기 위해 각 계정의 설정 정보를 $PRS_HOME/install/prs_install.cfg 파일에 작성한다.

hashtag
설정 템플릿 예시

hashtag
설치 파라미터

파라미터
설명
circle-info

참고

특수문자 사용 시 이스케이프 처리가 필요하다.

(예: PRS_PWD="example123!@#" -> PRS_PWD=\"example123\!\@\#\")

또한, IP 주소 입력 시 VIP(Virtual IP) 대신 실제 IP 주소를 사용할 것을 권장한다.

hashtag
설정 예시

아래는 파라미터를 설정한 예시이다.

hashtag


hashtag
2. Instance 설치

설정 파일(prs_install.cfg)이 준비된 후에는 다음과 같이 설치 스크립트를 실행한다.

hashtag
사용 가능한 옵션

옵션
설명

hashtag
설치 예시

옵션 없이 기본 설정 파일로 설치를 수행하는 경우

circle-info

참고

prs_install.sh 파일을 실행한 후 prs_install.cfg에 패스워드 옵션을 입력하지 않은 경우 각 계정에 대한 패스워드를 순서대로 입력해야 한다.

circle-exclamation

주의

prs_install.sh 파일 실행 시, 메타 테이블 및 트리거 생성중 ddl 발생하는 경우 이를 감지하지 못할 수 있으며 이후 동기화를 실패할 수 있다.

hashtag
설치 결과 예시

circle-info

참고

설치 중 오류가 발생하면, 오류가 발생한 지점과 관련된 메시지를 출력한 뒤 설치를 중단한다.

자세한 오류 내용은 디버깅을 위해 로그 파일(prs_install.log)에 기록되며, 이를 통해 원인을 확인할 수 있다.

hashtag


hashtag
3. 설치 결과 확인

설치가 완료되면 다음 디렉터리에서 결과 파일을 확인할 수 있다.

주요 파일 설명

  • <instance_id>_ext1.cfg: ext process의 설정 파일

  • <instance_id>_apply1.cfg: apply process의 설정 파일

  • <instance_id>_llob.cfg: llob process의 설정 파일

hashtag
생성된 설정 파일 예제

hashtag
prs_instance.map 예시

hashtag
instance_ext1.cfg 예시

hashtag
instance_apply1.cfg 예시

hashtag
instance_llob.cfg 예시

hashtag
prs_adm.cfg 예시

hashtag
Var 디렉토리 확인

Instance 설치가 성공적으로 완료되면, $PRS_HOME/var 디렉토리 하위에 다음과 같은 서브 디렉토리가 자동으로 생성된다:

  • admin

  • instance_id

이 디렉토리들 하위에는 해당 프로세스의 실행 로그 파일들이나 dump 파일, prosync 운영에 필요한 파일들이 저장된다.

hashtag
메타 테이블 생성 확인

설치가 완료되면 Source DB 및 Target DB에 ProSync 운영에 필요한 메타 테이블과 객체들이 생성된다.

아래는 정상적으로 생성되었는지 확인해야 할 주요 메타 테이블 및 객체 목록이다.

hashtag
Source DB

  • 동기화 및 추출 이력 관리 테이블

테이블명
설명

  • 동기화 및 추출 관련 PACKAGE 및 TRIGGER

객체명
설명

hashtag
Target DB

  • 동기화 및 추출 이력 관리 테이블

테이블명
설명

hashtag

Prosync 실행

Agent와 Instance가 정상적으로 설치되었다면, ProSync를 운영할 수 있다. 시스템 환경변수가 올바르게 설정된 상태에서는 admin process를 통해 Agent 및 Instance의 기동, 정지, 종료, 상태 확인 등의 작업을 수행할 수 있다.

hashtag
admin process 실행 방법

아래 명령어를 입력하여 admin process를 실행한다.

$ prs_adm

명령어를 입력하면 프롬프트가 아래와 같이 실행된다.

이 프롬프트에서 다음과 같은 명령어를 사용할 수 있다.

hashtag
Agent 실행

hashtag
Instance 실행

hashtag
실행 결과 확인

hashtag
실행 결과 확인 예시

circle-info

참고

자세한 명령어 및 운영 방법은 문서를 참고한다.

hashtag

CM 명령어 모음

hashtag
cmrctl add

hashtag
cmrctl add group

그룹 리소스를 추가하기 위한 명령어이다. 그룹은 클러스터라는 환경 위에서 agent 서비스를 관리하기 위한 개념이다

cmrctl add group --name <group_name> --cname <cluster_name> 
--grptype <type> --failover <true|false>
Key
Value Type
설명

hashtag
cmrctl add agent

Agent 리소스를 추가하는 명령어이다.

Key
Value Type
설명

hashtag


hashtag
cmrctl del

특정 리소스를 삭제하기 위한 명령어이며, DOWN 또는 DEACT 상태의 리소스만 삭제 가능하다.

circle-exclamation

주의

모든 agent가 down된 상태이면, group을 삭제할 경우 agent도 같이 삭제된다.

hashtag


hashtag
cmrctl show

CM에 등록된 리소스의 정보를 확인하기 위한 명령어이다.

circle-info

참고

cmrctl show all을 입력하는 경우 같은 cm group의 모든 정보를 확인할 수 있다.

hashtag


hashtag
cmrctl start

리소스를 시작하기 위한 명령어이다. 그룹 리소스를 start하는 경우 해당 그룹에 속한 모든 agent를 기동시킨다.

hashtag


hashtag
cmrctl stop

리소스를 중지하기 위한 명령어이다. 그룹 리소스를 stop하는 경우 해당 그룹에 속한 모든 agent를 중지시킨다.

hashtag


hashtag
cmrctl act

다음의 이유로 인해 deactivate된 리소스를 다시 activate시켜주기 위한 명령어이다.

  • agent를 추가할 때 입력한 retry_cnt(기본값: 3) 이상 start를 수행했는데도 실패한 경우

  • 사용자가 cmrctl deact 명령어를 명시적으로 사용하여 비활성화시킨 경우

  • agent를 추가할 때 입력한 script에 문제가 있는 경우

hashtag


hashtag
cmrctl deact

리소스를 deactivate시켜주기 위한 명령어이다. deact되어 있는 동안 agent는 script를 수행시키지 않는다.

hashtag


hashtag
cmrctl modify

그룹 리소스의 failover 기능 사용 여부를 수정하기 위한 명령어이다.

hashtag

Admin

그림1. prosync process

hashtag
ProSync Admin Utility

ProSync Admin Utility는 ProSync의 효율적인 사용을 위한 대화형 유틸리티이다. 해당 유틸리티로 ProSync의 프로세스 기동, 정지, 일시정지와 같은 관리를 할 수 있다. 또한, ProSync 관리자는 시스템 관리를 위한 명령을 실행할 수 있다.

ProSync Admin Utility는 이러한 기본 기능 외에도 운영체제 관련 명령어의 실행, ProSync Admin Utility의 파라미터 확인, 스크립트 기능 등을 제공한다. 특히 스크립트 기능은 여러 ProSync Admin Utility 명령어를 하나의 스크립트 파일로 생성할 수 있어 편리하다.

ProSync Admin Utility는 다음과 같은 기능을 제공한다.

  • ProSync INSTANCE_ID별 기동, 일시정지, 재개, 정지

  • 특정 프로세스의 기동 및 정지

  • 스크립트를 통한 일괄 작업의 실행

  • ProSync 프로세스들의 상태 조회

hashtag

Agent

Agent 프로세스에 대해 안내한다.

hashtag
Agent Process

hashtag
Process 설명

Agent 프로세스는 Admin 프로세스 또는 Prosync Manager로부터 메시지를 수신하면, 이를 ext, apply, llob 프로세스에 전달하고, 처리 결과를 다시 Admin 프로세스 및 Prosync Manager에 전달한다. 또한, ext, apply, llob 프로세스의 기동, 종료 등의 작업을 수행한다. 추가적으로 cm failover 기능을 사용하는 경우 cm 모니터링 및 하위 프로세스 모니터링 작업도 수행한다.

hashtag


hashtag
Threads

hashtag
Control Thread

기동 시 타 Thread 시작, 메시지 수신 및 전송 등의 작업을 수행한다.

hashtag
Worker Thread

ext, apply, llob 프로세스의 기동, 종료 등의 작업을 수행한다.

hashtag
Monitor Thread

cm failover 기능을 사용하는 경우 cm을 모니터링 하여 cm 상태에 따라 하위 프로세스의 기동, 종료 작업을 수행한다. cm failover 기능에 대한 자세한 내용은 을 참고한다.

hashtag

패치 가이드

hashtag
1. 로그 스위치 수행 (SRC DB)

4.0 기준 Abort 종료 시 이력을 저장하지 않기 때문에 로그를 처음부터 읽는다. 이를 위해 로그 스위치를 먼저 수행해야 한다.

ALTER SYSTEM SWITCH LOGFILE;

hashtag
2. 프로세스 강제 종료 (SRC / TAR)

4.0 버전의 경우 abort 종료가 반드시 필요하다.

hashtag
3. 메타데이터 백업을 위한 유저 생성 (SRC / TAR)

기존 메타데이터를 백업하기 위해 별도의 백업 전용 유저를 생성하고 필요한 권한을 부여한다.

hashtag
4. var / config 디렉토리 이관

기존 환경의 데이터를 보존하면서 새로운 4.4.x 바이너리로 마이그레이션하기 위해 디렉토리를 재구성한다.

hashtag
5. prs_install.cfg 작성

prosync_4_4/prs_install.cfg 파일을 생성하고 아래 내용을 포함한다.

hashtag
6. 메타데이터 백업 수행

기존 ProSync 환경에서 메타 정보를 백업한다.

circle-info

Oracle DB의 경우, 백업 수행하는 TABLESPACE 에 대한 쓰기 권한이 필요할 수 있다.

ALTER USER [백업유저이름] QUOTA [필요크기] ON [TABLESPACE 명];

쿼리를 통하여 충분한 크기를 할당한다.

hashtag
7. SRC DB 권한 부여

메타데이터 수집을 위해 SRC DB에서 필요한 권한을 부여한다.

hashtag
8. TAR DB 권한 부여

hashtag
9. prs_obj_group1.list 생성 및 메타 정보 이관

circle-info

참고

{$INSTANCE_NAME}.PRS_OBJ_LIST에 대한 정보는 prs_backup.sh를 통해 backup_user 스키마에 저장되며, prs_meta.sh 실행 시 해당 정보가 자동으로 참조된다. 따라서 prs_obj_group1.list 파일을 별도로 작성할 필요는 없으며, 시스템이 해당 파일의 존재 여부만을 확인하므로 파일이 경로에 존재하기만 하면 된다.

hashtag
메타 정보 이관 예시

hashtag
10. Config 파일 수정

hashtag
10.1. 각 process별 cfg 파일 내 파라미터 수정

  • LISTENER_PORT 제거

  • TOP_ID 제거

  • Log 및 Backup Log 경로 수정

hashtag
10.2. vf.cfg 삭제 확인

hashtag
10.3. prs_mgr.cfg → prs_agent_{agent_id}.cfg 으로 변경

hashtag
11. Agent 설치

4.4.x 버전부터는 Agent 설치가 Instance 설치와 분리되었기 때문에, 패치 작업 전에 반드시 Agent 설치를 완료해야 한다. 자세한 설치 방법은 문서를 참고한다.

hashtag
12. prs_top.map 변경 사항

4.4.x 부터는 prs_top.map에서 prs_instance.map으로 변경되었다.

hashtag
4.0 형식

hashtag
4.4.x 형식

  • localhost 제약 제거

  • Instance에서 Host 제거 및 MGR → Agent로 변경

  • ext process에서 Port 제거

  • verify process삭제

hashtag
13. ProSync 재기동

4.4.x부터는 manager 대신 agent를 사용하기 때문에 agent 기동 명령어도 man(ager)에서 age(nt)로 변경되었다.

hashtag

롤백 가이드

백업이 존재하는 경우에만 롤백이 가능하다. 아래는 4.4.x로의 패치 이후 문제가 발생했을 때, 이전 버전으로 롤백하기 위한 단계다.

hashtag
1. 프로세스 강제 종료 (SRC / TAR)

ADMIN> shutd agent;

hashtag
2. 디렉토리 복구

circle-info

참고

3단계(재설치 수행)부터 5단계(메타데이터 복구)까지의 과정은 메타 테이블 구조 변경으로 인해 필요한 절차이며, 해당 작업은 4.0, FS01, 4.2.x 버전에 한해 수행하면 된다.

hashtag
3. 재설치 수행

hashtag
4. 기존 메타데이터 삭제

hashtag
SRC DB

hashtag
TAR DB

hashtag
5. 메타데이터 복구

hashtag
SRC DB

hashtag
TAR DB

circle-exclamation

주의

복구 후 반드시 COMMIT을 수행해야 한다.

circle-info

참고

$PRS_USER.PRS_DUMMY_TBL에 대해서는 INSERT 작업을 진행하지 않는다.

hashtag
6. Config 파일 검토 및 수정

각 설정 파일의 파라미터를 기존 설정과 비교하여 알맞게 수정한다.

  • <$instance_ID>_ext#.cfg

  • <$instance_ID>_apply1.cfg

  • <$instance_ID>_llob1.cfg

hashtag
7. Prosync 재기동

hashtag

참고자료_파라미터

hashtag
Overview

An initialization parameter describes a ProSync configuration. It is provided with a text file and required to create a ProSync.

An initialization parameter file is a text file, with a filename in the form prosync.cfg needed when starting a ProSync. It can be edited using a document editor provided with the operating system. Once the initialization parameter file is modified, the ProSync must be restarted to apply the modification to the entire system.

However, not all initialization parameters require the restarting of the ProSync after their modification. Some parameters can be modified while being used by an instance. These parameters are applied only to the current instance, not the initialization parameter file.

hashtag


hashtag
Class Attributes

This section explains the class attributes necessary for users to understand the information configured in the initialization parameter file.

Group
Class
Description

hashtag

C99 지원 컴파일러

JDK 1.8 이상

64bit

HP

Itanium

HP-UX 11i v2 (11.23)

C99 지원 aC++/ANSI C B3910B A.06.02 [May 11 2005]

JDK 1.8 이상

64bit

IBM

PPC 5L

AIX 5.3 / 6.1 / 7.1

C99 지원 컴파일러, IBM XL C/C++ Enterprise Edition V7.0

JDK 1.8 이상

64bit

GNU

x86 (Pentium4 이상)

Red Hat Enterprise Linux 4.5, 7, 8.1 ~ 8.10 Oracle Linux 9.4

kernel 2.6.9 이상, C99 지원 컴파일러, gcc 3.4.6

JDK 1.8 이상

64bit

Mandatory

A parameter required to start up a system. If these parameter are not defined in the initialization parameter file, the system cannot be booted.

Optional

A parameter that uses a default value if not defined in the initialization parameter.

Static/Dynamic

Static

A parameter that cannot be modified during system operation.

Dynamic

A parameter that can be modified during system operation.

Mandatory/Optional

PRS_HOME

ProSync가 설치된 최상위 디렉토리를 설정한다.

PATH

파일 시스템을 통해 특정 파일에 접근하기 위한 디렉토리 경로를 설정하는 환경변수이다. 아래와 같이 설정한다.

LD_LIBRARY_PATH

DB 접속을 위해 클라이언트 라이브러리에 대한 접근 경로를 설정한다.

OS에 따라 LIBPATH, SHLIB_PATH 등으로 다를 수 있으며, 아래와 같이 설정한다.

별칭 설정 가이드
별칭 설정 가이드
별칭 설정 가이드
,
BLOB
컬럼의 경우,Target PostgreSQL의 OID 컬럼에 저장할 수 있으며 MAPPING RULE에 LARGEOBJECT 설정이 필요하다.

단, Source DB에서 지원하는 Character Set의 범위가 Target DB에서 지원하는 Character Set의 범위보다 넓을 경우, 변환 과정에서 Target DB에서 표현할 수 없는 문자가 발생할 수 있으며, 이 경우 해당 데이터는 깨지거나 손실될 수 있다.

  • 따라서 이와 같은 문제를 방지하기 위해서는 양쪽 DB의 Character Set 호환성을 사전에 검토하고, 필요 시 Target DB의 Character Set을 상위 호환되는 문자 집합으로 설정하는 것이 권장된다.

  • IDENTITY COLUMN

    IDENTITY COLUMN 의 경우 ALWAYS 옵션을 사용하면 동기화가 불가능하다. 그 외 BY DEFAULT, NOT NULL 옵션의 경우 동기화가 가능하지만, target의 identity 칼럼 sequence를 사용하지 않고 source 에 저장된 값을 동기화한다.

    Tibero

    VARCHAR2, NVARCHAR2, NUMBER, FLOAT, LONG, DATE, BINARY_FLOAT, BINARY_DOUBLE, TIMESTAMP, TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE, INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND, RAW, CHAR, NCHAR, CLOB, NCLOB, BLOB, XMLTYPE

    Oracle

    VARCHAR2, NVARCHAR2, NUMBER, FLOAT, LONG, DATE, BINARY_FLOAT, BINARY_DOUBLE, TIMESTAMP, TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE, INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND, RAW, CHAR, NCHAR, CLOB, NCLOB, BLOB, XMLTYPE

    PostgreSQL

    CHAR, VARCHAR, INT, SMALLINT, BIGINT, DECIMAL, REAL, DOUBLE PRECISION, BYTEA, TEXT, DATE, TIMESTAMP

    AGENT_CM_GROUP_[n]

    CM Failover 기능을 사용하는 경우, 해당 Agent가 속한 CM 그룹 이름을 지정한다.

    AGENT_CM_ID_[n]

    CM Failover 기능을 사용하는 경우, Agent가 연결될 CM의 ID를 지정한다. 각 그룹 내에서는 중복되지 않아야 하며, 그룹이 다를 경우 중복 가능하다.

    IP 주소 입력 시 VIP(Virtual IP) 대신 실제 IP 주소를 사용할 것을 권장한다.

    AGENT_CNT

    설치할 Agent의 개수를 지정한다. 지정한 수만큼 아래 항목을 추가로 작성해야 한다. (필수)

    AGENT_ID_[n]

    각 Agent의 고유 ID를 지정한다. 숫자로 시작할 수 없으며, 고유하게 식별 가능한 이름을 설정해야 한다. (필수)

    AGENT_HOST_[n]

    Agent가 설치될 호스트를 지정한다. Hostname보다 IP 주소를 사용하는 것을 권장한다. (필수)

    AGENT_PORT_[n]

    -h

    도움말 출력

    -c

    사용할 환경설정 파일 지정 (기본값: prs_install_agent.cfg)

    -y

    기존 Agent 설정을 제거하고 새로 생성. prs_instance.map의 중복 항목도 교체됨

    Agent가 사용할 포트를 지정한다. (필수)

    PRS_TS_FILE

    ProSync 운영 데이터를 저장할 테이블스페이스 파일명. PostgreSQL의 경우, 파라미터 미지원. (기본값:[INSTANCE_ID]_ts.dtf)

    PRS_TS_SIZE

    ProSync 운영 데이터를 저장할 테이블스페이스 크기. PostgreSQL의 경우, 파라미터 미지원. (기본값: 1G)

    PRS_SKIP_USER_CREATE

    ProSync 운영에 사용되는 데이터베이스 사용자를 생성하지 않고 기존 사용자를 사용할 경우 설정 (기본값: N)

    PRS_TARGET_MIN_PRIVILEGE

    Target DB 사용자에게 최소 권한만 부여해 DML 동기화만 수행할 경우 설정 (기본값: N)

    PRS_LOG_DIR

    ProSync운영 중 생성되는 로그 파일의 저장 경로 (기본값: $PRS_HOME/var/{INSTANCE_ID}/logs)

    LOG_BACKUP_DIR

    이전 로그 파일을 저장할 경로 (기본값: $PRS_HOME/var/{INSTANCE_ID}/logs/backup)

    CREATE_DSN_FILE

    프로싱크가 사용 할 tbdsn.tbr/tnsnames.ora/pg_service.conf 파일을 생성하려는 경우 설정(기본값: N)

    DSN_DIR

    프로싱크가 db 접속에 사용할 tbdsn.tbr/tnsnames.ora/pg_service.conf 파일이 위치한 경로. 설정하지 않거나 존재하지 않는 경우, 시스템 기본 값 사용

    DSN_FILE

    프로싱크가 db 접속에 사용할 tbdsn.tbr/pg_service.conf 파일 명. 설정하지 않거나 존재하지 않는 경우, 시스템 기본 값 사용

    AGENT_LIST_DELIMITER

    Agent 정보가 2개 이상일 경우 구분자로 사용할 문자. 현재는 Agent 1개 사용 권장

    EXT_CNT

    Ext 프로세스 수. Source DB 수와 동일하게 설정 (필수 항목)

    EXT_AGENT_ID_LIST

    Ext 프로세스에 연결할 Agent ID. EXT_CNT 수만큼 입력 (필수 항목)

    APPLY_PORT

    Apply 프로세스의 포트 번호 (필수 항목)

    APPLY_AGENT_ID_LIST

    Apply 프로세스에 연결할 Agent ID (필수 항목)

    LLOB_PORT

    Llob 프로세스의 포트 번호 (필수 항목)

    LLOB_AGENT_ID_LIST

    Llob 프로세스에 연결할 Agent ID (필수 항목)

    SRC_DB_TYPE

    Source DB 종류. (TIBERO / ORACLE / POSTGRE) (필수 항목)

    SRC_DB_NAME

    Source DB의 별칭(Alias). (필수 항목)

    SRC_INSTALL_USER

    Source DB 접속용 계정. 설치에 필요한 권한을 갖춘 계정이어야 함. (필수 항목)

    SRC_INSTALL_PWD

    SRC_INSTALL_USER의 암호. 설정하지 않으면 설치 중 입력받음.

    AUTO_ADD_SUPP_LOG

    동기화 대상 테이블에 supplemental log를 자동 추가할지 여부. (기본값: Y)

    SRC_SKIP_TS_CREATE

    테이블스페이스를 생성하지 않고 기존 것을 사용할 경우 설정. (기본값: N)

    SRC_DB_CNT

    클러스터 환경에서 노드 수. (기본값: 1)

    SRC_DB_REAL_NAME

    Source DB의 DB Name.

    SRC_DB_IP

    Source DB의 IP 주소.

    SRC_DB_PORT

    Source DB의 포트 번호.

    SRC_DB_ALIAS_[n]

    클러스터 환경에서 각 노드의 DB 별칭. SRC_DB_CNT 수만큼 입력.

    SUPP_LOG_LVL_ALL

    supplemental log를 걸 때 level 설정 여부. Y 설정 시 database level로 설정됨. (기본값: N )

    AUTO_SYNC_ON_CREATE

    ProSync 설치 이후 CREATE 문으로 생성된 테이블 및 시퀀스를 자동으로 동기화 대상에 등록할지 여부를 지정 (Oracle 전용, 기본값: N)

    USE_LOGMNR

    Oracle LogMiner를 통해 로그를 추출할 경우 설정. (기본값: N)

    DICT_FILE_DIR

    Oracle LogMiner 사용 시 dict 파일 저장 위치. Oracle 유저가 접근 가능해야 함.

    PRS_EXT_IP

    for mysql only

    TAR_DB_TYPE

    Target DB 종류. (TIBERO / ORACLE / POSTGRESQL) (필수 항목)

    TAR_DB_NAME

    Target DB 별칭(Alias). (필수 항목)

    TAR_INSTALL_USER

    Target DB 접속용 계정. 설치 권한을 갖춘 계정이어야 함. (필수 항목)

    TAR_INSTALL_PWD

    TAR_INSTALL_USER의 암호. 설정하지 않으면 설치 중 입력받음.

    TAR_SKIP_TS_CREATE

    테이블스페이스를 생성하지 않고 기존 것을 사용할 경우 설정. (기본값: N)

    TAR_DB_REAL_NAME

    Target DB의 DB Name.

    TAR_DB_IP

    Target DB의 IP 주소.

    TAR_DB_PORT

    Target DB의 포트 번호.

    PRS_APPLY_IP

    for mysql only

    GROUP_NUM

    Multi-Grouping 모드에서 replay group 수. (기본값: 1)

    USE_TDE

    TDE_WALLET_PWD를 수동으로 입력받기 위한 설정. Y로 설정 시 설치 중 사용자 입력 요구.

    prs_adm.cfg: admin process의 설정 파일

    PRS_DD_SEQ_TBL

    Data Dictionary에 대한 시퀀스와 그 때의 오브젝트 정보를 가지고 있다. 이 테이블은 추가적으로 drop된 여부까지 판단한다.

    PRS_DD_SGMT

    동기화 대상 테이블의 세그먼트 ID 정보를 저장

    PRS_DD_TBL

    동기화 대상 테이블 이름 정보를 저장

    PRS_DD_USR

    Source DB 사용자 정보를 저장

    PRS_DD_SEQ

    Data Dictionary용 시퀀스

    PRS_DICT_HIST

    TSN 기준 Dictionary 파일 이름 저장

    PRS_DUMMY_TBL

    Dummy log를 생성시키기 위해 dummy dml을 수행하는 테이블

    PRS_IMPORTED_ARCHIVE_LOG

    Oracle 로그마이너 모드에서 특정 archive log 지정 시 사용

    PRS_INSTALL_HIST

    설치한 유저 정보 및 설치 시간 저장

    PRS_IPARAM

    ProSync 파라미터 정보를 저장

    PRS_LOGMNR_INFO

    Oracle 로그마이너 추출 관련 정보를 저장

    PRS_OBJ_LIST

    동기화 대상 오브젝트 ID 정보를 저장

    PRS_TXINFO

    트랜잭션 정보 저장 테이블

    PRS_COMMITTED_TX_LIST

    Source DB에서 커밋된 TX 정보 저장

    INSTANCE_ID

    ProSync를 설치하기 위한 ID. 사용자가 관리 목적으로 임의로 지정한 ID를 입력한다. 이 값은 Tablespace name으로 유효한 형식이어야 하며, 숫자로 시작할 수 없다. (필수 항목)

    PRS_USER

    ProSync 운영을 위해 소스 및 Target DB에 생성할 사용자 이름

    PRS_PWD

    PRS_USER의 암호. 설정하지 않으면 설치 중에 입력받는다.

    PRS_TS_NAME

    -h

    도움말 출력

    -c

    사용할 환경설정 파일 지정 (기본값: prs_install.cfg)

    -l

    동기화 리스트 파일 지정 (기본값: prs_obj_group1.list)

    PRS_DDL_HIST

    DDL 발생에 따른 DD 이미지 정보 관련 히스토리 테이블

    PRS_DD_COL

    동기화 대상 테이블의 컬럼 정보

    PRS_DD_CON

    DB constraint 정보를 저장

    PRS_DD_ENC

    PRS_DD_META

    PRS_DDL_TRG가 이미지 관리를 위해 사용

    PRS_DUMMY

    Dummy 부하 생성을 위한 PACKAGE

    PRS_DDL_TRG

    DD 이미지 관리를 위한 Trigger

    PRS_INSTALL_HIST

    설치 정보 저장

    PRS_CONST_HIST

    반영된 리두/아카이브 로그 정보 저장

    PRS_CONST_SEQ

    반영된 리두/아카이브 로그 정보의 시퀀스 저장

    PRS_LCT

    ProSync 운영 데이터를 저장할 테이블스페이스 이름. PostgreSQL의 경우, 파라미터 미지원. (기본값: [INSTANCE_ID]_ts)

    암호화된 컬럼 관련 정보

    반영 스레드가 마지막으로 반영한 TX의 정보를 저장

    Admin 가이드

    그룹의 종류를 나타내기 위한 용도이다. (필수)

    failover

    string

    agent가 종료되었을때 failover 기능 사용 여부이다. (default: true)

    string(directory path)

    agent cmd를 실행시킬 script가 위치한 절대경로이다 (필수)

    pubnet

    string

    public 용도로 사용할 네트워크 리소스 이름이다. dependency를 추가하려면 입력해야한다.

    retry_cnt

    integer

    최대 retry 시도 횟수이다. (default: 3)

    위치에 script가 없는 경우
  • script의 권한이 없는 경우

  • script가 문제가 생겨 timeout될 경우

  • name

    string

    그룹 리소스 이름이다. (unique, 필수)

    cname

    string

    해당 그룹 리소스가 속할 cluster 리소스 이름이다. (필수)

    grptype

    name

    string

    agent 리소스 이름이다. (unique, 필수)

    grpname

    string

    agent 리소스가 속할 그룹 리소스 이름이다 (필수)

    string

    script

    Agent 설치arrow-up-right

    prs_agent_<$Agent_ID>.cfg →prs_mgr.cfg

  • prs_instance.map → prs_top.map

  • export PATH=$PRS_HOME/bin:$PRS_HOME/client/bin:$PATH
    export LD_LIBRARY_PATH=$PRS_HOME/lib:$PRS_HOME/client/lib:$LD_LIBRARY_PATH
    _ENABLE_LOG_MINER=Y # ProSync가 사용하기 위한 추가적인 redo log를 남기기 위함
    _SPAN_UNDO=N  # Tibero 6 FS07 이상에서 설정
    _DDL_TRIGGER_ENABLE=Y # meta table정보관리를 위한 설정, 기본값은 Y이므로 설정하지 않아도 무방함
    $ tbboot -t mount
    $ tbsql sys/password
    SQL> ALTER DATABASE ARCHIVELOG;
    SQL> QUIT
    $ tbdown
    $ tbboot
    $ sqlplus / as sysdba
    SQL> STARTUP MOUNT;
    SQL> ALTER DATABASE ARCHIVELOG;
    SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
    SQL> ALTER DATABASE OPEN;
    $ sqlplus / as sysdba
    SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=4 SCOPE=SPFILE;
    SQL> ALTER SYSTEM SET OPEN_LINKS=4 SCOPE=SPFILE;
    SQL> ALTER SYSTEM SET AQ_TM_PROCESSES=1 SCOPE=SPFILE;
    $ cat postgresql.conf | grep wal_level
    wal_level = logical                     # minimal, replica, or logical
    $TB_HOME/client/config/tbdsn.tbr
    [SOURCE_SID]=(
        (INSTANCE=(HOST=SOURCE DB IP)
                  (PORT=SOURCE DB PORT)
                  (DB_NAME=SOURCE DB NAME))
    )
    
    [TARGET_SID]=(
        (INSTANCE=(HOST=TARGET DB IP)
                  (PORT=TARGET DB PORT)
                  (DB_NAME=TARGET DB NAME))
    )
    $ORACLE_HOME/network/admin/tnsnames.ora
    [SOURCE_ALIAS]=
    (DESCRIPTION=
        (ADDRESS=(PROTOCOL=TCP)
                 (HOST=SOURCE DB IP)
                 (PORT=SOURCE DB PORT))
        (CONNECT_DATA=(SERVER=DEDICATED)
                      (SERVICE_NAME=SOURCE DB SERVICE NAME))
    )
    
    [TARGET_ALIAS]=
    (DESCRIPTION=
        (ADDRESS=(PROTOCOL=TCP)
                 (HOST=TARGET DB IP)
                 (PORT=TARGET DB PORT))
        (CONNECT_DATA=(SERVER=DEDICATED)
                      (SERVICE_NAME=TARGET DB SERVICE NAME))
    )
    ~/pg_service.conf
    [SOURCE_ALIAS]
    host=SOURCE DB IP
    port=SOURCE DB PORT
    dbname=SOURCE DB NAME
    
    [SOURCE_ALIAS]
    host=TARGET DB IP
    port=TARGET DB PORT
    dbname=TARGET DB NAME
    
    [EXAMPLE_FOR_REPLICATION]
    host=SOURCE DB IP
    port=SOURCE DB PORT
    dbname=SOURCE DB NAME
    replication=database
    $ tbsql sys/password
    
    SQL> CREATE USER TEST IDENTIFIED BY PASSWORD;
    SQL> GRANT RESOURCE, CONNECT TO TEST;
    
    SQL> CREATE TABLE TEST.T1 (C1 NUMBER PRIMARY KEY, C2 VARCHAR(10));
    SQL> CREATE TABLE TEST.T2 (C1 NUMBER PRIMARY KEY, C2 VARCHAR(10));
    SQL> CREATE TABLE TEST.T3 (C1 NUMBER PRIMARY KEY, C2 VARCHAR(10));
    $PRS_HOME/install/prs_obj_group1.list
    TEST.T1
    TEST.T2
    TEST.T3
    TEST.%
    TEST%.%
    ############################################
    #
    # ProSync Agent Configurations (Template)
    #
    ############################################
    # ID have to be unique in prs_instance.map.
    # It will checked when execute prs_install_agent.sh.
    # Because of multi-agent environment,
    # HOSTNAME(defined in /etc/hosts) is not recommended, IP will be better.
    # AGENT_HOST[%d]=192.xxx.xxx.xxx
    
    # AGENT_ID is unique key in prosync
    # All nodes have to use same AGENT_ID in same agent.
    
    AGENT_CNT=1
    AGENT_ID_0=agent
    AGENT_HOST_0=localhost
    AGENT_PORT_0=7600
    #AGENT_CM_GROUP_0=0
    #AGENT_CM_ID_0=0
    
    #AGENT_ID_1=agent2
    #AGENT_HOST_1=localhost
    #AGENT_PORT_1=7601
    #AGENT_CM_GROUP_1=1
    #AGENT_CM_ID_1=1
    AGENT_CNT=4
    
    AGENT_ID_0=agent1
    AGENT_HOST_0=172.17.0.1
    AGENT_PORT_0=7600
    AGENT_CM_GROUP_0=CM1
    AGENT_CM_ID_0=0
    
    AGENT_ID_1=agent2
    AGENT_HOST_1=172.17.0.2
    AGENT_PORT_1=7601
    AGENT_CM_GROUP_1=CM1
    AGENT_CM_ID_1=1
    
    AGENT_ID_2=agent3
    AGENT_HOST_2=172.17.0.3
    AGENT_PORT_2=7602
    AGENT_CM_GROUP_2=CM2
    AGENT_CM_ID_2=0
    
    AGENT_ID_3=agent4
    AGENT_HOST_3=172.17.0.4
    AGENT_PORT_3=7603
    AGENT_CM_GROUP_3=CM2
    AGENT_CM_ID_3=1
    $ . prs_install_agent.sh [option] [config file]
    $ cd $PRS_HOME/install
    $ . prs_install_agent.sh
    ********************************************************************************
    * Agent Install Step (1/4)
    * Check System Parameters 
    ********************************************************************************
    * Checking system type... 
    Linux
    
    * Checking PRS_HOME... 
    PRS_HOME: /home/prosync/example
    
    ********************************************************************************
    * Agent Install Step (2/4)
    * Check install agent config file   [prs_install_agent.cfg]  
    * Check Instance file               [prs_instance.map] 
    ********************************************************************************
    * Checking configuration file... 
    [/home/prosync/example/install/prs_install_agent.cfg] exists.
    
    * Checking Agent configuration... 
    parameter check for Agent[0] Started 
        AGENT_ID: agent1
        AGENT_HOST: 172.17.0.1
        AGENT_PORT: 7600
        AGENT_CM_GROUP: CM1
        AGENT_CM_ID: 0
    parameter check for Agent[0] Done 
    parameter check for Agent[1] Started 
        AGENT_ID: agent2
        AGENT_HOST: 172.17.0.2
        AGENT_PORT: 7601
        AGENT_CM_GROUP: CM1
        AGENT_CM_ID: 1
    parameter check for Agent[1] Done 
    parameter check for Agent[2] Started 
        AGENT_ID: agent3
        AGENT_HOST: 172.17.0.3
        AGENT_PORT: 7602
        AGENT_CM_GROUP: CM2
        AGENT_CM_ID: 0
    parameter check for Agent[2] Done 
    parameter check for Agent[3] Started 
        AGENT_ID: agent4
        AGENT_HOST: 172.17.0.4
        AGENT_PORT: 7603
        AGENT_CM_GROUP: CM2
        AGENT_CM_ID: 1
    parameter check for Agent[3] Done 
    
    * Checking prs_instance.map file... 
    [/home/prosync/example/config/prs_instance.map] exists.
    
    ********************************************************************************
    * Agent Install Step (3/4)
    * Writing agent config file         [/home/prosync/example/install/prs_install_agent.cfg]  
    * Writing Instance file             [/home/prosync/example/config/prs_instance.map] 
    * Total Agent Cnt                   [4] 
    ********************************************************************************
    * Writing all agents.. cnt: 4
    * Writing Agent.. Index:           0
    * Writing Agent.. AGENT_ID:        agent1
    * Writing Agent.. AGENT_HOST:      172.17.0.1
    * Writing Agent.. AGENT_PORT:      7600
    * Writing Agent.. AGENT_CM_GROUP:  CM1
    * Writing Agent.. AGENT_CM_ID:     0
    * Writing Agent configuration... 
    File already exists... 
    [/home/prosync/example/config/prs_agent_agent1.cfg]
    Want to Delete ? (Y/N)
    n
    Skip deleteing...
    
    * Writing Agent information... 
    Agent information already exist
    Want to Replace ? (Y/N)
    n
    Skipped... 
    
    
    * Writing Agent.. Index:           1
    * Writing Agent.. AGENT_ID:        agent2
    * Writing Agent.. AGENT_HOST:      172.17.0.2
    * Writing Agent.. AGENT_PORT:      7601
    * Writing Agent.. AGENT_CM_GROUP:  CM1
    * Writing Agent.. AGENT_CM_ID:     1
    * Writing Agent configuration... 
    /home/prosync/example/config/prs_agent_agent2.cfg not found. Writing files...
    Done.
    
    * Writing Agent information... 
    
    
    * Writing Agent.. Index:           2
    * Writing Agent.. AGENT_ID:        agent3
    * Writing Agent.. AGENT_HOST:      172.17.0.3
    * Writing Agent.. AGENT_PORT:      7602
    * Writing Agent.. AGENT_CM_GROUP:  CM2
    * Writing Agent.. AGENT_CM_ID:     0
    * Writing Agent configuration... 
    /home/prosync/example/config/prs_agent_agent3.cfg not found. Writing files...
    Done.
    
    * Writing Agent information... 
    
    
    * Writing Agent.. Index:           3
    * Writing Agent.. AGENT_ID:        agent4
    * Writing Agent.. AGENT_HOST:      172.17.0.4
    * Writing Agent.. AGENT_PORT:      7603
    * Writing Agent.. AGENT_CM_GROUP:  CM2
    * Writing Agent.. AGENT_CM_ID:     1
    * Writing Agent configuration... 
    /home/prosync/example/config/prs_agent_agent4.cfg not found. Writing files...
    Done.
    
    * Writing Agent information... 
    
    
    * Creating var directory...
       * Already Created.
    ********************************************************************************
    * Agent Install Step (4/4)
    * Creating files for CM
    ********************************************************************************
    AGENT_CM_ID detected
    generating prs_0.sh...
    PRS_HOME=/home/prosync/example
    AGENT_ID=agent1
    prs_0.sh has created in $PRS_HOME/bin/
    AGENT_CM_ID detected
    generating prs_1.sh...
    PRS_HOME=/home/prosync/example
    AGENT_ID=agent2
    prs_1.sh has created in $PRS_HOME/bin/
    AGENT_CM_ID detected
    generating prs_0.sh...
    PRS_HOME=/home/prosync/example
    AGENT_ID=agent3
    prs_0.sh has created in $PRS_HOME/bin/
    AGENT_CM_ID detected
    generating prs_1.sh...
    PRS_HOME=/home/prosync/example
    AGENT_ID=agent4
    prs_1.sh has created in $PRS_HOME/bin/
    Agent installation Done.
    $ cd $PRS_HOME/config
    $ ls -al
    total 51
    drwxr-xr-x  3 users users 4096 Apr 16 15:42 .
    drwxr-xr-x 15 users users 4096 Apr 14 15:08 ..
    -rw-r--r--  1 users users  367 Feb 27 19:22 prs_agent_agent1.cfg
    -rw-r--r--  1 users users  367 Apr 16 15:32 prs_agent_agent2.cfg
    -rw-r--r--  1 users users  367 Apr 16 15:32 prs_agent_agent3.cfg
    -rw-r--r--  1 users users  367 Apr 16 15:32 prs_agent_agent4.cfg
    -rw-r--r--  1 users users 1272 Apr 16 15:32 prs_instance.map
    drwxr-xr-x  2 users users 4096 Apr 14 15:08 templates
    -rw-r--r--  1 users users    5 Feb 27 13:06 variant
    #--------------------------------------------------------
    # ProSync Instances Map (prs_instance.map)
    #
    # Generated by Dummy Time: 04-16T14:22:21.920319
    #
    
    AGENT=(ID=agent1)(HOST=172.17.0.1)(PORT=7600)(CM_GROUP=CM1)(CM_ID=0)
    
    #--------------------------------------------------------
    # Appended by prs_install_agent.sh at Wed Apr 16 03:32:37 PM KST 2025
    #
    
    AGENT=(ID=agent2)(HOST=172.17.0.2)(PORT=7601)(CM_GROUP=CM1)(CM_ID=1)
    
    #--------------------------------------------------------
    # Appended by prs_install_agent.sh at Wed Apr 16 03:32:37 PM KST 2025
    #
    
    AGENT=(ID=agent3)(HOST=172.17.0.3)(PORT=7602)(CM_GROUP=CM2)(CM_ID=0)
    
    #--------------------------------------------------------
    # Appended by prs_install_agent.sh at Wed Apr 16 03:32:37 PM KST 2025
    #
    
    AGENT=(ID=agent4)(HOST=172.17.0.4)(PORT=7603)(CM_GROUP=CM2)(CM_ID=1)
                                                                              
    ################################################################################
    # ProSync Agent Configurations (Template)
    ################################################################################
    LISTENER_PORT=7600
    LOG_LEVEL=3
    LOG_DIR=/home/prosync/example/var/agent/agent1/log
    LOG_BACKUP_DIR=/home/prosync/example/var/agent/agentA/log/backup
    #!/bin/sh
    
    export TB_HOME=
    export PRS_HOME=/home/prosync/example
    AGENT_ID=agent1
    TIMEOUT_CNT=7
    source $PRS_HOME/bin/prs_cm.sh
    export logdir=$PRS_HOME/var
    
    echo "------------------------------------------------------------" >> $logdir/cmagent.log
    echo "`date +%Y/%m/%d\ %H:%M:%S` cm agent Start (Agent Command $1)" >> $logdir/cmagent.log
    case $1 in
    START)
        echo "start $TIMEOUT_CNT $AGENT_ID" >> $logdir/cmagent.log
        start $TIMEOUT_CNT $AGENT_ID
        rc=$?
        ;;
    PROBE)
        echo "probe $TIMEOUT_CNT $AGENT_ID" >> $logdir/cmagent.log
        probe $TIMEOUT_CNT $AGENT_ID
        rc=$?
        ;;
    DOWN)
        echo "stop $TIMEOUT_CNT $AGENT_ID" >> $logdir/cmagent.log
        stop $TIMEOUT_CNT $AGENT_ID
        rc=$?
        ;;
    KILL)
        echo "stop $TIMEOUT_CNT $AGENT_ID" >> $logdir/cmagent.log
        stop $TIMEOUT_CNT $AGENT_ID
        rc=$?
        ;;
    NOTI)
        rc=0
        ;;
    COMMIT)
        echo "send $TIMEOUT_CNT $AGENT_ID ${@:2}" >> $logdir/cmagent.log
        send $TIMEOUT_CNT $AGENT_ID ${@:2}
        rc=$?
        ;;
    
    *)
        ;;
    esac
    echo "result :  $rc" >> $logdir/cmagent.log
    echo "`date +%Y/%m/%d\ %H:%M:%S` cm agent End  (Agent Command $1)" >> $logdir/cmagent.log
    
    
    exit $rc
    
    CONNECT                   RESOURCE                     ALTER SYSTEM
    CREATE TABLE              ALTER ANY TABLE              DROP ANY TABLE
    FLASHBACK ANY TABLE       SELECT ANY TABLE             LOCK ANY TABLE
    SELECT ON V$DATABASE      SELECT ON V$INSTANCE         SELECT ANY DICTIONARY
    EXECUTE ON SYS.SEAF
    CONNECT                       RESOURCE                        ALTER SYSTEM
    CREATE TABLE                  ALTER ANY TABLE                 DROP ANY TABLE
    FLASHBACK ANY TABLE           SELECT ANY TABLE                LOCK ANY TABLE
    ADMINISTER DATABASE TRIGGER   SELECT ANY DICTIONARY           EXECUTE ON SYS.DBMS_AQADM
    EXECUTE ON SYS.DBMS_AQ        EXECUTE ON SYS.DBMS_AQIN        AQ_ADMINISTRATOR_ROLE
    SELECT ON SYS.USER$           EXECUTE ON SYS.DBMS_AQADM_SYS   
    SELECT ANY TRANSACTION  
    
    # (12c 이상)
    LOGMINING                     CREATE ANY DIRECTORY   
    READ, WRITE ON DIRECTORY PRS_DICT_$INSTANCE_ID
    
    # 권한외 필요한사전 설정
    ALTER USER PRS_USER QUOTA UNLIMITED ON PRS_TS_NAME
    CREATE OR REPLACE DIRECTORY PRS_DICT AS DICT_FILE_DIR
    CONNECT              RESOURCE              CREATE SESSION
    INSERT ANY TABLE     CREATE ANY TABLE      CREATE ANY SEQUENCE
    CREATE ANY INDEX     CREATE ANY TRIGGER    CREATE ANY SYNONYM
    CREATE ANY VIEW      CREATE ANY PROCEDURE  UPDATE ANY TABLE
    DELETE ANY TABLE     SELECT ANY TABLE      SELECT ANY DICTIONARY
    ALTER SESSION        ALTER ANY TABLE       ALTER ANY INDEX
    ALTER ANY TRIGGER    ALTER ANY SEQUENCE    ALTER ANY PROCEDURE
    DROP ANY TABLE       DROP ANY INDEX        DROP ANY TRIGGER
    DROP ANY SEQUENCE    DROP ANY VIEW         DROP ANY PROCEDURE
    DROP ANY SYNONYM     COMMENT ANY TABLE
    DBA
    SUPERUSER
    CONNECT                          CREATE USER                       DROP USER
    CREATE TABLESPACE                DROP TABLESPACE                   ALTER DATABASE
    ALTER SYSTEM                     ADMINISTER DATABASE TRIGGER       ALTER ANY TABLE
    ALTER ANY TRIGGER                EXECUTE ANY PROCEDURE             DROP ANY PROCEDURE
    DROP ANY TABLE                   DROP ANY TRIGGER                  DROP ANY SEQUENCE
    GRANT ANY ROLE                   GRANT ANY PRIVILEGE               SELECT ANY TABLE
    INSERT ANY TABLE                 UPDATE ANY TABLE                  SELECT ON V$LOG
    SELECT ON V$PARAMETERS
    SELECT ON V$DATABASE WITH GRANT OPTION  
    SELECT ON V$INSTANCE WITH GRANT OPTION   
    SELECT ON SYS._DD_OBJ WITH GRANT OPTION  
    SELECT ON SYS._DD_USER WITH GRANT OPTION 
    SELECT ON SYS._DD_IDX WITH GRANT OPTION
    SELECT ON SYS._DD_IDXPART WITH GRANT OPTION 
    SELECT ON SYS._DD_TBL WITH GRANT OPTION 
    SELECT ON SYS._DD_TBLPART WITH GRANT OPTION
    SELECT ON SYS._DD_TBLSUBPART WITH GRANT OPTION 
    SELECT ON SYS._DD_COL WITH GRANT OPTION 
    SELECT ON SYS._DD_ICOL WITH GRANT OPTION
    EXECUTE ON SYS.SEAF WITH GRANT OPTION
    CONNECT                     CREATE SESSION                ALTER SESSION
    CREATE USER                 DROP USER                     CREATE TABLESPACE
    DROP TABLESPACE             ALTER DATABASE                ALTER SYSTEM
    ADMINISTER DATABASE TRIGGER ALTER ANY TABLE               ALTER ANY TRIGGER
    EXECUTE ANY PROCEDURE       DROP ANY PROCEDURE            DROP ANY TABLE
    DROP ANY TRIGGER            DROP ANY SEQUENCE             GRANT ANY ROLE
    GRANT ANY PRIVILEGE         SELECT ANY TABLE              INSERT ANY TABLE
    UPDATE ANY TABLE            ALTER USER                    SELECT ON SYS.V_$PARAMETER
    SELECT ON SYS.V_$DATABASE   SELECT ON SYS.V_$INSTANCE     SELECT ON SYS.V_$LOG
    SELECT ON SYS.USER$ WITH GRANT OPTION
    EXECUTE ON SYS.DBMS_AQ WITH GRANT OPTION
    EXECUTE ON SYS.DBMS_AQIN WITH GRANT OPTION
    EXECUTE ON SYS.DBMS_AQADM WITH GRANT OPTION
    EXECUTE ON SYS.DBMS_AQADM_SYS WITH GRANT OPTION
    EXECUTE ON SYS.DBMS_LOGMNR WITH GRANT OPTION
    EXECUTE ON SYS.DBMS_LOGMNR_D WITH GRANT OPTION
    EXECUTE ON SYS.DBMS_LOGMNR_INTERNAL WITH GRANT OPTION
    EXECUTE DBMS_AQADM.GRANT_SYSTEM_PRIVILEGE('MANAGE_ANY', 'PRS_INSTALL_USER')
    -- PDB의 경우 common user에 대해 수행 필요
    SET CONTAINER
    SUPERUSER
    CONNECT                  CREATE USER               DROP USER
    CREATE TABLESPACE        DROP TABLESPACE           EXECUTE ANY PROCEDURE
    DROP ANY PROCEDURE       DROP ANY TABLE            DROP ANY SEQUENCE
    GRANT ANY ROLE           GRANT ANY PRIVILEGE       SELECT ANY TABLE
    INSERT ANY TABLE         SELECT ANY SEQUENCE       SELECT ON V$PARAMETERS
    CONNECT                  CREATE USER               DROP USER
    CREATE TABLESPACE        DROP TABLESPACE           EXECUTE ANY PROCEDURE
    DROP ANY PROCEDURE       DROP ANY TABLE            DROP ANY SEQUENCE
    GRANT ANY ROLE           GRANT ANY PRIVILEGE       SELECT ANY TABLE
    INSERT ANY TABLE         SELECT ANY SEQUENCE       SELECT ON SYS.V_$PARAMETER
    SUPERUSER
    ############################################
    #
    # ProSync Installation Parameters
    #
    ############################################
    
    # (Mandatory)
    INSTANCE_ID=
    PRS_USER=prosync
    PRS_PWD=
    
    # (Optional)
    #PRS_TS_NAME=
    #PRS_TS_FILE=
    #PRS_TS_SIZE=
    #PRS_SKIP_USER_CREATE=N
    #PRS_TARGET_MIN_PRIVILEGE=N
    #PRS_LOG_DIR=
    #LOG_BACKUP_DIR=
    #CREATE_DSN_FILE=N
    #DSN_DIR=
    #DSN_FILE=#need DSN_DIR
    
    ############################################
    #
    # ProSync Processes Informations for Instance Map
    #
    ############################################
    ### (Optional)
    AGENT_LIST_DELIMITER=,
    
    ### (Mandatory)
    # Ext process
    ## Ext cnt must be the same as SRC_DB_CNT
    EXT_CNT=
    EXT_AGENT_ID_LIST_0=agent1
    #EXT_AGENT_ID_LIST_1=agent1,agent2
    
    # Apply process
    APPLY_PORT=7620
    APPLY_AGENT_ID_LIST=agent1
    
    # Llob process
    LLOB_PORT=7630
    LLOB_AGENT_ID_LIST=agent1
    
    ############################################
    #
    # Source database informations
    #
    ############################################
    
    # (Mandatory)
    SRC_DB_TYPE=TIBERO
    SRC_DB_NAME=
    SRC_INSTALL_USER=
    SRC_INSTALL_PWD=
    
    # (Optional)
    #AUTO_ADD_SUPP_LOG=Y
    #SRC_SKIP_TS_CREATE=N
    
    # (Number Of Database Instances)
    #SRC_DB_CNT=1
    
    # (Dsn)
    #SRC_DB_REAL_NAME=
    #SRC_DB_IP_0=
    #SRC_DB_PORT_0=
    #SRC_DB_IP_1=
    #SRC_DB_PORT_1=
    
    # (for Cluster, only Extract Needed)
    #SRC_DB_ALIAS_0=
    #SRC_DB_ALIAS_1=
    
    # (for ORACLE DB Only) 
    #SUPP_LOG_LVL_ALL=N
    #AUTO_SYNC_ON_CREATE=N 
    
    # (for Oracle Logminer only)
    # Oracle 11g or less, use utl_file_dir instead of DICT_FILE_DIR
    #USE_LOGMNR=Y
    #DICT_FILE_DIR=
    
    # (for MySQL only)
    #PRS_EXT_IP=
    
    ############################################
    #
    # Target database informations
    #
    ############################################
    
    # (Mandatory)
    TAR_DB_TYPE=TIBERO
    TAR_DB_NAME=
    TAR_INSTALL_USER=
    TAR_INSTALL_PWD=
    
    # (Optional)
    #TAR_SKIP_TS_CREATE=N
    
    # (Number Of Database Instances)
    #TAR_DB_CNT=1
    
    # (Dsn)
    #TAR_DB_REAL_NAME=
    #TAR_DB_IP_0=
    #TAR_DB_PORT_0=
    #TAR_DB_IP_1=
    #TAR_DB_PORT_1=
    
    # (for MySQL only)
    #PRS_APPLY_IP=
    
    # (for multi thread)
    #GROUP_NUM=1
    
    # (for TDE(transparent data encryption) synchronization)
    #USE_TDE=N
    ############################################
    #
    # ProSync Installation Parameters
    #
    ############################################
    
    # (Mandatory)
    INSTANCE_ID=instance
    PRS_USER=prosync_user
    PRS_PWD=prosync_user_password
    
    # (Optional)
    #PRS_TS_NAME=
    #PRS_TS_FILE=
    #PRS_TS_SIZE=
    #PRS_SKIP_USER_CREATE=N
    #PRS_TARGET_MIN_PRIVILEGE=N
    #PRS_LOG_DIR=
    #LOG_BACKUP_DIR=
    #CREATE_DSN_FILE=N
    #DSN_DIR=
    #DSN_FILE=#need DSN_DIR
    
    ############################################
    #
    # ProSync Processes Informations for Instance Map
    #
    ############################################
    ### (Optional)
    AGENT_LIST_DELIMITER=,
    
    ### (Mandatory)
    # Ext process
    ## Ext cnt must be the same as SRC_DB_CNT
    EXT_CNT=1
    EXT_AGENT_ID_LIST_0=agent1
    #EXT_AGENT_ID_LIST_1=agent1,agent2
    
    # Apply process
    APPLY_PORT=7620
    APPLY_AGENT_ID_LIST=agent1
    
    # Llob process
    LLOB_PORT=7630
    LLOB_AGENT_ID_LIST=agent1
    
    ############################################
    #
    # Source database informations
    #
    ############################################
    
    # (Mandatory)
    SRC_DB_TYPE=TIBERO
    SRC_DB_NAME=src_tibero
    SRC_INSTALL_USER=sys
    SRC_INSTALL_PWD=tibero
    
    # (Optional)
    #AUTO_ADD_SUPP_LOG=Y
    #SRC_SKIP_TS_CREATE=N
    #AUTO_SYNC_ON_CREATE=N
    
    # (Number Of Database Instances)
    #SRC_DB_CNT=1
    
    # (Dsn)
    #SRC_DB_REAL_NAME=
    #SRC_DB_IP_0=
    #SRC_DB_PORT_0=
    #SRC_DB_IP_1=
    #SRC_DB_PORT_1=
    
    # (for Cluster, only Extract Needed)
    #SRC_DB_ALIAS_0=
    #SRC_DB_ALIAS_1=
    
    # (for ORACLE DB Only) 
    #SUPP_LOG_LVL_ALL=N
    #AUTO_SYNC_ON_CREATE=N 
    
    # (for Oracle Logminer only)
    # Oracle 11g or less, use utl_file_dir instead of DICT_FILE_DIR
    #USE_LOGMNR=Y
    #DICT_FILE_DIR=
    
    # (for MySQL only)
    #PRS_EXT_IP=
    
    ############################################
    #
    # Target database informations
    #
    ############################################
    
    # (Mandatory)
    TAR_DB_TYPE=TIBERO
    TAR_DB_NAME=tar_tibero
    TAR_INSTALL_USER=sys
    TAR_INSTALL_PWD=tibero
    
    # (Optional)
    #TAR_SKIP_TS_CREATE=N
    
    # (Number Of Database Instances)
    #TAR_DB_CNT=1
    
    # (Dsn)
    #TAR_DB_REAL_NAME=
    #TAR_DB_IP_0=
    #TAR_DB_PORT_0=
    #TAR_DB_IP_1=
    #TAR_DB_PORT_1=
    
    # (for MySQL only)
    #PRS_APPLY_IP=
    
    # (for multi thread)
    #GROUP_NUM=1
    
    # (for TDE(transparent data encryption) synchronization)
    #USE_TDE=N
    
    $ . prs_install.sh [option] [config file] [list file]
    $ cd $PRS_HOME/install
    $ . prs_install.sh
    *******************************************************************************
    * Check System Parameters (1/5)
    ********************************************************************************
    Checking system type... Linux
    Checking PRS_HOME... /home/prosync/example
    Checking TB_HOME... /home/tibero/tibero7
    Checking ORACLE_HOME... not found
    Checking psql ... available
    Checking psql service ...not found
    
    ********************************************************************************
    * Check Installation Parameters (2/5)
    ********************************************************************************
    Checking configuration file... ok
    Checking prs_instance.map file... ok
    Checking Instance Id from prs_instance.map...
    * instance information for instance was not found. It will be written in this script...
    ok
    Checking proecsses infos...
    * Checking Ext processes Informations... EXT_CNT: 1
    * Delimiter: [,]
       * Ext[0] process's Agent Id List 
           * Agent ID[agent1]
           * [agent1] found.
    * Checking Apply process Informations...
    * Checking Apply Port..
       * APPLY_PORT=[7620]
    * Checking Apply process's Agent Id List..
           * Agent ID[agent1]
           * [agent1] found.
    * Checking Llob process Informations...
    * Checking Llob Port..
       * LLOB_PORT=[7630]
    * Checking Llob process's Agent Id List..
           * Agent ID[agent1]
           * [agent1] found.
    
    Checking INSTANCE_ID... instance
    Checking PRS_USER... prosync_user
    Checking PRS_TS_NAME... instance_ts
    Checking PRS_TS_FILE... instance_ts.dtf
    Checking PRS_TS_SIZE... 1G
    Checking PRS_EXT_IP... %
    Checking PRS_APPLY_IP... %
    Checking SRC_DB_CNT... 1
    Checking SRC_DB_TYPE... TIBERO
    Checking SRC_INSTALL_USER... sys
    Checking SRC_DB_NAME... src_tibero
    Checking source connection(1/2)... ok
    Checking source connection(2/2)... ok
    _list_create: Variable TAR_DB_IP_0 is undefined or empty.
    _list_create: Variable TAR_DB_PORT_0 is undefined or empty.
    Checking TAR_DB_TYPE... TIBERO
    Checking TAR_INSTALL_USER... sys
    Checking TAR_DB_NAME... tar_tibero
    Checking target connection [tar_tibero](1/2)... ok
    Checking target connection [tar_tibero](2/2)... ok
    
    ********************************************************************************
    * Install to Source Database (3/5)
    ********************************************************************************
    Checking archived log mode... ok
    Usage: _list_get <list> <index>
    Checking log mining parameters [src_tibero]... ok
    Usage: _list_get <list> <index>
    Get Archive log directory [src_tibero]... ok
    Get Archive log format [src_tibero]... ok
    Dropping ProSync objects... ok
    Dropping ProSync tablespace... DROP TABLESPACE instance_ts INCLUDING CONTENTS AND DATAFILES;
    
    done
    
    ok
    Creating ProSync tablespace... ok
    Dropping ProSync user... ok
    Creating ProSync user... ok
    Granting privileges... ok
    Granting privileges for trigger... ok
    Creating ProSync internal tables... ok
    Creating ProSync internal package... ok
    Creating ProSync internal trigger... ok
    Prosync user prosync_user to uppercase PROSYNC_USER... ok
    Checking source object file(group num : 1)... ok
    Building source object for TEST.%... ok
    Building source object for TEST%.%... ok
    Adding table supplemental log... 6, and one for prosync
      "PROSYNC_USER"."PRS_DUMMY_TBL" : Supplemental logging set
      "TEST"."T1" : supplemental log already exists, continue.
      "TEST"."T2" : supplemental log already exists, continue.
      "TEST"."T3" : supplemental log already exists, continue.
      "TEST"."T4" : supplemental log already exists, continue.
      "TEST"."T5" : supplemental log already exists, continue.
      prosync_user.PRS_DUMMY_TBL : supplemental log already exists, continue.
    Counting total source objects... 6
    Generating initial DDL history... ok
    Checking initial DDL history... ok
    Insert default value in PRS_DUMMY_TBL...ok
    Querying NLS_CHARACTERSET... UTF8
    Querying NLS_NCHAR_CHARACTERSET... UTF16
    Switching logfile... ok
    Usage: _list_get <list> <index>
    Querying current log sequence [src_tibero]... 188
    Querying current snapshot#... 4306566
    
    ********************************************************************************
    * Install to Target Database (4/5)
    ********************************************************************************
    Dropping ProSync objects... ok
    Dropping ProSync tablespace... DROP TABLESPACE instance_ts INCLUDING CONTENTS AND DATAFILES;
    
    done
    
    ok
    Creating ProSync tablespace... ok
    Dropping ProSync user... ok
    Creating ProSync user... ok
    Granting privileges... ok
    Creating ProSync internal tables... ok
    Usage: _list_get <list> <index>
    Generating initial construct history [src_tibero (group 1)]... ok
    Generating initial commit history... ok
    
    ********************************************************************************
    * Generate Configuration Parameters (5/5)
    ********************************************************************************
    Generating Wallet... ok
    Usage: _list_get <list> <index>
    Generating Extract [src_tibero] configuration...  ok
    Generating Apply [tar_tibero] configuration...  ok
    Generating LONG/LOB configuration...  ok
    Generating instance map to prs_instance.map ...
    
    
    ********************************************************************************
    * ProSync is installed successfully on Thu, 17 Apr 2025 14:38:38 +0900.
    *
    *   PRS_HOME     = /home/prosync/example
    *   Binary Path  = /home/prosync/example/bin
    *   ProSync User = prosync_user
    *
    *   Archived Log Path     = /home/tibero/tibero7/database/tibero/archive/
    *   Archived Log Format   = log-t%t-r%r-s%s.arc
    *   Initial log sequence# = 188
    *
    *   Initial change# (TSN) = 4306566 
    *
    ********************************************************************************
    
    $ cd $PRS_HOME/config
    $ ls -al
    total 55
    drwxr-xr-x  3 users users 4096 Apr 16 15:42 .
    drwxr-xr-x 15 users users 4096 Apr 14 15:08 ..
    -rw-r--r--  1 users users  547 Apr 17 14:38 instance_apply1.cfg
    -rw-r--r--  1 users users  574 Apr 17 14:38 instance_ext1.cfg
    -rw-r--r--  1 users users  470 Apr 17 14:38 instance_llob.cfg
    -rw-r--r--  1 users users  352 Apr  3 16:19 prs_adm.cfg
    -rw-r--r--  1 users users  367 Feb 27 19:22 prs_agent_agent1.cfg
    -rw-r--r--  1 users users  367 Apr 16 15:32 prs_agent_agent2.cfg
    -rw-r--r--  1 users users  367 Apr 16 15:32 prs_agent_agent3.cfg
    -rw-r--r--  1 users users  367 Apr 16 15:32 prs_agent_agent4.cfg
    -rw-r--r--  1 users users 1272 Apr 16 15:32 prs_instance.map
    drwxr-xr-x  2 users users 4096 Apr 14 15:08 templates
    -rw-r--r--  1 users users    5 Feb 27 13:06 variant
    #--------------------------------------------------------
    # Appended by prs_install.sh at Thu Apr 17 02:38:37 PM KST 2025
    #
    
    instance=(
        EXT1=(AGENT=agent1)(PROGRAM=prs_ext)
        APPLY1=(AGENT=agent1)(PORT=7620)(PROGRAM=prs_apply)
        LLOB=(AGENT=agent1)(PORT=7630)(PROGRAM=prs_llob)
    )
    ################################################################################
    #
    # ProSync (Ext) Initialization Parameters
    #
    ################################################################################
    
    LOG_LEVEL=3
    
    PRS_USER=prosync_user
    PRS_PWD=#encrypted
    
    EXTRACT_NUM=1
    
    SRC_DB_TYPE=TIBERO
    SRC_DB_NAME=src_tibero
    
    ARCHIVE_LOG_DIR=/home/tibero/tibero7/database/tibero/archive/
    ARCHIVE_LOG_FORMAT=log-t%t-r%r-s%s.arc
    
    LOG_DIR=/home/prosync/example/var/instance/log
    LOG_BACKUP_DIR=/home/prosync/example/var/instance/log/backup
    ################################################################################
    #
    # ProSync (Apply) Initialization Parameters
    #
    ################################################################################
    
    LOG_LEVEL=3
    
    PRS_USER=prosync_user
    PRS_PWD=#encrypted
    
    APPLY_NUM=1
    
    TAR_DB_TYPE=TIBERO
    TAR_DB_NAME=tar_tibero
    
    SRC_DB_CNT=1
    
    MAP=(TABLE DEFAULT)
    
    DDL=(INCLUDE DEFAULT, TYPE=('ALTER TABLE','TRUNCATE TABLE'))
    
    LOG_DIR=/home/prosync/example/var/instance/log
    LOG_BACKUP_DIR=/home/prosync/example/var/instance/log/backup
    
    ################################################################################
    #
    # ProSync (llob) Initialization Parameters
    #
    ################################################################################
    
    LOG_LEVEL=3
    
    PRS_USER=prosync_user
    PRS_PWD=#encrypted
    
    SRC_DB_TYPE=TIBERO
    SRC_DB_NAME=src_tibero
    
    LLOB_FLASHBACK_ERROR=CURRENT
    
    LOG_DIR=/home/prosync/example/var/instance/log
    LOG_BACKUP_DIR=/home/prosync/example/var/instance/log/backup 
    ################################################################################
    #
    # ProSync (Admin) Initialization Parameters
    #
    ################################################################################
    LOG_LEVEL=3
    LOG_DIR=/home/prosync/example/var/admin/log
    LOG_BACKUP_DIR=/home/prosync/example/var/admin/log/backup
    # tree 결과예제
    .
    ├── admin
    ├── agent
    └── instance
    ProSync 4 - Admin Utility
    
    TmaxData Corporation Copyright (c) 2024-. All rights reserved.
    
    Admin>
    Admin> start agent $agent_id
    Admin> start $instance_id
    Admin> status
    ProSync 4 - Admin Utility
    
    TmaxData Corporation Copyright (c) 2024-. All rights reserved.
    
    status
    
    prs_agent ID: agent1, HOST: 172.17.0.1, PORT: 7600, CM_GROUP: CM1, CM_ID: 1 is running
    prs_agent ID: agent2, HOST: 172.17.0.2, PORT: 7601, CM_GROUP: CM1, CM_ID: 1 is stopped
    prs_agent ID: agent3, HOST: 172.17.0.3, PORT: 7602, CM_GROUP: CM2, CM_ID: 0 is stopped
    prs_agent ID: agent4, HOST: 172.17.0.4, PORT: 7603, CM_GROUP: CM2, CM_ID: 1 is stopped
    
    Instance ID: [instance]
    instance_ext1 is running (prs_agent ID : agent1, HOST: 172.17.0.1, PORT: 7600)
    instance_apply1 is running (prs_agent ID : agent1, HOST: 172.17.0.1, PORT: 7600)
    instance_llob is running (prs_agent ID : agent1, HOST: 172.17.0.1, PORT: 7600)
    cmrctl add agent --name <agent_name> --grpname <group_name> --script <directory_path>
    --pubnet <public_network_resource_name> --retry_cnt <retry_cnt>
    $ cmrctl del <resource_type> --name <resource_name>
    $ cmrctl show <resource_type> --name <resource_name>
    $ cmrctl start <resource_type> --name <resource_name>
    $ cmrctl stop <resource_type> --name <resource_name>
    $ cmrctl act <resource_type> --name <resource_name>
    $ cmrctl deact <resource_type> --name <resource_name>
    $ cmrctl modify group --name <group_name> --failover <true|false>
    ADMIN> shutd man (abort);
    CREATE USER [백업유저이름] IDENTIFIED BY "[백업유저암호]";
    GRANT CONNECT, RESOURCE, CREATE SESSION TO [백업유저이름];
    GRANT INSERT ANY TABLE TO [백업유저이름];
    GRANT CREATE ANY SYNONYM TO [백업유저이름];
    GRANT CREATE ANY VIEW TO [백업유저이름];
    mv prosync/var prosync_4_4/var
    mv prosync/config prosync_4_4/config
    mv prosync old_prosync
    mv prosync_4_4 prosync
    ############################################
    #
    # ProSync Installation Parameters
    #
    ############################################
    
    # (Mandatory)
    INSTANCE_ID=instance
    PRS_USER=prosync_user
    PRS_PWD=prosync_user_password
    
    # (Optional)
    #PRS_TS_NAME=
    #PRS_TS_FILE=
    #PRS_TS_SIZE=
    #PRS_SKIP_USER_CREATE=N
    #PRS_TARGET_MIN_PRIVILEGE=N
    #PRS_LOG_DIR=
    #LOG_BACKUP_DIR=
    #CREATE_DSN_FILE=N
    #DSN_DIR=
    #DSN_FILE=#need DSN_DIR
    
    ############################################
    #
    # ProSync Processes Informations for Instance Map
    #
    ############################################
    ### (Optional)
    AGENT_LIST_DELIMITER=,
    
    ### (Mandatory)
    # Ext process
    ## Ext cnt must be the same as SRC_DB_CNT
    EXT_CNT=1
    EXT_AGENT_ID_LIST_0=agent1
    #EXT_AGENT_ID_LIST_1=agent1,agent2
    
    # Apply process
    APPLY_PORT=7620
    APPLY_AGENT_ID_LIST=agent1
    
    # Llob process
    LLOB_PORT=7630
    LLOB_AGENT_ID_LIST=agent1
    
    ...
    export PREVIOUS_PRS_HOME=[old_prosync의 절대경로]
    $PRS_HOME/install/prs_backup.sh \
      -c prs_install.cfg \
      -u [백업유저이름] \
      -p [백업유저암호]
    GRANT SELECT ANY DICTIONARY TO $PRS_USER;
    GRANT DELETE ANY TABLE TO $PRS_USER;
    GRANT LOCK ANY TABLE TO $PRS_USER;
    GRANT CREATE ANY TABLE TO $PRS_USER;
    GRANT CREATE ANY SEQUENCE TO $PRS_USER;
    GRANT CREATE ANY INDEX TO $PRS_USER;
    GRANT CREATE ANY TRIGGER TO $PRS_USER;
    GRANT CREATE ANY SYNONYM TO $PRS_USER;
    GRANT CREATE ANY VIEW TO $PRS_USER;
    GRANT CREATE ANY PROCEDURE TO $PRS_USER;
    GRANT SELECT ANY DICTIONARY TO $PRS_USER;
    GRANT ALTER ANY TABLE TO $PRS_USER;
    GRANT ALTER ANY INDEX TO $PRS_USER;
    GRANT ALTER ANY TRIGGER TO $PRS_USER;
    GRANT ALTER ANY SEQUENCE TO $PRS_USER;
    GRANT ALTER ANY PROCEDURE TO $PRS_USER;
    GRANT DROP ANY TABLE TO $PRS_USER;
    GRANT DROP ANY INDEX TO $PRS_USER;
    GRANT DROP ANY TRIGGER TO $PRS_USER;
    GRANT DROP ANY SEQUENCE TO $PRS_USER;
    GRANT DROP ANY VIEW TO $PRS_USER;
    GRANT DROP ANY PROCEDURE TO $PRS_USER;
    GRANT DROP ANY SYNONYM TO $PRS_USER;
    GRANT COMMENT ANY TABLE TO $PRS_USER;
    
    -- target db oracle인 경우
    GRANT SELECT ON SYS.OBJ$ TO $PRS_USER;
    GRANT SELECT ON SYS.USER$ TO $PRS_USER;
    GRANT SELECT ON SYS.COL$ TO $PRS_USER;
    GRANT SELECT ON SYS.SEQ$ TO $PRS_USER;
    cp $PRS_HOME/install/templates/prs_obj_group1.list.template \
      $PRS_HOME/install/prs_obj_group1.list
    $PRS_HOME/install/prs_meta.sh -c prs_install.cfg
    MGR=(ID=lmgr)(HOST=localhost)(PORT=7600)
    
    Prosync=(
        EXT1=(MGR=lmgr)(HOST=localhost)(PORT=7610)(PROGRAM=prs_ext)
        APPLY1=(MGR=lmgr)(HOST=localhost)(PORT=7620)(PROGRAM=prs_apply)
        LLOB=(MGR=lmgr)(HOST=localhost)(PORT=7630)(PROGRAM=prs_llob)
        VF=(MGR=lmgr)(HOST=localhost)(PORT=7640)(PROGRAM=prs_vf)
    )
    AGENT=(ID=agent1)(HOST=172.19.0.11)(PORT=7600)
    
    Prosync=(
        EXT1=(AGENT=agent1)(PROGRAM=prs_ext)
        APPLY1=(AGENT=agent1)(PORT=7620)(PROGRAM=prs_apply)
        LLOB=(AGENT=agent1)(PORT=7630)(PROGRAM=prs_llob)
    )
    
    
    ADMIN> start age(nt) {AGENT_ID}
    ADMIN> start {INSTANCE_ID}
    rm -rf prosync;
    mv old_prosync prosync
    $PRS_HOME/install/prs_install.sh -c prs_install.cfg
    TRUNCATE TABLE $PRS_USER.PRS_TXINFO;
    TRUNCATE TABLE $PRS_USER.PRS_OBJ_LIST;
    TRUNCATE TABLE $PRS_USER.PRS_DDL_HIST;
    TRUNCATE TABLE $PRS_USER.PRS_DD_CON;
    TRUNCATE TABLE $PRS_USER.PRS_DD_ENC;
    TRUNCATE TABLE $PRS_USER.PRS_DUMMY_TBL;
    TRUNCATE TABLE $PRS_USER.PRS_LOGMNR_INFO;
    TRUNCATE TABLE $PRS_USER.PRS_IMPORTED_ARCHIVE_LOG;
    TRUNCATE TABLE $PRS_USER.PRS_DD_ETL_HIST;
    TRUNCATE TABLE $PRS_USER.PRS_DICT_HIST;
    TRUNCATE TABLE $PRS_USER.PRS_DD_USR;
    TRUNCATE TABLE $PRS_USER.PRS_DD_TBL;
    TRUNCATE TABLE $PRS_USER.PRS_DD_SGMT;
    TRUNCATE TABLE $PRS_USER.PRS_DD_COL;
    TRUNCATE TABLE $PRS_USER.PRS_IPARAM;
    TRUNCATE TABLE $PRS_USER.PRS_CONST_HIST;
    TRUNCATE TABLE $PRS_USER.PRS_LCT;
    TRUNCATE TABLE $PRS_USER.PRS_DUMMY_TBL;
    TRUNCATE TABLE $PRS_USER.PRS_COMMITTED_TX_LIST;
    TRUNCATE TABLE $PRS_USER.PRS_INSTALL_HIST;
    INSERT INTO $PRS_USER.PRS_TXINFO SELECT * FROM prs_backup.PRS_TXINFO;
    INSERT INTO $PRS_USER.PRS_OBJ_LIST SELECT * FROM prs_backup.PRS_OBJ_LIST;
    INSERT INTO $PRS_USER.PRS_DDL_HIST SELECT * FROM prs_backup.PRS_DDL_HIST;
    INSERT INTO $PRS_USER.PRS_DD_CON SELECT * FROM prs_backup.PRS_DD_CON;
    INSERT INTO $PRS_USER.PRS_DD_ENC SELECT * FROM prs_backup.PRS_DD_ENC;
    INSERT INTO $PRS_USER.PRS_LOGMNR_INFO SELECT * FROM prs_backup.PRS_LOGMNR_INFO;
    INSERT INTO $PRS_USER.PRS_IMPORTED_ARCHIVE_LOG SELECT * FROM prs_backup.PRS_IMPORTED_ARCHIVE_LOG;
    INSERT INTO $PRS_USER.PRS_DD_ETL_HIST SELECT * FROM prs_backup.PRS_DD_ETL_HIST;
    INSERT INTO $PRS_USER.PRS_DICT_HIST SELECT * FROM prs_backup.PRS_DICT_HIST;
    INSERT INTO $PRS_USER.PRS_DD_USR SELECT * FROM prs_backup.PRS_DD_USR;
    INSERT INTO $PRS_USER.PRS_DD_TBL SELECT * FROM prs_backup.PRS_DD_TBL;
    INSERT INTO $PRS_USER.PRS_DD_SGMT SELECT * FROM prs_backup.PRS_DD_SGMT;
    INSERT INTO $PRS_USER.PRS_DD_COL SELECT * FROM prs_backup.PRS_DD_COL;
    INSERT INTO $PRS_USER.PRS_IPARAM SELECT * FROM prs_backup.PRS_IPARAM;
    INSERT INTO $PRS_USER.PRS_CONST_HIST SELECT * FROM prs_backup.PRS_CONST_HIST;
    INSERT INTO $PRS_USER.PRS_LCT SELECT * FROM prs_backup.PRS_LCT;
    INSERT INTO $PRS_USER.PRS_COMMITTED_TX_LIST SELECT * FROM prs_backup.PRS_COMMITTED_TX_LIST;
    INSERT INTO $PRS_USER.PRS_INSTALL_HIST SELECT * FROM prs_backup.PRS_INSTALL_HIST;
    ADMIN> start man {AGENT_ID}
    ADMIN> start {INSTANCE_ID}
    Cluster의 경우 Llob 프로세스는 두 위치 중 아무 곳에나 기동되어도 된다.
    그림 1. Single to Single 1
    그림 2. Single to Single 2
    그림 3. Cluster 구성

    운영체제 관련 명령어의 실행

  • ProSync Admin Utility의 파라미터 설정 및 조회

  • 수행한 명령어에 대한 이력 관리

  • CM Failover 기능 사용
    그림 1. Agent Process

    Prosync 설치

    Agent 및 Instance 설치 방법을 단계별로 안내한다.

    Key Features

    Extract 프로세스에서 사용 가능한 기능에 대해 안내한다.

    hashtag

    Archive Log 모드

    ProSync는 Archiving되지 않은 온라인 Redo Log는 추출하지 않고, Archiving이 완료된 Archive Log만을 추출하여 Apply 프로세스로 전달할 수 있다.

    EXTRACT_ARCHIVE_LOG_ONLY=[Y|N]

    파라미터
    설명

    EXTRACT_ARCHIVE_LOG_ONLY

    Archive Log만을 추출할지 여부를 설정한다.

    circle-exclamation

    주의

    위 기능을 사용하는 경우, Archive Log만을 추출하게 되어 실시간 성능 저하 가능성이 있으므로 사용에 유의한다.

    hashtag

    Mapping

    본 장에서는 Map 파라미터를 통해 설정할 수 있는 Resolution Rule (DCR)과 Schema Mapping을 위한 DDL 설정에 대해 알아본다. Mapping은 기본적으로 테이블명, 컬럼명에 대한 Mapping을 지원한다.

    Flow Control

    ProSync의 Flow Control을 위해 사용되는 기능들을 정리한 문서이다. 데이터가 동기화되는 일련의 과정이 안정적으로 운영되기 위해선 데이터 처리 속도가 관건이다.

    처리가 너무 느리다면 동기화 로직 상 데이터는 계속해서 쌓이게 된다. 쌓인 데이터를 계속해서 메모리에 적재하면 당연히 문제가 발생하기 때문에 임계값을 통해 데이터를 파일로 저장하거나 일시적으로 지연시키는 동작이 수행된다.

    또한 처리 속도를 올리기 위해서 사용되는 기능들도 존재한다. 처리 속도가 빠르면 그만큼 추출한 데이터가 실시간성이 높게 반영이 된다는 의미이므로, 이 부분을 고려하여 환경 설정을 하는 것이 좋다.

    마지막으로 에러가 발생했을 때, 정합성을 위해 기본적으로 동기화가 멈추게 되어있는데, 이렇게 되면 데이터가 더이상 처리될 수 없어서 영구적인 지연이 발생할 수 있다. 따라서 에러가 발생했을 때, 이를 자동으로 생략하거나 Rule에 맞춰서 데이터를 처리하는 방법에 대해서도 알아본다.

    hashtag

    Performance

    ProSync는 Apply 프로세스 지연 시 모든 곳에 지연이 발생하게 된다. 이 때문에 성능을 올릴 수 있는 수단들이 존재한다. 본 장에선 Performance 측면에서 설정할 수 있는 Configuration들에 대해 알아본다.

    Conflict

    데이터 충돌 발생 시, 처리방안에 대해 확인한다.

    History

    ProSync에는 DML 이력을 확인할 수 있는 다양한 기능들이 있다. config파일에서 로그 레벨을 5레벨로 높이면, 반영하고 있는 SQL과 Bind할 Value들이 byte array 형태로 남게 된다. 다만 로그 레벨을 반드시 높여야 한다는 점과, bind value들이 별도로 남으므로 실제 SQL로 바로 처리할 수 없다는 단점이 있다.

    본 장에서는 위와 같은 상황에서 확인할 수 있는 SAM(Sequential Access Method) 파일 기능과 DML 에러 발생 시의 report 파일, DML 이력 확인 기능 등에 대하여 기술한다.

    Key Features

    Llob 프로세스에서 사용 가능한 기능에 대해 설명한다. 주로 사용하는 파라미터로서 Multi Thread용 파라미터 내용을 안내한다.

    Multi thread

    성능 향상을 위해, Apply 프로세스의 요청에 따라 Source DB에서 데이터 조회를 수행할 Read Thread 의 개수를 설정할 수 있다.

    LLOB_THREAD_CNT=[1-4]

    파라미터
    설명

    LLOB_THREAD_CNT

    기동 시 생성할 Read Thread 의 개수를 설정한다

    hashtag

    Llob

    Llob 프로세스는 Apply 프로세스의 요청에 따라 read Thread 에서 해당 시점(TSN 또는 SCN)의 llob 데이터에 대한 select 쿼리를 수행하기 때문에, 해당 시점에 대한 정보가 없는 경우(flashback 쿼리 실패) 현재 시점을 기준으로 조회하며 이때, 현재 시점에 해당 row가 존재하지 않는다면 조회를 실패할 수 있다.

    hashtag
    성능

    Apply 프로세스에서 최대 20개의 Replay Thread 를 사용하여 동기화를 수행할 수 있고, 모든 Thread 에서 llob 데이터가 존재하는 테이블을 동기화 한다면 Llob 프로세스에서 모든 요청을 처리하는데 지연이 발생할 수 있다.

    이때, LLOB_THREAD_CNT파라미터를 사용하여 Apply 프로세스의 요청을 분배해 성능을 개선할 수 있다.

    hashtag


    hashtag
    장애

    추출한 시점의 TSN(SCN)으로 flashback 쿼리를 수행할 수 없으면서 현재 해당 row가 존재하지 않는다면 llob 데이터 조회가 실패하고 Prosync는 해당 row 동기화를 계속해서 재시도한다.

    hashtag

    데이터 암호화

    ProSync는 Extract 프로세스에서 Apply 프로세스로 데이터를 전송할 때 보안을 위한 데이터 암호화를 사용할 수 있다.

    AES-256-CBC 암호화를 사용하며 Redo(Archive)log 에서 추출한 변경 데이터에 대한 암호화만을 제공한다.

    hashtag
    사용

    ENABLE_NETWORK_ENCRYPT=[Y|N]

    파라미터
    설명

    해당 파라미터를 Y로 설정하는 경우 데이터 암호화 및 복호화 과정이 추가되므로 동기화 성능에 영향을 미칠 수 있다.

    hashtag

    Memory 요구사항

    Memory 사용량은 ProSync 사용에 있어서 가장 민감한 부분 중 하나이다. 에서 보았듯이 데이터를 추출하는 쪽에선 크게 데이터를 저장할 일이 없지만 데이터를 받는 쪽에선 트랜잭션 단위로 데이터가 모여야 데이터를 peer쪽에 반영할 수 있기 때문에, 이 데이터들을 모아놓는 데에 있어서 많은 양의 메모리가 사용된다.

    본 장에선 대표적으로 메모리가 사용될만한 부분을 Sender (Extract / Llob ) 와 Receiver(Apply) 로 나누어서 설명한다.

    hashtag
    Sender(Extract, Llob) 측의 메모리 사용

    Extract 프로세스는 Non-Blocking I/O로 데이터를 전송한다. 대기 없이 데이터를 전송하려면 반드시 수신측에서 빠르게 데이터를 처리 해줘야 한다. TCP 의 수신버퍼에 데이터가 비워지지 않으면 Sender쪽은 Blocking이던 Non-Blocking이던 데이터를 처리하지 못한다. 이 경우 보내지 못한 데이터는 Queue에 쌓이게 되는데, 이 때 메모리 사용량이 늘어나게 된다.

    PostgreSQL 제약사항

    ProSync가 지원하는 데이터베이스 중 PostgreSQL 관련 제약사항을 설명한다.

    hashtag
    postgres 언어 설정 필요

    영어 또는 한국어로 설정한다.

    hashtag

    Admin 인터페이스 설명

    ProSync Admin Utility 인터페이스에 대해 소개한다.

    ProSync Admin Utility는 다음과 같은 특성을 가진 인터페이스로 실행한다.

    • ProSync Admin Utility가 정상적으로 실행되면 위와같은Admin 프롬프트가 출력된다. 프롬프트에서 ProSync Admin Utility 명령어를 입력할 수 있다.

    • 대소문자를 구분하지 않는다.

    circle-info

    Extract Process

    hashtag
    Process 설명

    Extract 프로세스는 Source DB의 변경 로그를 추출하여 Apply 프로세스로 전달하는 동작을 수행한다.

    Source DB가 Tibero 또는 Oracle인 경우, redo log를 읽어 변경 로그를 추출하므로 반드시 redo log에 접근 가능한 위치(일반적으로 Source DB가 존재하는 장비)에서 기동 되어야 한다.

    변경의 최소 단위는 LCR로, 레코드 단위의 변경을 의미하며 네트워크 부하를 고려하여 여러 LCR을 Chunk로 만들어 Apply 프로세스에 전달한다.

    Batch Execution

    Batch Execution은 RDBMS 상에서 우리가 사용하는 Batch 관련 API라고 이해하는 것이 용이하다. DML 각각을 모두 쿼리 형태로 변환하여 전달하기보단, 같은 형태의 쿼리라면 데이터를 Batch단위로 모아서 서버에서 사용하도록 하는 기능이다.

    이 기능을 사용하면 Insert 와 같은 DML이 연속해서 들어올 때, Target Database 의 성능을 향상 시킬 수 있다. 이를 통해 데이터 처리 속도를 증가 시키고 동기화 속도를 끌어 올려줄 수 있다.

    하지만 제약사항도 존재하는 기능으로, 아래와 같은 두가지 관점에서 고려할 수 있다.

    • 같은 형태의 쿼리

    • Batch로 모았을 때의 한계

    Where Clause

    Redo Log는 물리적인 위치에 대한 변경분이 남는다. RDBMS (주로 Oracle, Tibero) 에서는 row 데이터가 ROW_ID 라는 고유의 값을 가지게 되는데, 이 ID에는 데이터 파일의 위치, 파일 내 데이터 블록의 위치, 블록 내 row의 위치 에 대한 정보가 저장되어있다.

    ProSync는 이 물리적으로 정해진 ROW_ID만 가지고는 Target Database에서 정확하게 어떤 row인지 판별할 수가 없다. 왜냐하면 데이터 파일도 다를 것이고, 블록 위치나 row 위치 정보도 모두 다르기 때문에 ROW_ID로는 서로 다른 Database의 row를 매칭 시키기가 어렵다.

    따라서 SUPPLEMENTAL_LOGGING옵션 등을 통해 row 데이터의 추가적인 정보를 Redo Log상에 함께 남기게 된다. 예를 들면, 사용자가 Where Clause에 1개의 Column정보만 넣었다고 하더라도, Redo Log에는 해당 Row 내에 있는 모든 Column 정보가 다 남도록 해준다.

    Target Database와 Apply 프로세스는 이 정보를 가지고 쿼리를 재구축한다. 다만 이렇게 되면, Primary key 를 가지고 있는 테이블 입장에선 불필요한 다른 컬럼 정보들을 Where Clause에 입력해주는 경우가 생긴다. Database의 플랜 별로 최적화되어 잘 처리될 수도 있지만, 불필요한 상황 자체를 방어하기 위해 ProSync에선 Primary key만 사용할지에 대한 여부를 파라미터로 관리한다.

    Data Conflict Rule (DCR)

    MAP Rule에서 소개한 Data Conflict Rule의 시나리오들을 정리한다. 옵션을 설정하는 방법은 해당 문서를 참고한다.

    hashtag
    DCR의 제약사항

    Data Conflict를 확인하려면 Row를 특정할 수 있어야 한다. ProSync에서는 이에 대한 기준을 Primary key로 두고 있다. Primary key 로 인해 충돌이 발생할 경우, Source Database, Target Database, Column Min(Max) 기준으로 데이터 Conflict에 대한 처리를 결정한다.

    circle-info

    Prosync는 where절에 lob column은 확인하지 않으므로, 비교 시 해당 column의 데이터가 다르더라도 다른 column 값이 동일하다면 성공적으로 dml을 수행한다.

    데이터 압축

    ProSync는 Extract 프로세스에서 Apply 프로세스로 데이터를 전송할 때 네트워크 부하 감소를 위한 데이터 압축을 사용할 수 있다.

    ENABLE_NETWORK_COMPRESS=[Y|N] NETWORK_COMPRESS_LEVEL=compress_level

    파라미터
    설명
    libpq 라이브러리 설정 필요

    libpq 라이브러리 관련 패치들이 모두 반영되지 않아 수동 빌드 또는 최신 libpq 라이브러리를 사용하며 SCRAM‑SHA‑256 인증을 사용하지 않도록 postgresql.conf의 password_encryption 설정을 md5 로 변경 후 프로싱크 재설치 중 하나를 적용하여 우회해야 한다.

    hashtag
    numeric 타입 길이 제약

    길이 65532 이상 numeric data의 경우 에러로그 출력 후 skip 처리한다.

    hashtag
    PR 미지원

    설치 시, apply config파일에 REPLAY_THREAD_CNT=1 파라미터가 추가된다.

    hashtag
    양방향 동기화 미지원

    hashtag
    instance명 제한

    영어소문자와 숫자만 사용 가능하다.

    hashtag
    문자열 중간의 null 문자 존재하는 경우 null 이후 문자열 동기화 불가

    postgresql의 제약사항으로 인해 문자열은 null 이후 종료된다.

    hashtag
    명시적인 object명 설정 필요

    PostgreSQL의 object는 기본적으로 소문자로 생성되기 때문에, MAP 파라미터 사용 또는 "TABLE_NAME" 과 같이 "를 사용하여 명시적으로 대문자 테이블 생성이 필요하다.

    hashtag
    BYTEA 컬럼 길이 제한

    PostgreSQL의 제한(한 row의 최대 크기는 1GB)과 프로싱크 동기화 방식의 제약사항으로 인해 BYTEA 컬럼에 대해서는 500MB - 2 바이트(postgresql에서 붙이는 접두사 \x)까지 동기화 가능하다.

    hashtag
    EXCLUDE_USER 파라미터 미지원

    hashtag

    hashtag
    같은 형태의 쿼리

    ProSync는 한 트랜잭션에서 DML이 연속해서 들어올 때 이 순서를 임의대로 바꾸지 않는다. 입력되는 모든 쿼리를 순서대로 적용해야 정합성이 깨지지 않는다는 대전제 때문에 이와 같이 처리가 된다.

    문제는 이렇게 되면 Insert * 3, Update*3, Delete* 3의 순서로 데이터가 들어올 때와 (Insert, Update, Delete) * 3의 순서로 데이터가 들어올 때 Batch Execution 입장에서 큰 차이가 발생한다.

    유사한 쿼리가 연속해서 들어온다면 ProSync는 이를 Batch로 묶어서 처리를 할 수가 있지만, 쿼리들의 형태가 연속적이지 않게 들어온다면 Batch로 처리할 수가 없다. 따라서 두 트랜잭션의 결과가 동일하더라도 하나는 Batch 처리가 가능하고 다른 하나는 Batch 처리가 불가능하다.

    hashtag
    Batch로 모았을 때의 한계

    트랜잭션 내에 같은 형태의 쿼리들이 연속해서 들어온다고 가정을 하여도 성능 향상이 미비한 경우도 존재한다. 예를 들어 Insert의 경우 Batch 동작을 통해 데이터의 개수나 크기 등을 Target Database에 미리 알려준다면 Database는 이에 맞는 플랜을 세워서 최적화 하여 처리가 가능하다. 하지만 Delete나 Update 처럼 각 row 별로 Where Clause에 의해 따로 탐색을 해야 하는 형태로 들어온다면 아무리 모아 보내도 서버 입장에선 하나씩 처리하나, 모아서 들어온걸 하나씩 처리하나 큰 차이가 없다고 볼 수 있다.

    따라서 ProSync는 특별한 설정이 없다면 Insert에 대한 Batch만 처리하는 것이 기본 동작이다. 하지만 Database 별로 처리하는 방식이 달라질 수 있기 때문에 Batch 사용 여부는 파라미터로 모두 관리가 된다.

    hashtag
    Parameter 관련

    Parameter 별 제공하는 기능이다.

    • USE_BATCH_MODE 기본 값은 Y 로, Batch는 항상 동작하도록 되어있다.

    • BATCH_MEM_SIZE 기본 값은 10MB로 서버에 보낼 때 최대 10MB의 데이터까지만 쌓고 쿼리에 대한 처리를 요청한다.

    • USE_ONLY_INSERT_BATCH Insert 만 Batch 로 처리할 것 인지에 대한 파라미터로 기본 값은 Y 이다.

    hashtag

    hashtag
    Parameter 관련

    USE_PK_FOR_WHERE 이 파라미터를 사용하면 Primary key가 있는 테이블에 대한 Update나 Delete 시에 Where Clause에는 Primary key만 입력하게된다.

    circle-exclamation

    주의

    Data Conflict Rule(DCR) 관련

    Data Conflict Rule (DCR) 옵션을 사용할 경우 USE_PK_FOR_WHERE 옵션은 무시된다. 동기화의 논리 구조상 Conflict를 찾는 것이 우선이기 때문에 ProSync에선 두 옵션 간에 이와 같은 우선순위를 둔다.

    hashtag

    DCR - MIN/MAX 설정 후 동일한 값으로 dml 수행 시, 비교 로직에서 충돌을 유발하지 않으므로 양측 노드에서 정상 dml을 수행한다.

    hashtag
    시나리오

    hashtag
    Resolve By Source

    hashtag
    1. Insert

    Insert문에서 충돌이 발생한다는 것은, 이미 데이터가 존재한다는 의미이다. 따라서 존재하는 데이터를 모두 Source Database 기준으로 맞춰주어야 한다.

    Insert문을 Update로 변경하여 Conflict 을 해소해준다.

    hashtag
    2. Update

    Update에서의 데이터 충돌은 원하는 Row가 없다는 의미이다.

    Update문을 Insert로 변경하여 Conflict 을 해소해준다.

    hashtag
    3. Delete

    Delete에서의 데이터 충돌 또한 마찬가지로 Row가 없다는 의미가 된다.

    Delete에 대한 추가적인 처리가 없이 넘어가면 된다.

    hashtag
    Resolve By Target

    hashtag
    1. Insert

    Insert문의 충돌은 이미 데이터가 있을 때 발생하는데, Target Database 기준으로 맞춰야 하므로, 별도의 작업 없이 해당 처리를 건너뛴다.

    hashtag
    2. Update

    Row가 없는 상황이 맞다고 판단하기 때문에 별도의 작업 없이 해당 처리를 건너뛴다.

    hashtag
    3. Delete

    Row가 없는 상황이 맞다고 판단하기 때문에 별도의 작업 없이 해당 처리를 건너뛴다.

    hashtag
    Resolve By Min/Max

    위 두 경우에 대한 조합으로 볼 수 있다. 상황에 따라 Source 기준 또는 Target 기준에 맞춰 수행하는 시나리오다. 기준이 되는 것이 Database 단위가 아닌 Column 내 데이터의 대소 비교로 이루어진다는 점이 다르고, 이에 따라 충돌 처리 동작은 위의 Source / Target과 동일하게 작동한다.

    circle-exclamation

    주의

    Data Conflict Rule(DCR) 관련

    Data Conflict Rule(DCR) 옵션을 사용할 경우 USE_PK_FOR_WHERE 옵션은 무시된다. 동기화의 논리 구조상 Conflict를 찾는 것이 우선이기 때문에 ProSync에선 두 옵션 간에 이와 같은 우선순위를 둔다.

    ENABLE_NETWORK_ENCRYPT

    전송하는 Chunk의 암호화 여부를 결정한다

    NETWORK_COMPRESS_LEVEL

    데이터 압축 기능을 사용할 때 데이터 압축률을 설정한다.

    0~9까지 설정 가능하며, 0으로 설정한 경우 압축을 하지 않고 9에 가까워질수록 압축률이 커진다.

    hashtag

    ENABLE_NETWORK_COMPRESS

    전송하는 Chunk의 압축 여부를 결정한다.

    ProSync는 네트워크 지연 상황 발생 시 512MB 이상의 데이터가 Queue에 쌓일 경우 데이터를 보내지 않고 대기하게 된다. 이 크기는 기본값이며 히든 파라미터로 조절은 가능하다. (_MSG_LIST_SIZE_TO_PAUSE) 하지만 지연 상황에서 이 크기 때문에 속도가 달라지는 경우가 거의 없어 히든 파라미터로 처리되고 있고, 사용자는 이 사실만 알고 있으면 메모리 사용량이 올라가는 이유를 쉽게 추측할 수 있다.

    Llob 프로세스의 경우 동작이 살짝 다른데, 데이터를 보내고 받을 때 64k 단위로 데이터를 주고받게 되어있으며, 각 데이터가 Llob 과 Apply 프로세스간 송수신이 완료되어야 다음 데이터를 요청하도록 짜여져 있다. 따라서 Blocking 여부와 상관 없이, Llob 에서 사용하는 최대 Thread 갯수를 따라가고, 이 크기 자체가 미미하다.

    hashtag


    hashtag
    Receiver(Apply) 측의 메모리 사용

    TCP 를 통한 데이터 Receive에서 중요한 부분중의 하나는 Kernel의 Receive Buffer를 빠르게 비워주는 동작이다. 이게 늦어지면 Window Size에 여유가 없어져서 결국 Sender쪽에선 아무 데이터를 보낼 수 없는 상태가 된다. 따라서 ProSync의 Apply Process는 수신을 대기하는 file descriptor(Socket)에 데이터가 감지되면 가장 먼저 데이터를 Memory로 복사하는 동작을 수행한다.

    복사된 데이터들은 자연스럽게 Apply쪽에 쌓이게 된다. 쌓인 데이터는 Apply 프로세스가 사용하는 일련의 파이프 라인에 의존하여 관리된다. 여기서 해당 내용을 자세히 다루진 않고, Apply 와 해당 문서 하단의 Flow Control 에서 더 상세하게 다루도록 한다.

    간단하게 요약하면, 메모리 내에 데이터가 너무 많으면 파일로 내리는 내용이고 파일로 내릴 수 없는 데이터들이 많이 쌓이게 되면 Socket 자체로부터 들어오는 데이터를 읽지 않는다. 이렇게 되면 앞서 설명한 Sender 쪽의 Non-Blocking 동작에 의해 알아서 읽기 동작을 멈추게 된다.

    hashtag

    제품 설계

    CPU 요구사항

    CPU는 64bit 명령어 집합을 사용하는 CPU가 요구된다. 32bit 명령어 집합을 사용하는 CPU 상에서 사용되는 시나리오는 현재 고려되고있지 않다.

    ProSync는 대체로 CPU를 많이 점유하는 프로그램은 아니다. 일련의 데이터 스트림을 전송하고, 이를 쿼리형태로 변환하여 peer쪽의 저장장치에 저장 명령을 내리는 동작을 하기 때문에, 저장하고자 하는 소프트웨어(RDBMS)나 하드웨어의 영향을 많이 받는다.

    ProSync가 CPU를 점유할만한 시나리오는 크게 2가지가 있다.

    • 데이터 송신 부분에서 발생하는 여러 처리과정으로 인한 부하

    • 데이터 수신 부분에서 트랜잭션 병렬처리를 위해 발생하는 병렬 확인 부분

    각각에 대해 설명을 하면 아래와 같다.

    hashtag
    데이터 송신 부분

    ProSync는 TCP 스택에 데이터를 전송하기 전에, 자체 프로토콜을 사용하여 데이터를 직렬화한다. 데이터를 전송하는 측에서는 당연히 자체 프로토콜을 저장할 데이터 버퍼가 필요하고, 이 버퍼에 데이터를 저장한뒤 Non-Blocking으로 데이터를 전송해주어야. 대기 없이 다음 데이터를 처리할 수 있다.

    또한 데이터는 네트워크 환경에 따라서 압축이 될 수도 있고, 암호화가 되어 전송이 될 수도 있다. 이런 경우에 데이터 송신 전에 전처리할 작업들이 많아져서 CPU 점유량이 높아질 수 있다.

    hashtag
    데이터 수신 부분

    송신 부분에서 설명한 것과 마찬가지로, 수신부분에서도 소켓으로부터 데이터를 받은 뒤, 복호화 작업이나 압축된 데이터에 대한 해제과정이 필요하다. 이 부분에서 CPU 점유량을 사용할 수 있다.

    hashtag
    데이터 병렬화 부분

    하지만 CPU가 가장 많이 사용되는 부분은 역직렬화된 트랜잭션 데이터들에 대한 중복 확인 과정이다. CDC 제품 특성상 데이터 정합성을 위해선 Change Data 들에 대한 시간 순서를 엄밀히 지켜주어야 한다. 이 때문에 N명의 사용자가 데이터를 생산했다 하더라도, 별도의 처리 없인 시간 순으로 데이터를 처리하는 1개의 프로세스만이 존재하게되어 많은 성능 손실이 야기된다.

    ProSync는 이에 대한 처리를 위해 Change Data 각각에 대해 서로가 같은 데이터에 접근한지에 대한 확인을 하게된다. 트랜잭션 단위의 ACID만을 유지하면 되기 때문에, 두 트랜잭션 내에 있는 모든 Change Data(=레코드, DML, ...) 들이 서로 다른 데이터에 접근했다면, 병렬로 반영해도 아무런 문제가 없다.

    이에 대한 처리를 위해서 ProSync는 자체 자료구조를 사용하여 이를 검사하게된다. 트랜잭션이 처리하는 데이터량이 많다면 이에 대한 처리도 많아지고, 그만큼 자료구조를 탐색하는 시간도 길어지게 된다. 따라서 이 부분을 탐색하는 비용에서 ProSync는 CPU 사용량이 많아지게 된다.

    hashtag
    파일 I/O 관련

    ProSync는 수많은 로그가 사용된다. 프로그램의 로그를 포함하여, SAM(Sequential Access Method) 파일을 내리는 기능이나 Error가 발생한 DML을 확인하는 기능 등이 대표적이다. 이들은 Blocking I/O로 되어있어서, Disk의 write 동작을 반드시 대기하고 다음 작업을 수행한다. 따라서 로그 레벨이 높거나 작성할 로그 파일이 많아지면 CPU동작이 그만큼 지연될 수 있다.

    뿐 만 아니라 ProSync는 특정 시점마다 이력정보를 저장한다. 대표적인 경우가 RDBMS의 Redo Log Switch (이하 Log Switch) 이다. Log Switch가 발생하면 이력정보와 관련된 데이터를 모두 Disk로 write하게 되는데, 이 때도 마찬가지로 지연이 발생할 수 있다.

    hashtag

    prosync process
    참고

    본 안내서에서는 특별한 경우를 제외하고는 모든 ProSync Admin Utility 명령어를 대문자로 표현한다.

    명령어의 파라미터로 소문자가 사용된 경우는 다른 파라미터로 확장될 수 있는 경우이다.

    다음은 ProSync Admin Utility 실행 화면이다.

    위의 예에서는 ProSync Admin Utility를 실행한 뒤 HELP 명령어를 통해 ProSync Admin Utility가 지원하는 명령어를 확인할 수 있다. 이처럼 ProSync Admin Utility는 텍스트 모드의 화면에서 입력을 받고, 사용자의 요구에 따라 결과를 출력한다.

    hashtag

    Admin>
    $ prs_adm
    ProSync 4 - Admin Utility
    TmaxData Corporation Copyright (c) 2008-. All rights reserved.  
    
    Admin> HELP 
    hashtag

    hashtag
    Threads

    hashtag
    Control Thread

    기동 시 타 Thread 시작, 메시지 수신 및 전송 등의 작업을 수행한다.

    hashtag
    Resource Thread

    프로세스의 CPU/Memory 사용량을 수집한다. ProSync 매니저 사용 시, Agent 프로세스를 통해 수집한 값을 프로싱크 매니저로 전송한다.

    hashtag
    Worker Thread

    동기화 테이블 추가, 동기화 할 테이블 및 컬럼들의 정보인 DD image 조회, DB의 상태 파악을 위한 dummy tx 생성 등 변경 데이터 추출과는 상관없는 메타데이터 조회나 수정과 같은 작업을 수행한다.

    hashtag
    Sam Thread

    추출한 변경을 Text파일로 출력하는 SAM 기능을 수행한다.

    hashtag
    Read Thread

    변경 데이터를 추출하고 이를 Chunk형태로 만든 뒤 Control 스레드를 통해 Apply 프로세스에 전달한다.

    Log Reader 라이브러리를 사용해 redo log에 접근하며 비정상 종료, Apply 프로세스 재연결 등의 장애 상황 발생 시, 마지막으로 읽고 있던 redo를 처음부터 다시 읽기 시작한다.

    추출 시작 지점은 Apply 프로세스에 저장되어있기 때문에, Apply 프로세스와 연결 전까진 추출을 시작하지 않는다.

    hashtag

    그림 1. Extract Process

    Disk 요구사항

    ProSync가 Disk로 저장하는 데이터들은 크게 다음과 같다.

    • Log File

    • TX Hash File

    • Part File

    위 세 파일은 파라미터로 관리되거나 자동으로 ProSync가 삭제하는 동작을 통해서 관리된다.

    본 문서에서는 위 파일들에 대해 간단하게 소개하고 어떤 방식으로 관리되고 있는지 설명한다.

    hashtag
    Log File

    ProSync의 로그 파일은 프로그램 로그나 SAM(Sequential Access Method) 파일, Discard와 같은 에러 발생 시 사용되는 로그 파일들이 있다. 어떤 파일이던 프로싱크 로그는 같은 방식으로 처리가 되고, 이 부분만 기억하면 Disk 사용량을 쉽게 예측할 수 있다.

    ProSync의 로그들은 일정 크기까지 데이터를 쓰고, 임계치를 넘어가면 새 파일에 데이터를 쓰며 기존 데이터는 Backup 위치로 이관시킨다. 이관된 위치에는 데이터가 영구적으로 쌓이게 될 수 있는데, 이를 위해 제공되는 파라미터를 통하여 Backup 위치 내에서 파일 갯수를 동일하게 유지시킬 수 있다.

    이 설정은 모두 파라미터로 관리되고 있으며, 해당 내용을 참고하여 설정하면 좋다.

    circle-info

    참고

    Backup 로그 파일 설정 관련

    로그 모듈의 Backup과 관련된 갯수 설정은 모두 용량과 관련이 있다. 일반적인 로그를 예로 보면, LOG_FILE_SIZE 크기 이상 로그가 쌓이면 LOG_BACKUP_DIR 위치로 로그 파일이 넘어가고, 새 로그 파일을 생성하여 로그를 작성한다.

    이 때, LOG_BACKUP_SIZE크기 이상 만큼의 백업로그들이

    hashtag


    hashtag
    TX Hash File / Part File

    Apply 프로세스에서만 사용되며 상세한 내용은 에서 자세히 설명하며, 본 장에서는 간략히 언급한다.

    TX Hash File은 수신 이후 데이터들이 쌓이는 공간이며, 이력 저장 주기(RDBMS의 Log Switch) 마다 데이터 전체가 Disk에 작성된다. 작성된 데이터는 Log File과 마찬가지로 파라미터를 통해 특정 갯수 혹은 특정 용량까지만 이력을 보관하도록 설정할 수 있다.

    Part File는 Transaction의 크기가 클 때 메모리에서 Disk로 내려가는 파일로, 반영쪽에 데이터가 반영되고 나서야 제거가 될 수 있다. ProSync 동작 특성 상 Part File의 용량이나 갯수를 제한하기가 어렵기 때문에, 사용자가 추출하고자 하는 데이터의 양상에 맞게 Disk를 여유있게 준비해야 한다. 예를 들어 10억건의 DML을 넣는 Transaction이 자주 발생하는 환경이라면, 유사한 크기의 Part File이 생길 수 있음을 인지하고 Disk 관리를 해주어야 한다.

    circle-info

    참고

    Part File 관련

    TX Hash는 크기 제한이 있는 공간이다. Part File이 발생하는 시점은 단순히 한 TX의 크기가 임계치를 넘어갔을 때가 아니라, TX Hash 크기가 부족할 때 가장 크기가 큰 Transaction 데이터부터 Part File로 옮겨주게 된다.

    설명상 두 항목으로 구분하였지만, 실제로는 상호 밀접하게 연관된 구성 요소이다.

    hashtag

    데이터베이스 호환성

    ProSync가 지원하는 데이터베이스 및 항목을 설명한다.

    hashtag
    지원 Database

    hashtag
    Source Database

    • Tibero (Single/TAC/TAS) 6 이상

    • Oracle 11g

    • Oracle 12c

    • Oracle 19c

    • PostgreSQL 15

    • PostgreSQL 16

    hashtag
    Target Database

    • Tibero

    • Oracle 11g

    • Oracle 12c

    • Oracle 19c

    hashtag


    hashtag
    지원 항목

    hashtag
    트랜잭션 단위 동기화

    트랜잭션 단위의 동기화를 지원한다.

    hashtag
    DML 동기화 대상

    테이블에 대한 INSERT, UPDATE, DELETE 작업을 동기화한다.

    hashtag
    DML 동기화 제약사항

    아래 대상은 동기화를 지원하지 않는다.

    • 실체화 뷰(Materialized View)

    • Clustered Table

    • Indexed Organized Table(IOT) (Source DB가 Oracle인 경우)

    • 대상 테이블에 Interval Partitioning이 적용된 경우, DB가 동적으로 생성한 Partition에 포함된 데이터는 동기화되지 않을 수 있다.

    hashtag
    DDL 동기화 대상

    을 참고한다.

    hashtag
    DDL 동기화 범위

    DDL 동기화는 DB 단위로 지원한다.

    hashtag
    지원 컬럼 타입

    지원 컬럼 타입은 사용하는 DB에 따라 다르므로, 을 참고하여 DB별 지원 컬럼 타입 및 매핑 정보를 확인한다.

    hashtag
    지원 동기화 방향

    • Tibero ➔ Tibero

    • Oracle ➔ Tibero

    • Tibero ➔ Oracle

    • Tibero ➔ PostgreSQL

    hashtag

    Apply Process

    Apply 프로세스에 대하여 설명한다.

    hashtag
    Process 설명

    Apply 프로세스는 제품 설계에서도 언급했듯이 Chunk 단위로 레코드를 전달 받고 해당 레코드를 트랜잭션 별로 모아준다. 트랜잭션에 Commit 이 오면 해당 트랜잭션은 실제 반영 단계에 들어가 대상이 되는 데이터베이스로 반영된다.

    본 장에서는, 실제 apply 프로세스의 구조를 상세히 설명한다.

    hashtag


    hashtag
    Threads

    Apply프로세스는 위와 같은 구조를 가지고 있다. 앞서 에서 ProSync 의 기본 Thread 구조를 언급한 바 있는데, Apply 도 마찬가지로 Main 이 되는 Control Thread 가 있고 이외에 Worker Thread 들이 Control Thread 하위 계층에 구성되어 있다.

    동기화에 필요한 Thread 는 Construct Thread 와 Replay Thread 로 크게 두 가지로, 나머지는 모두 Worker Thread 로 구분 된다.

    circle-info

    참고

    Worker Thread 는 종류가 많은 관계로 하단에 간단히 언급한다.

    hashtag
    Control Thread

    Control Thread 는 다른 프로세스와 마찬가지로 모든 통신과 관련된 Multiplexing I/O 를 담당한다. 리눅스에선 epoll 을 사용하며, 플랫폼 별로 k-queue 나 pollset 등 각 운영체제에 알맞은 Mux I/O 기능을 사용하도록 설계되어있다.

    hashtag
    Construct Thread

    Construct Thread 는 Chunk 로 들어오는 레코드 데이터들에 대해 트랜잭션 으로 재조립한다. Construct 라는 말의 의미는 트랜잭션 을 다시 조립(Construct) 하기 때문에 사용된다고 생각하면 된다.

    각 레코드 에는 본인이 속한트랜잭션 을 구분할 수 있는 일종의 key 값이 존재하는데, 이게 트랜잭션 의 ID 일명 (xid) 라고 불린다.

    Construct 는 레코드 의 xid 값을 보고 트랜잭션 별로 재조립한다.

    circle-info

    참고

    Construct의 이력 정보 관리

    Construct는 레코드 별로 어떤 redo 로그 파일에서 나온 건지에 해당하는 로그 시퀀스 정보와 해당 로그 파일의 몇 번째 레코드 에 해당하는 지에 대한 정보(wrap# )를 메모리에 계속 저장하게 된다.

    redo 로그는 주기적으로 로그 스위치 가 일어나고, 이 때마다 로그 시퀀스 값이 1개씩 올라가며 새로운 로그파일에 레코드 를 작성하게 되는데, 이 때마다 메모리에 들고있던 레코드 정보 및 이력 정보(로그 시퀀스 , wrap# ) 가 물리 디스크 및 데이터베이스에 저장된다.

    hashtag
    Replay Thread

    Replay Thread 는 Commit 레코드가 도달하여 Construct 로부터 조립이 완료된 트랜잭션을 전달 받는다. 전달 받은 트랜잭션은 Commit 레코드의 DB Time (Oracle의 SCN / Tibero의 TSN / .. )에 맞게 직렬화되어 반영되거나, 트랜잭션 내 레코드 들의 의존성을 모두 체크하여 병렬로 처리되게 된다.

    병렬로 처리하게될 경우 Replay Thread 의 갯수가 많아지게 되며, 각 쓰레드가 DB의 한 세션을 담당하게 된다. 병렬 처리 가능여부는 Control Thread 에서 실시간으로 판단하며, 병렬 처리가 가능할 때 여러 Replay Thread 에 일감을 부여하게 된다.

    hashtag
    Worker Threads

    hashtag
    Resource Thread

    프로세스의 CPU / Memory 사용량을 실시간으로 수집한다. 수집된 내용은 로그상에 계속해서 남겨주게 되며, 프로싱크 매니저와 연동 중일 경우, Agent 프로세스를 통해 수집한 값을 프로싱크 매니저로 전송한다.

    hashtag
    Stat Thread

    프로세스에서 발생하는 트랜잭션 의 시간당 처리량, 일종의 Throughput 을 계산한다. 프로싱크 매니저와 연동 중일 경우, Agent 프로세스를 통해 수집한 값을 프로싱크 매니저로 전송한다.

    hashtag

    Parallel Execution (Parallel Replay)

    커밋이 요청 트랜잭션은 반영을 할 수 있으면 반영을 하고, 반영을 할 수 없으면 큐에서 대기하게 된다. 반영 가능 여부는 반영하고자 하는 트랜잭션과 반영 중인 트랜잭션 간의 의존성 체크를 통해 서로 독립적일 경우 반영이 가능하다고 판단한다.

    의존성 체크는 Table과 Row 단위 모두 확인을 한다. 트랜잭션은 레코드로 이루어져 있고, 레코드에는 레코드가 접근하는 Row가 정해져 있기 때문에, 해당 데이터를 기반으로 다른 트랜잭션과 의존 관계인지 여부를 판단한다.

    의존성 확인 동작은 Hash Table과 Linked List로 관리가 되고 있다. Table 단위로 Hash Table을 확인하고, Table이 확인되면, 해당 위치에 존재하는 다음 Hash Table에서 Row를 확인한다. 이 위치엔 Linked List가 존재하며, 트랜잭션은 해당 List에 의존성 객체(TX Dependency )를 달아 놓는다.

    이 동작을 통해 트랜잭션이 접근하는 모든 Row에 대한 Linked List에 TX Dependency가 등록이 된다. 반영 중인 트랜잭션이나 반영 대기 중인 트랜잭션 모두 이 구조 안에서 관리된다.

    반영 가능 여부는 트랜잭션의 모든 TX Dependency가 Linked List의 front에 존재하는 지의 여부로 확인한다. 하나라도 front에 존재하지 않는다면 반영이 불가능하고, 앞서 반영 중인 트랜잭션의 완료를 대기하게 된다.

    그림 1. 반영이 가능한 경우

    반영이 가능한 경우는 위 그림과 같이 모든 의존성 체크를 했을 때 Linked List 상에 TX Dependency 가 가장 앞선 경우이다.

    만약 위 그림과 같이 xid: 111인 트랜잭션이 아직 반영이 끝나지 않았다면 대기하게 된다. 반영이 완료된 트랜잭션은 위 Linked list에서 제거가 되고, xid: 112가 반영 가능하게 되면 반영 작업을 진행한다.

    circle-info

    참고

    의존성 판단 기준

    그림을 보면 확인이 가능하듯이, Row 단위의 비교가 가능해야 한다. 오라클과 티베로와 같은 RBMS 에는 ROWID라는 Row별 고유 식별자가 존재한다.

    ROWID를 구성하는 요소는 데이터 파일 번호, 데이터 파일 내 블락 번호, 블락 내 Row데이터 위치로 구성이 되고 이 데이터는 Row의 고유 ID가 된다. ProSync는 기본적으로 이 데이터를 통해 의존성을 확인한다.

    circle-exclamation

    주의

    Hash Table의 사용 여부

    Hash Table은 O(1) 시간 내에 데이터를 탐색할 수 있다는 장점을 가진 자료구조이다. 하지만 Hash함수의 특성 상 모든 데이터들은 정해진 갯수 내의 데이터로 매핑이 되어버린다. 이로 인해 적은 테이블을 동기화 하는 경우나 트랜잭션 내 동기화할 데이터가 많은 경우에 서로 다른 Row임에도 의존성 확인 과정에서 서로 같은 Row로 판단할 확률이 올라간다.

    예를 들면, 위 그림에서 xid: 111

    관련 파라미터는 REPLAY_THREAD_CNT 로, 해당 값이 올라가면 병렬 세션의 수가 많아진다. 하지만 만 위 로직에서 알 수 있듯이 결국 Hash Table 내에서 Table, Row단위로 TX Dependency가 잘 풀려야 병렬 반영이 가능하다. 이로 인해 숫자를 올린다고 반드시 올린 숫자만큼 정비례하게 증가하지 못하는 경우도 발생한다.

    hashtag

    DML Error Report

    APPLY 프로세스가 동기화 진행 중 DML 반영을 실패 또는 장애 상황이 발생했을 때 일정 횟수를 재시도 한 뒤 report 파일로 write하는 기능이다.

    DML에 관해서만 기록이 가능하며, APPLY 프로세스의 config 파일인 [inst_id]_apply1.cfg 파일에 다음의 파라미터를 설정해야 한다.

    파라미터
    설명

    APPLY_TO_REPORT

    Dml Error Report 기능의 사용 여부를 결정한다. (Y|N)

    • Y : report file에 row by row로 DML이 남게 된다. (기본값)

    • N : report file에 row by row로 DML이 남지 않는다.

    APPLY_DML_ERR_REPORT_CNT

    circle-info

    참고

    다음의 타입들에 대해선 이 기능을 제공하지 않는다.

    아래의 타입이 있는 테이블의 경우에는 컬럼의 값이 NULL로 기록된다.

    • NCHAR

    hashtag

    DML History

    APPLY 프로세스에서 DML 반영 시 MAP 파라미터로 지정한 History 테이블에 반영된 history 를 남기는 기능이다.

    해당 기능을 사용하기 위해서는 기존 ProSync 동기화를 진행하는 인스턴스 이외에 DML History 기능 작동을 위한 인스턴스가 추가로 하나 더 필요하다.

    circle-info

    참고

    다음의 타입들에 대해선 이 기능을 제공하지 않는다.

    아래의 타입이 있는 테이블의 경우에는 컬럼의 값이 NULL로 기록된다.

    • LONG

    • BLOB

    • CLOB

    APPLY 프로세스의 config 파일인 [inst_id]_apply1.cfg 파일에 다음의 파라미터를 설정해야 한다.

    Parameter
    설명

    추가적으로 동기화 대상 테이블에 추가적인 column들이 필요하다.

    column
    설명

    hashtag

    Extract

    hashtag
    성능

    Extract 프로세스는 Redo Log 파일을 읽어 변경 데이터를 추출하기 때문에, 디스크 읽기 속도가 성능에 영향을 줄 수 있으며 변경 데이터는 Chunk 형태로 Apply 프로세스에 전송하기 때문에, 네트워크 속도가 영향을 줄 수 있다.

    ProSync 파라미터에 따라 성능이 변화할 수 있다.

    1. 로그 레벨(LOG_LEVEL)이 높다면, disk write가 많아짐에 따라 성능이 저하될 수 있다.

    2. 데이터 압축 기능을 사용한다면, 데이터 압축을 위한 동작이 추가됨에 따라 성능이 저하될 수 있다.

    3. 데이터 암호화 기능을 사용한다면, 데이터 암호화를 위한 동작이 추가됨에 따라 성능이 저하될 수 있다.

    hashtag


    hashtag
    장애

    hashtag
    패키지 수행 실패

    ProSync는 적절한 반영 쿼리 생성을 위해 테이블의 DD image 변경이 발생하는 시점에 Trigger를 통해 내부 패키지를 수행하여 메타 테이블을 업데이트한다.

    메타 테이블 업데이트는 필요한 정보가 있는 시스템 테이블을 조회하여 동기화 할 Object들의 정보를 메타 테이블에 insert하는 방식으로 설치 시점에 PRS_USER에 적절한 권한이 부여되지만, 사용 중인 PRS_USER에게서 필요한 권한을 회수한다면 해당 동작을 수행하지 못해 장애가 발생할 수 있다.

    ProSync가 사용하는 PRS_DDL_HIST에서 오류가 발생했는지 확인할 수 있으며 해당 테이블에 오류가 발생한 경우, PRS_USER의 권한 변경이 있는지 확인이 필요하다.

    hashtag
    권한 없음

    Extract 프로세스는 여러 파일에 대한 읽기 또는 쓰기 권한이 필요하다.

    • 변경 데이터 읽기 위해 Redo Log와 Archive Log들에 대한 읽기 권한이 필요하다.

    • 로그 작성을 위해 LOG_DIR, LOG_BACKUP_DIR 파라미터 경로에 대한 쓰기 권한이 필요하다.

    • 이전 Redo Log에서 commit되지 않은 tx정보를 저장하는 tlr(olr) 파일을 작성하기 위해 $PRS_HOME/var/[instance_name]/lr[node_num] 경로에 대한 읽기/쓰기 권한이 필요하다.

    hashtag
    Log Reader 오류

    Log Reader가 특정 변경 데이터에 대한 처리를 하지 못한다면, 버그 리포트 후 새로운 바이너리로 교체가 필요하다.

    정합성 불일치를 감수하고 동기화를 진행하려면 설치 안내서의 이력조절(링크)을 참고하여 문제되는 Redo Log를 넘기거나 corrupted lcr이 추출된 경우 _LR_SKIP_CORRUPTED_LCR 파라미터를 통해 넘길 수 있다.

    파라미터
    설명

    hashtag

    Bug Report

    ProSync 운영 중 장애 발생 시, 분석을 위해 현상 발생한 프로세스의 5레벨 로그와 config를 첨부해야 하며 장애 유형에 따라 다음 정보를 추가적으로 요청할 수 있다.

    프로세스
    config 파일 위치

    Extract

    $PRS_HOME/config/[INST_ID]_ext[NODE_NUM].cfg

    Apply

    $PRS_HOME/config/[INST_ID]_apply[NODE_NUM].cfg

    hashtag
    타 프로세스 로그

    다른 프로세스에서 전달한 정보에 오류가 의심되는 경우 요청할 수 있다.

    config 파일의 LOG_DIR 경로에 위치한다.

    현상 발생한 프로세스와 동일하게 5레벨 로그(LOG_LEVEL=5)를 첨부해야 한다.

    hashtag
    TLI(OLI) 로그

    Log Reader 오동작이 의심되는 경우 요청할 수 있다. 자세한 분석을 위해, Extract 프로세스의 파라미터를 '''LR_TRACE_LVL=5''' 로 설정한 뒤, 현상 재현을 요청한다.

    $PRS_HOME/var/[INST_ID]/lr[NODE_NUM]/ 경로에 생성되는 til[NODE_NUM].log/oli[NODE_NUM].log 파일을 첨부해야 한다.

    hashtag
    TLR(OLR) 로그

    여러 Redo Log에 Chaining된 TX에 대해, 잘못된 값을 추출한 것으로 의심되는 경우 요청할 수 있다.

    Extract 프로세스를 기동한 장비의 $PRS_HOME/var/[INST_ID]/lr[NODE_NUM]/ 경로에 생성된다.

    hashtag
    Redo Log

    Log Reader에서 잘못된 값을 추출한 것으로 의심되는 경우, 마지막으로 읽은 Redo Log를 요청할 수 있다.

    Extract 프로세스에서 마지막으로 출력한 redo log found 또는 redo/archived log found 로그를 통해 마지막으로 읽은 로그를 알 수 있다.

    hashtag
    Agent 로그

    기동 실패, 파라미터 동적 변경 실패, 동기화 테이블 추가 실패 등 Agent 프로세스에서 요청을 보내는 기능이 실패하는 경우, 실패한 지점을 분석하기 위해 5레벨 Agent 로그를 요청할 수 있다.

    config 파일의 LOG_DIR 경로에 위치한다.

    hashtag
    Tx Hash

    Apply 프로세스에서 메모리 관리를 위해 파일로 내린 TX 데이터의 손상이 의심되는 경우 요청할 수 있다.

    Apply 프로세스를 기동한 장비의 $PRS_HOME/var/[INST_ID]/tx 경로에 생성되며 config파일에 TX_HASH_FILE_DIR 파라미터 설정 시, 해당 경로에 생성된다.

    hashtag

    환경설정

    ProSync Admin Utility의 환경을 설정하는 방법과 시스템 변수에 대해 안내한다.

    hashtag
    시스템 변수

    시스템 변수는 를 통해 변경할 수 있다.

    hashtag
    HISTORY

    User Filtering

    ProSync는 특정 사용자에 의해서 발생된 DML 및 DDL을 동기화에서 제외할 수 있는 기능을 제공한다.

    hashtag
    양방향 동기화

    같은 테이블에 대해 Source DB에서 Target DB로, Target DB에서 Source DB로 동기화 하도록 2개의 Prosync 인스턴스를 사용하여 구성할 수 있다. 이 경우, 별 다른 설정이 없다면 상대방의 PRS_USER가 반영한 동기화 데이터가 다시 추출되어 Source DB로 전송될 수 있다.

    NVARCHAR

  • LONG

  • BLOB

  • CLOB

  • Dml Error Report 기능에 의해서 report file write가 시작되기 전 재시도 횟수를 설정하는 파라미터이다. (기본값: 20)

    APPLY_REPORT_DIR

    report 파일이 남겨질 디렉터리를 설정한다. (기본값: [prosync_directory]/var/[inst_id]/dml_err)

    APPLY_REPORT_FILE_SIZE

    각 프로세스 별 DML error report 파일의 최대 크기를 설정한다. report 파일의 크기가 APPLY_REPORT_FILE_SIZE를 넘으면 APPLY_REPORT_BACKUP_DIR로 옮긴 후 새로운 report 파일을 생성한다. (기본값: 100MB, 범위: 1MB ~ 1GB)

    APPLY_REPORT_BACKUP_DIR

    DML error report 파일의 백업 파일이 저장되는 디렉터리 위치를 설정한다.

    APPLY_REPORT_BACKUP_SIZE

    APPLY_REPORT_BACKUP_DIR 백업되는 report 파일들의 최대 크기를 설정한다. 각 프로세스 별로 백업된 총 report 파일의 크기가 APPLY_REPORT_BACKUP_SIZE를 넘으면 가장 오래된 파일부터 순차적으로 삭제한다. (기본값: 0, 범위: 0 ~ 128GB)

    _LR_SKIP_CORRUPTED_LCR

    Log Reader에서 corrupted lcr이 추출되어도 추출을 정지하지 않도록 설정한다.

    Llob

    $PRS_HOME/config/[INST_ID]_llob.cfg

    Agent

    $PRS_HOME/config/prs_agent_[AGENT_ID].cfg

    LOG_BACKUP_DIR
    상에 쌓이게 되면, 가장 오래된 로그를 지워 크기를 유지 시키도록 되어있다.

    이를 통해 사용자는 로그 파일 갯수를 유지 시키는게 가능하다.

    Flow Control

    PostgreSQL 15

  • PostgreSQL 16

  • NOLOGGING 옵션이 설정된 테이블에 대한 DML 작업은 동기화하지 않는다.

  • PostgreSQL ➔ Tibero

    DDL Rule
    동기화 대상 테이블 생성 및 등록

    Key Features

    본 장에선 Apply 프로세스의 주요 기능들을 설명한다. Apply 프로세스 운영을 위한 핵심적인 요소들로서 원활한 운영에 도움이 될 수 있다.

    RECORD_HISTORY

    해당 인스턴스에서 DML history 기능을 사용 할 지에 대한 여부를 결정한다. (Y|N)

    • Y : MAP RULE 로 지정된 history 테이블에 row by row로 DML이 남게 된다.

    • N : MAP RULE 로 지정된 history 테이블에 row by row로 DML이 남지 않는다. (기본값)

    해당 파라미터를 Y 로 설정할 경우, MAP 파라미터를 history 를 남길 테이블로 설정해 주어야 하며, DDL 파라미터의 경우 exclude all 로 설정해 주어야 한다.

    LEADING_PRS_USER

    DML history 기능에 의해서 history를 기록할 선행되는 PRS_USER를 설정하는 파라미터이다.

    선행되는 인스턴스에 동기화가 이루어져야 DML history가 남게 된다. 3초씩 10번 총 30초 동안 바라보며, 그 안에 동기화가 이루어지지 않을 경우 history는 남지 않는다.

    OLD_{컬럼 명}

    해당 column의 경우 UPDATE, DELETE 같은 column의 값이 변경 될 때의 값이 남게 된다. 따라서 기존 컬럼과 똑같은 타입으로 설정해 주어야 한다.

    HIST_NO

    NUMBER 이며, 순차 채번을 위한 column이다. Target DB SYS User 에 SQ_{HISTORY_TABLE} 의 이름을 가진 sequence의 생성이 필요하다. 이 때 Sequence table 은 MIN 1 MAX 99999999 을 가지며, cycle 로 순환되어야 한다.

    IUD_FLAG

    VARCHAR(6) 이며, History 가 남을 DML 의 유형을 뜻하는 column이다. INSERT / UPDATE / DELETE가 남는다.

    IUD_TIME

    TIMESTAMP 이며, DML 이 수행 되어 history 가 남은 시간을 뜻한다.

    명령어 히스토리의 크기를 설정한다.
    항목
    설명

    n

    명령어 히스토리의 크기이다. (기본값: 50)

    hashtag
    LINESIZE

    화면상의 한 라인의 길이를 설정한다. 라인 길이의 최소값은 1이며, 최댓값은 운영체제에 따라 다르다.

    항목
    설명

    n

    화면상의 한 라인의 길이이다. (기본값: 80)

    hashtag
    NUMWIDTH

    NUMBER 타입을 출력할 길이를 설정한다. LINESIZE를 넘을 수 없다.

    항목
    설명

    n

    NUMBER 타입 데이터의 기본 출력 길이이다. (기본값: 10)

    hashtag
    PAGESIZE

    한 화면에 출력할 라인 수를 설정한다.

    항목
    설명

    n

    한 페이지의 라인 개수이다. (기본값: 24)

    hashtag
    PROMPT

    화면상의 프롬프트 문자를 설정한다.

    항목
    설명

    prompt_string

    프롬프트로 사용할 문자열이다. (기본값: "Admin>")

    이 문자열을 중괄호({ })로 감싸면 환경변수로 인식된다.

    예를 들어 '{PRS_PROMPT}'이라고 지정하면 환경변수 $PRS_PROMPT의 값이 치환되어 프롬프트로 사용된다. 이때 환경변수의 이름은 대소문자를 구분한다.

    hashtag
    SUFFIX

    파일 확장자를 생략했을 때 사용할 파일 확장자를 설정한다.

    항목
    설명

    extension

    기본으로 사용할 파일 확장자이다. (기본값: sql)

    hashtag

    SET 명령어
    SET HIS[TORY] {n}
    SET LINE[SIZE] {n}
    SET NUM[WIDTH] {n}
    SET PAGE[SIZE] {n}
    SET PROM[PT] {prompt_string}
    SET SUF[FIX] {extension}
    또한 Primary key, Foreign key 관계에 있는 두 Row데이터의 경우 시간 순서를 반드시 맞춰주어야 한다. 따라서 이 경우도 위 Row에 대한 Hash Table과는 별개의 Hash Table로써 관리가 된다.
    과
    xid: 112
    가
    Table1
    의
    Row1
    에 접근한다고 판단하여 같은 의존성 관계에 있다고 생각하지만, 사실 이는 Hash 함수의 결과로써 실제로는 Row에 접근할 수 있다.

    Hash Bucket 수가 많아져서 Mapping할 수 있는 영역을 넓힌다 하여도, 많은 수의 Row를 건드리는 두 트랜잭션간에는 서로 충돌확률이 기하급수적으로 늘어난다.

    Birthday paradox와 유사한 이유 때문인데, 약 1,000,000 개의 Hash Bucket을 가진 Table에 10,000개의 Row데이터를 가지는 서로 다른 두 트랜잭션이 있으면, 이들이 서로 겹치지 않을 확률은 P(no collision)=(Nn)⋅(N−nn)(Nn)2P(\text{no collision}) = \frac{\dbinom{N}{n} \cdot \dbinom{N - n}{n}}{\dbinom{N}{n}^2} P(no collision)=(nN​)2(nN​)⋅(nN−n​)​ 로 계산이 가능하고 근사치로 계산했을 때 약 3×10−443 \times 10^{-44} 3×10−44 이 나와서 사실상 겹치지 않는 것이 불가능 하다고 생각하면 된다.

    이로 인해 차기 버전부터는 RedBlack Tree로의 변경이 이루어진다. 현재 버전까지는 병렬화 과정의 한계로 위와 같은 구조를 그대로 사용한다.

    그림 2. 반영이 불가능한 경우
    Redo Log에는, tx에 대해 이를 수행 한 User를 알 수 있는 정보가 있으며 ProSync는 이 정보를 활용해 상대방의 PRS_USER로 EXCLUDE_USER 파라미터를 설정하여 이미 반영한 데이터를 재반영하는 현상을 막을 수 있다.

    hashtag
    사용

    다음은 TEST 사용자와 PRS_USER 사용자를 동기화에서 제외하는 예제이다.

    EXCLUDE_USER=PRS_USER.TEST

    파라미터
    설명

    EXCLUDE_USER

    동기화에서 제외할 사용자 이름을 등록한다

    circle-info

    참고

    양방향 과 Oracle 관련 제약사항

    ProSync 4.4.x 버전의 Oracle 이 포함된 양방향 동기화에선 ROLLBACK_OBJECT_IDS 파라미터를 설정해야한다.

    Redo상에 남는 세션 정보를 통해 필터링 하는 기존 방식과 다르게, ProSync가 동기화한 트랜잭션을 Object id(Segment id)로 감지하고 이를 통해 트랜잭션 자체를 롤백하는 기능이다.

    ProSync의 Apply프로세스는 PRS_COMMITTED_TX_LIST 테이블을 조작하게 되어있으며, 이에 대한 Object id, Segment id를 위 파라미터에 모두 작성해주면 된다. 다음은 조회 쿼리 예시이다. (Tibero의 경우 추출 시 Supplemental Log로 Object id가 남으므로 Segment를 조회하거나 추가할 필요는 없다.)

    • Target Oracle Object ID 조회

    • Target Oracle SGMT ID 조회

    • Target Tibero Object ID 조회

    hashtag

    그림 1. Apply Process Architecture
    그림 2. Construct의 트랜잭션 Hash
    그림 3. Replay로 넘어간 트랜잭션
    Inter Processes/Threads Communication

    제품 설계

    Prosync 제품 이해를 위한 기본적인 설계 자료를 안내한다.

    hashtag
    ProSync Architecture

    그림 1. ProSync Architecture

    ProSync는 위와 같은 설계를 가지고있다. 전체 설계에 대한 간단한 요약을 하면 아래와 같다.

    Extract 프로세스는 SRC DB 에 해당하는 추출 데이터베이스( SRC DB ) 에서 Redo Log 를 추출한다. 추출은 각 DB 별 Log Reader Library 를 통해 진행하며, 필요한 경우, 각 DB 별로 제공하는 별도의 로그 분석 기능을 통해 추출을 진행하기도 한다. 추출된 데이터는 Apply 프로세스로 전달된다.

    데이터는 보통 레코드 단위 (쉽게 말해 DML 단위)로 남게되며, 해당 데이터는 Apply 프로세스에서 트랜잭션 별로 취합해 반영해주어야 한다. 따라서 Apply 프로세스는 레코드 들을 전달받아 트랜잭션 별로 모아둔다. commit에 해당하는 레코드 가 오게되면, 트랜잭션을 반영시킨다.

    hashtag


    hashtag
    Data Flow

    ProSync의 Data Flow를 기준으로 살펴보면 조금 더 상세한 과정을 볼 수 있다.

    Extract 프로세스는 레코드 를 chunk 단위로 모아 Apply 프로세스로 전달한다. 전달받은 Apply 프로세스는 각 레코드 들을 트랜잭션 단위로 모아준다. commit 레코드가 올 경우 반영 데이터베이스(TAR DB) 로 반영하게 된다.

    circle-info

    참고

    더욱 상세한 내용은를 참고한다.

    hashtag


    hashtag
    Inter Processes/Threads Communication

    ProSync는 프로세스간 통신은 TCP 통신을 사용하고, 쓰레드간 통신은 Pipe 를 사용하여 통신한다.

    어떤 종류의 프로세스건, Main 쓰레드는 반드시 존재하고 (ProSync에선 CTH 혹은 Control Thread 라고 부른다.) 해당 쓰레드가 다른 쓰레드와의 통신을 모두 담당한다. 즉, A라는 쓰레드에서 B라는 쓰레드와 직접 통신하는건 불가능하고, 반드시 Main 쓰레드를 거쳐서 통신을 하게 되어있다.

    또한 프로세스간 통신에선 TCP 로만 통신을 진행하게되며, 이에 대한 소켓의 connect 와 accept 는 모두 각 프로세스의 Main 쓰레드가 담당한다.

    hashtag


    hashtag
    ProSync Processes

    전체 프로세스들의 기능과 구조를 간단하게 설명한다.

    circle-info

    참고

    각 프로세스에 대한 내용은 를 참고한다.

    Data Flow 를 기준으로 설명했던 프로세스는 주로 Extract 프로세스와 Apply 프로세스이다. 이 두 프로세스가 ProSync의 핵심 프로세스이나, 프로세스 전체를 관리하고 데이터를 수집하여 모니터링 툴에 전달해주는 등의 기능을 해주는 Agent 프로세스나 Long 혹은 Lob 데이터 처리를 위해 별도로 구성된 Llob 프로세스, Agent 프로세스를 통해 실제 프로세스에 명령을 내리는 Admin 프로세스에 대한 구성을 이해함으로써 이후에 언급되는 부분의 이해가용이하다.

    전체 구성을 보면 아래와 같다.

    각 프로세스에 대한 역할은 아래와 같다.

    hashtag
    Admin Process

    Agent 프로세스를 통해 다른 프로세스에게 명령을 내린다. Agent 에게 내린 명령과 리턴을 터미널에서 출력한다고 이해할 수 있다.

    명령어 목록은 메뉴얼을 참고한다.

    hashtag
    Agent Process

    프로세스 관리에 들어가는 다양한 업무를 여기서 모두 수행한다. 대표적으로 아래와 같은 작업들이 있다.

    • 프로세스 기동 / 종료

    • 프로세스 별 리소스 모니터링

    • 프로세스 설정 변경

    이외에도 관리에 해당하는 작업은 모두 이곳에서 작업을 수행해준다.

    hashtag
    Extract Process

    CDC 에 있어서 변경 데이터를 캡쳐하는 프로세스이다. 현재는 RDBMS의 리두로그를 보고 데이터를 추출하는 작업을 수행한다.

    hashtag
    Apply Process

    변경된 데이터를 peer쪽에 반영하는 작업을 수행한다.

    hashtag
    Llob Process

    RDBMS에서 사용되는 Long 혹은 Lob 과 같은 큰 단위의 데이터는 변경분의 데이터도 크다. 따라서 데이터가 리두에 남는다 하여도, 트랜잭션 말미에는 데이터가 삭제가 되거나 혹은 크게 변경될 가능성이 있다.

    트랜잭션 단위로 봤을 땐, 마지막 형상의 데이터만 알아도 ACID를 유지하는 데에는 아무 문제가 없다. 모든 변경분의 데이터를 추적하지 않아도 ACID가 유지가 된다는 뜻은 처리성능(Throughput)을 불필요하게 희생하면서까지 연산을 수행할 필요는 없다는 의미이다.

    Llob 프로세스에서 주로 수행하는 일은 Commit 이 들어온 시점에 Flashback 쿼리를 수행하여 해당 시점 즉 트랜잭션이 종료되는 시점에서의 데이터만 조회하여 Apply 에서 발생하는 데이터 처리량을 줄이고, 전체 동기화 과정에서의 부하를 줄여주는 프로세스이다.

    hashtag

    Prosync 디렉토리 구조

    ProSync 설치 후 디렉토리 구조에 대한 설명이다.

    ProSync 설치 후 $PRS_HOME 디렉토리는 아래 구조로 구성된다. 각 디렉토리는 ProSync 실행 및 관리를 지원한다.

    # tree 결과
    ├── bin
    │   ├── olr_test
    │   ├── prs_adm
    │   ├── prs_agent
    │   ├── prs_cm.sh
    │   ├── prs_cred
    │   ├── prs_dummy
    │   ├── prs_ext
    │   ├── prs_glob
    │   ├── prs_oapply
    │   ├── prs_oext
    │   ├── prs_olob
    │   ├── prs_pext
    │   ├── prs_papply
    │   ├── prs_pllob
    │   ├── prs_pretty_instance_map
    │   ├── prs_vf
    │   └── tblr_test
    ├── client
    │   └── lib
    ├── config
    │   ├── templates
    │   └── variant
    ├── install
    │   ├── prs_backup.sh
    │   ├── prs_common_agent.sh
    │   ├── prs_common_dsn.sh
    │   ├── prs_common.sh
    │   ├── prs_common_topmap.sh
    │   ├── prs_install_agent.sh
    │   ├── prs_install.sh
    │   ├── prs_meta.sh
    │   ├── prs_util.sh
    │   ├── scripts
    │   └── templates
    └── license
        └── oss_licenses
    디렉토리
    설명

    bin

    ProSync 프로세스 바이너리 파일이 위치하는 디렉토리이다.

    client/lib

    hashtag

    Sequence 동기화

    hashtag
    개요

    ProSync는 Source 데이터베이스의 Sequence 객체 값을 Target 데이터베이스로 실시간 동기화하는 기능을 제공한다. Sequence의 NEXTVAL이 호출되며 속성값이 갱신될 때 마다 Target으로 전달된다.

    hashtag


    hashtag
    지원 환경

    Source 데이터베이스
    Target 데이터베이스
    지원 여부

    hashtag
    Tibero to Tibero 환경

    hashtag
    동기화 방식

    Source Tibero에서 Sequence의 NEXTVAL이 호출되면, 해당 값이 Target Tibero의 동일 Sequence에 실시간으로 반영된다.

    hashtag
    사전 준비사항

    1. Source와 Target에 동일한 이름의 유저 아래에 동일한 이름의 Sequence가 생성되어 있어야 한다.

    2. ProSync 설치 스크립트가 정상적으로 수행되어 있어야 한다.

    3. 동기화 대상 리스트 파일(기본값: prs_obj_group1.list) 파일에 SYS._DD_SEQ 테이블이 기재돼 있어야 한다.

    4. 동기화 대상 리스트 파일(기본값: prs_obj_group1.list) 파일에 동기화하고자 하는 SEQUENCE가 기재돼 있어야 한다.

    hashtag
    제약사항

    1. Sequence 생성 시 NOCACHE 옵션으로 생성 필요하다.

    2. Source, Target DB 의 동기화 대상이 되는 SEQUENCE 짝의 설정값은 일치해야 한다.

    3. 프로싱크에서 Sequence ALTER 수행 시 타겟 DB에서 SYS._DD_SEQ NEXTVAL 값을 기준으로 Boundary Check를 수행하기 때문에, 타겟 NextVal 값보다 MAX/MIN 값이 더 작은/큰 경우, TBR-7134 에러가 발생한다.

    hashtag
    Oracle to Tibero 환경

    hashtag
    동기화 방식

    Source Oracle에서 Sequence의 NEXTVAL이 호출되면, 해당 값이 Target Tibero의 동일 Sequence에 반영된다. Target의 Sequence 값이 Source 와 겹치지 않고, 동일하거나 앞서가도록 동기화가 진행된다.

    hashtag
    사전 준비사항

    1. Source Oracle과 Target Tibero에 동일한 이름의 Sequence가 생성되어 있어야 한다.

    2. ProSync 설치 스크립트가 정상적으로 수행되어 있어야 한다.

    3. 동기화 대상 리스트 파일(기본값: prs_obj_group1.list) 파일에 SYS.SEQ$ 테이블이 기재돼 있어야 한다.

    4. 동기화 대상 리스트 파일(기본값: prs_obj_group1.list) 파일에 동기화하고자 하는 SEQUENCE가 기재돼 있어야 한다.

    hashtag
    제약사항

    1. Source, Target DB 의 동기화 대상이 되는 SEQUENCE 짝의 설정값은 일치해야 한다.

    2. SEQUENCE 값의 정합성을 위해 ORDER 옵션의 사용이 권장된다.

    hashtag


    hashtag
    주의사항

    항목
    설명

    hashtag

    Admin 실행

    ProSync Admin Utility의 설치방법 및 실행 명령어를 안내한다.

    hashtag
    설치

    ProSync Admin Utility는 ProSync를 설치하는 과정에서 함께 설치된다.

    hashtag


    hashtag
    실행

    ProSync Admin Utility를 실행하는 명령어의 문법은 다음과 같다.

    hashtag
    options

    항목
    설명

    hashtag
    script

    항목
    설명

    ProSync Admin Utility 실행 과정은 다음과 같다.

    ProSync Admin Utility가 정상적으로 실행되면 위 예제처럼 Admin 프롬프트가 나타난다.

    이 프롬프트에서 데이터베이스 사용자는 ProSync 관리를 위한 문장을 실행할 수 있다.

    hashtag

    명령어

    ProSync Admin Utility가 제공하는 명령어의 사용법과 실행 방법을 안내한다.

    다음은 ProSync Admin Utility 명령어를 표현하는 사용법의 예이다.

    위의 예를 기준으로 ProSync Admin Utility에서 사용하는 명령어의 문법을 해석하는 방법은 다음과 같다.

    항목
    설명

    Memory Control

    ProSync의 데이터 흐름도를 상세히 이해하고, 이를 통해 Memory 사용량 조절방식을 안내한다.

    hashtag
    ProSync Data Flow

    데이터가 처음 생성되는 위치는 Source DB의 Redo Log이다. Redo Log에서 발생된 데이터를 Extract 가 추출하여 Chunk 단위로 데이터를 적재한다.

    적재된 데이터는 TCP Socket을 통해 전송이 된다. Non Blocking 통신이기 때문에 전체 데이터에 대한 전송이 실패하면, 이후의 데이터들은 Non Blocking Queue에 쌓이게 된다. 이 Queue에 쌓인 데이터는 커널로부터 반대쪽 TCP Recv Buffer가 비어있다는 신호가 올 때, 순서대로 다시 데이터를 보내게 된다.

    Apply는 받은 데이터를 모두 객체화 (역직렬화) 하여 TX_HASH에 쌓이게된다. xid 는 트랜잭션 고유의 id 를 의미하며, ACID를 지켜주기 위해 트랜잭션의 커밋까진 이 위치에서 데이터를 계속 보관한다. 트랜잭션의 커밋이 들어오면 해당 트랜잭션은 Target Database에 반영이 가능한 상태로 판단하고 Replay Queue로 데이터를 넘겨준다.

    Apply

    hashtag
    성능

    Apply 프로세스는 Extract 프로세스가 전달한 변경 데이터를 TX별로 정리 후 commit 요청된 시점부터 Target DB에 반영하며 주로 DB에 쿼리를 수행한 후 결과를 기다리는 과정에서 지연이 발생한다.

    지연을 방지하기 위해, Target DB에 반영 쿼리를 수행하는 APPLY_NUM 파라미터를 조절하여 Thread 수를 늘려 성능을 개선할 수 있다.

    hashtag

    암호화 테이블 추출

    Source DB가 Tibero인 경우, 암호화된 테이블에 대한 동기화를 지원한다. 암호화된 테이블 동기화를 위해서는 복호화를 위한 Wallet file 접근 권한이 필요하다.

    TDE_FOR_EXT=[Y|N] TDE_WALLET_FILE=file_path TDE_WALLET_PWD=wallet_password TDE_FOR_APPLY=[Y|N] TDE_FOR_TABLESPACE=[Y|N]

    파라미터
    설명

    프로세스 실행에 필요한 라이브러리 파일이 위치하는 디렉토리이다.

    config

    ProSync 실행에 필요한 설정 파일이 위치하는 디렉토리이다.

    config/templates

    환경설정 파일 템플릿들이 위치하는 디렉토리이다.

    install

    ProSync 설치에 필요한 파일이 위치하는 디렉토리이다.

    install/prs_install.cfg

    ProSync 설치 설정 파일이다.

    install/prs_install_agent.cfg

    Agent 프로세스 설치 설정 파일이다.

    install/prs_install.sh

    ProSync 설치 스크립트이다.

    install/prs_install_agent.sh

    Agent 프로세스 설치 스크립트이다.

    install/prs_common.sh

    prs_install.sh에서 사용되는 공통 함수들을 모아놓은 스크립트이다.

    install/prs_common_agent.sh

    prs_install_agent.sh에서 사용되는 공통 함수들을 모아놓은 스크립트이다.

    install/prs_common_dsn.sh

    ProSync 설치 시 DSN 관련 공통 함수들을 모아놓은 스크립트이다.

    install/prs_util.sh

    ProSync 설치 시 사용되는 유틸리티 함수들을 모아놓은 스크립트이다.

    install/prs_backup.sh

    ProSync 패치 시 백업 데이터를 생성하는 스크립트이다.

    install/prs_meta.sh

    ProSync 패치를 수행하는 스크립트이다.

    install/prs_obj_group1.list

    동기화 대상 테이블 정보가 담겨있는 파일이다.

    install/scripts

    ProSync 설치에 필요한 SQL 파일들이 위치하는 디렉토리이다.

    install/templates

    ProSync 의 설치 및 설정에 필요한 템플릿 파일들이 위치하는 디렉토리이다.

    license

    ProSync 라이선스 파일이 위치하는 디렉토리이다.

  • Source DB 의 config 파일에 _DDL_SEQ_SUPPLOG=Y 파라미터를 사용해야 한다.

  • Target DB 의 config 파일에 SEQ_GET_NEXTVAL_FROM_DD_TABLE=Y 파라미터를 사용해야 한다.

  • 대량 호출 시

    빈번한 NEXTVAL 호출 시 동기화 지연이 발생할 수 있다. 적절한 CACHE 값 설정으로 호출 빈도를 조절하는 것이 권장된다.

    Active-Active 환경 지양

    Target DB 에서 SEQUENCE 의 사용을 지양한다. NEXTVAL을 통해 Target DB 에서 SEQUENCE 를 사용하게 되면 동기화 중인 SEQUENCE 의 정합성, 특히 고유성에 문제가 생길 가능성이 높다.

    Tibero

    Tibero

    지원

    Oracle

    Tibero

    지원

    설치 준비

    Instance 설치 과정에서 DB 의 PRS_INSTALL_USER 는 SYS.SEQ$(SYS._DD_SEQ) 테이블 및 동기화 하고자 하는 SEQUENCE 에 대한 SELECT 권한이 필요하다.

    동기화 시점

    NEXTVAL 호출 시에만 동기화된다. CURRVAL 조회는 동기화되지 않는다.

    Sequence 존재 필수

    Target에 동일한 이름의 Sequence가 미리 생성되어 있어야 한다.

    ALTER SEQUENCE

    Sequence 속성 변경(INCREMENT BY, MAXVALUE 등)은 DDL 동기화를 통해 처리된다.

    Source DB에서 생성한 Wallet file의 경로를 설정한다. 반드시 절대 경로를 포함하여 입력해야 한다.

    TDE_WALLET_PWD

    Source DB에서 생성한 Wallet file의 Password를 입력한다. 설치 과정에서 입력했다면, 자동적으로 ProSync가 해당 정보를 암호화하여 저장하여 #encrypted 값으로 나타나며, 설치 과정에서 입력하지 않았다면 비밀번호를 직접 입력하거나 수동으로 ProSync Wallet을 생성해주어야 한다.

    TDE_FOR_APPLY

    데이터 복호화 기능 사용 여부를 설정한다. Apply 프로세스에서 설정하며 TDE_FOR_EXT와 동일하게 동작한다.

    TDE_FOR_TABLESPACE

    암호화된 Tablespace 동기화를 수행하려면 사용한다. 만약 동기화 대상에 암호화된 Tablespace 를 추가하고 본 파라미터를 활성화 하지 않을 시 에러가 발생한다.

    hashtag

    TDE_FOR_EXT

    데이터 복호화 기능 사용 여부를 설정한다.

    설치 과정에서 TDE_WALLET_PWD를 입력했다면 기본적으로 Y로 설정된다. 암호화된 테이블에 대하여 Sam 기능을 사용하려면 반드시 Y로 설정해야 한다.

    TDE_WALLET_FILE

    -h, --help

    도움말 화면을 출력한다.

    -v, --version

    버전을 출력한다.

    filename

    파일명이다.

    ext

    파일의 확장자로, 지정하지 않을 경우 SUFFIX 시스템 변수에 지정된 확장자가 기본값이다.


    hashtag
    장애

    hashtag
    반영 실패

    Source DB에서 추출한 변경 데이터에 대해 Target DB에 반영할 수 없는 경우, 프로싱크는 실패한 DML을 성공할 때 까지 다시 시도한다.

    사용자는 해당 데이터가 반영될 수 있도록 Target DB를 수정하거나 DCR 기능 또는 DISCARD 기능을 사용하여 우회할 수 있다.

    hashtag
    메모리 과점유

    ProSync는 TX에 대해 commit 또는 rollback 이전까지 반영을 시작하지 않기 때문에 commit 없이 변경 데이터를 계속해서 전달받는 경우, Apply 프로세스에서 사용하는 메모리가 증가할 수 있다.

    이때, 메모리 조절용 파라미터를 설정하여 사용하는 메모리를 조절할 수 있다.

    hashtag
    MEMORY_CTRL_STOP_SIZE/MEMORY_CTRL_RESUME_SIZE

    Replay Thread 에서 완료되지 않은 TX들의 총 메모리 크기가 MEMORY_CTRL_STOP_SIZE 파라미터의 값을 넘는 경우 extract 프로세스에서 보내는 chunk를 수신하지 않는다.

    이후, Replay Thread 에서 동기화를 수행하여 완료되지 않은 TX들의 총 메모리 크기가MEMORY_CTRL_RESUME_SIZE 값보다 낮아지는 경우 다시 Extract 프로세스에서 보내는 chunk를 수신한다.

    hashtag
    MERGE_BLOCK_CNT/MERGE_RESUME_CNT

    TAC/RAC 환경에서 특정 extract 프로세스의 chunk만 계속해서 수신 받는 경우, stmt수가 MERGE_BLOCK_CNT 파라미터의 값을 넘는 경우 해당 extract 프로세스에서 보내는 chunk를 수신하지 않는다.

    이후, 다른 extract 프로세스들에게 chunk를 수신 받아 처리되지 못한 stmt수가 MERGE_RESUME_CNT 값보다 낮아지는 경우 다시 extract 프로세스에서 보내는 chunk를 수신한다.

    hashtag
    CHUNK_TOTAL_SIZE

    extract 프로세스에서 수신한 chunk에 대해, const Thread 에서 처리하지 못한 TX들의 총 메모리 크기가 CHUNK_TOTAL_SIZE 파라미터의 값을 넘는 경우 extract 프로세스에서 보내는 chunk를 수신하지 않는다.

    이후, const Thread 가 처리하지 못한 메모리 크기가 파라미터 값의 절반 이하로 낮아지는 경우 다시 extract 프로세스에서 보내는 chunk를 수신한다.

    hashtag
    TX_HASH_SIZE

    apply 프로세스의 Const Thread 메모리에서 관리하는 tx정보들의 크기를 관리하는 파라미터로 commit이 오지 않은 stmt들 정보가 TX_HASH_SIZE를 넘어가는 경우 가장 큰 TX부터 part파일 생성 후 메모리에서 제거하며 해당 값보다 사용하는 메모리가 낮아질 때 까지 반복한다.

    hashtag
    디스크 사용

    hashtag
    TX_HASH_FILE_CNT/TX_HASH_FILE_TOTAL_SIZE

    Log Switch 감지 시, const Thread 에서 아직 commit되지 않은 tx정보를 재기동 상황에서도 유지하기 위해 txh 파일을 생성한다. 이때, txh 파일의 최대 개수 또는 파일들의 합의 최대 크기를 설정할 수 있다.

    TX_HASH_FILE_MODE 파라미터를 통해 제한 방식을 설정할 수 있으며, 각 Extract별로 txh의 크기나 개수를 계산한다.

    hashtag
    partfile

    TX_HASH_SIZE 이상으로 const Thread 에서 TX 정보들이 쌓이게 되는 경우, 메모리 관리를 위해 part파일을 작성하고 메모리에서 제거하게 되며 관련된 TX가 commit 또는 rollback되기 전까지 partfile은 제거되지 않는다. 따라서, 한 TX가 끝나지 않는 경우 디스크 사용량이 계속해서 증가할 수 있다.

    hashtag


    hashtag
    주의사항

    hashtag
    Character Set 설정 주의사항

    hashtag
    Source DB의 Character Set과 OS 환경 변수(LANG) 불일치 시 주의사항

    Source DB에 데이터를 삽입할 때는 해당 DB의 Character Set과 일치하는 Terminal 및 OS의 LANG 환경변수 설정이 반드시 필요하다.

    LANG 설정이 Source DB의 Character Set과 일치하지 않으면, ProSync가 데이터를 추출할 때 잘못된 인코딩으로 인식하게 되어, Target DB로 전송 시 문자 깨짐 또는 손상된 데이터가 저장될 수 있다.

    circle-info

    참고

    예시

    • Source Database Character Set: UTF-8

    • Terminal 및 OS LANG 설정: EUC-KR 이 경우, 사용자가 입력한 한글 데이터는 실질적으로 EUC-KR로 인코딩되어 저장된다. 그러나 ProSync는 해당 데이터를 UTF-8로 간주하고 Target DB의 문자셋에 맞게 변환을 시도하게 되므로, 결과적으로 잘못된 문자 변환이 발생할 수 있다.

    따라서, Source DB에 데이터를 입력하는 시스템의 LANG 환경 변수는 Source DB의 Character Set과 정확히 일치시켜야 하며, 시스템 관리자 또는 사용자 환경에서도 일관된 문자셋 설정이 유지되어야 한다.

    hashtag
    Trigger가 설정된 테이블 동기화 시 주의 사항

    Trigger가 설정된 테이블을 동기화할 경우, Trigger로 인해 예상치 못한 데이터 중복이 발생할 수 있다. 예를 들어, 다음과 같은 Trigger가 Source DB와 Target DB에 존재한다고 가정한다.

    위와 같은 환경에서 TEST.T1 테이블을 동기화할 경우, 다음과 같은 흐름이 발생할 수 있다.

    1. Source DB에서 TEST.T1 테이블에 INSERT 수행 -> Trigger 작동 -> TEST.T2에도 데이터 삽입

    2. 동기화 과정에서 Target DB에 TEST.T1 INSERT 반영 -> Target DB의 Trigger 작동 -> TEST.T2에도 동일한 데이터 삽입

    3. 또한, Source DB에서 추출된 TEST.T2의 INSERT 문이 Target DB에 반영되면서 중복 삽입 발생

    이로 인해 Target DB의 TEST.T2 테이블에는 중복된 데이터가 저장될 수 있다.

    따라서 프로싱크 동기화 로직 상 정합성이 틀어질 수 있기 때문에 Target DB에는 Trigger가 존재해서는 안 된다.

    circle-exclamation

    주의

    제약 조건이 설정된 테이블 동기화 시 주의 사항

    Trigger뿐만 아니라 ON DELETE, ON UPDATE와 같은 제약 조건(Constraint) 또한 동일한 이유로 Target DB에 설정되어서는 안 된다.

    이러한 제약 조건이 존재할 경우, 동기화 시 데이터의 삽입·삭제·갱신 작업이 중복 반영되어 데이터 정합성이 깨질 수 있다.

    hashtag
    Oracle To Tibero 동기화 시 주의 사항

    Oracle To Tibero 동기화의 경우, 이미 데이터가 존재하는 테이블에 ALTER TABLE DDL 수행 시 오라클 내부 동작으로 인해 DPI(Direct Path Insert)가 발생하며 Unique Constraints Violation이 발생할 수 있다.

    예를 들어, 아래와 같은 형상의 테이블이 존재하며, 다음과 같은 흐름으로 진행된다고 가정한다.

    이 때, ALTER TABLE 구문으로 인해 오라클 내부에서 DPI가 발생하며 데이터를 복사하는 과정이 수행되는데, 해당 DPI 구문이 동기화 테이블과 같은 OBJ_ID를 가지고 있어 함께 동기화가 진행되며 Unique Constraints Violation이 발생한다.

    해당 오류 발생 시DISCARD_EC 파라미터에 UNIQUE VIOLATION Error code를 기재하여 우회 할 수 있다.

    circle-exclamation

    주의

    오라클 내부 동작이므로, 어떤 구문 실행 시 DPI가 발생하는지는 정확히 알 수 없다.

    hashtag

    prs_adm [options] [script]
    @filename[.ext]
    $ prs_adm
    ProSync 4 - Admin Utility
    TmaxData Corporation Copyright (c) 2008-. All rights reserved.
    SQL> CREATE OR REPLACE TRIGGER trg_test
    AFTER INSERT ON TEST.T1
    FOR EACH ROW
    BEGIN
    INSERT INTO TEST.T2 VALUES (:NEW.C1, 'Trigger Fired');
    END;
    /
    SQL> CREATE TABLE TEST.T1 (
        ROWCNT NUMBER PRIMARY KEY,
        C1 NUMBER,
        C2 VARCHAR2(2000)
    ) ROW STORE COMPRESS ADVANCED;
    
    SQL> INSERT INTO TEST.T1 (1, 1001, RPAD('C', 4000, 'C'));
    SQL> INSERT INTO TEST.T1 (2, 1002, RPAD('B', 4000, 'B'));
    SQL> COMMIT;
    
    SQL> ALTER TABLE TEST.T1 MOVE ONLINE NOCOMPRESS;
    -- Unique Constraints Violation 발생

    중괄호({ })에 포함된 내용은 반드시 입력해야 명령어를 실행할 수 있다.

    위의 예에서 choice1과 choice2는 중괄호({ }) 내에 있고 버티컬 바(|)로 분리되어 있으므로 둘 중 하나는 명령 프롬프트에 포함되어야 한다.

    버티컬 바(|)

    버티컬 바(|)로 분리된 내용은 그 중 하나를 선택한다.

    애스터리스크(*)

    애스터리스크()로 표시된 내용은 포함되지 않을 수도 있고, 여러 번 포함될 수도 있다. 위의 예에서 arg는 대괄호([ ]) 바로 뒤에 애스터리스크()가 있으므로 포함되지 않을 수도 있고, 한 번 이상 포함될 수도 있다.

    대소문자

    명령어는 대소문자를 구분하지 않는다.

    ProSync Admin Utility에서 사용할 수 있는 명령어는 다음과 같다.

    명령어
    설명

    운영체제의 명령어를 실행한다.

    스크립트를 실행한다.

    현재 버퍼 내의 명령문을 실행한다.

    circle-info

    참고

    각 명령어에 대한 자세한 설명은 명령어 목록에서 확인할 수 있다.

    hashtag

    COM[MAND] param {choice1|choice2} [option] [arg]*

    대괄호([ ])

    대괄호([ ])에 포함된 내용은 입력하지 않아도 명령어를 실행할 수 있다.

    위의 예에서 COMMAND 명령어의 뒷 부분(MAND)과 option, arg는 명령 프롬프트에 포함되지 않을 수 있다.

    중괄호({ })

    Wait Queue에 쌓인 데이터는 트랜잭션들이 커밋된 순서에 맞게 Target Database로 반영이 된다. 이 때 반영 중인 트랜잭션과 반영 대기 중인 트랜잭션이 있을 텐데, 이들간의 의존성 검사를 통하여 시간 순서에 맞고, 의존성이 없는 트랜잭션들은 병렬 처리하여 성능을 높인다.

    hashtag
    Case 1. TX_HASH 에 데이터가 지나치게 많이 쌓이는 경우

    TX_HASH 에 데이터가 계속 쌓인다면 Out of Memory 를 피할 수가 없다. 따라서 특정 임계치를 넘어갈 경우 Part File이라는 이름으로 된 파일을 생성하여 이 위치로 데이터를 옮겨준다.

    데이터를 옮기는 기준은 현재 TX_HASH에 있는 데이터들 중 가장 용량이 큰 트랜잭션 기준으로 파일로 내려가게 되며, 내려간 파일은 실제 반영이 되는 시점까진 계속 Disk에 남게 된다

    이에 대한 기준이 되는 파라미터가 TX_HASH_SIZE 파라미터이다. TX_HASH_SIZE라는 임계치보다 더 많이 데이터가 쌓이게 될 경우 아래와 같은 동작이 수행된다고 생각하면 된다.

    그림 2. TX_HASH 크기가 TX_HASH_SIZE 파라미터보다 큰 경우

    Part File은 반영이 완료되면 제거가 되며, 반영이 되기 전까진 Disk에 남는다. 실제 트랜잭션 반영 시점에도 Part File로 내려간 DML 데이터들이 시간 상 더 앞서기 때문에, 파일에 있는 데이터를 먼저 반영한 후 메모리에 남은 트랜잭션 데이터를 반영한다.

    hashtag
    Case 2. Wait Queue에 데이터가 지나치게 많이 쌓이는 경우

    ProSync는 ACID를 지켜주기 위해 데이터를 순서에 맞게 반영해야 한다. 즉, 앞선 트랜잭션이 반영되지 않는 경우 데이터는 반영될 수 없다는 의미이다. 따라서 Target Database에 장애가 발생하여 트랜잭션 처리가 지연된다면 그만큼 Queue에는 데이터가 쌓이게 된다.

    Queue에 영구적으로 데이터가 쌓이는 것을 방지하기 위해 ProSync는 Queue 내에서 대기 혹은 반영 중인 트랜잭션들의 크기를 모두 확인한다. 이 크기가 너무 크다면 Memory 할당을 멈춰야 한다.

    Memory 할당을 멈추기 위해 ProSync는 데이터가 추가적으로 생산되는 것을 막는다. 즉, Extract 수신되는 데이터를 일시적으로 차단함으로써, 현재 보유 중인 데이터가 일정 수준 이상 처리될 때까지 대기 상태를 유지하도록 강제하는 방식이라 고 볼 수 있다.

    Extract는 앞에서 설명한 내용대로 Non Blocking Queue에 데이터를 쌓다가 실제 추출을 멈춤으로써 추가적인 데이터 생산을 멈추게 된다.

    임계치에 해당하는 파라미터는 아래와 같다.

    • MEMORY_CTRL_STOP_SIZE Wait Queue에 이 크기 이상 만큼의 데이터가 쌓이면 Socket 으로 부터 추가적으로 들어오는 데이터를 막는다.

    • MEMORY_CTRL_RESUME_SIZE Wait Queue에 이 크기 이하만큼 데이터가 줄어들면, Socket 으로 부터 데이터를 다시 받는다.

    그림으로 나타내면 아래와 같다.

    그림 3. Socket Block in ProSync
    circle-exclamation

    주의

    Wait Queue 관련

    Replay 쪽에선 많은 자료구조를 사용한다. 반드시 Wait Queue만 사용하는 것은 아니며, 여러 종류의 Queue나 Tree 등이 사용되는데, 여기선 설명을 위해 모두 Wait Queue로 추상화하여 설명한다.

    hashtag
    Source DB가 Cluster인 경우의 고려사항

    Active-Active Cluster인 RDBMS들은 Physical Disk를 공유하고 있다. 따라서 같은 공간에 서로 순서에 적합하게 데이터를 입력한다. Redo Log는 서로 다른 곳에 작성하더라도 Change Data들의 시간은 순서에 맞게 끔 작성이 된다. ProSync 입장에서 보면 서로 다른 위치에 남은 Redo Log들을 모아 직렬화를 하면 결국 DB Time 순서대로 데이터 정렬이 가능하다는 의미이다.

    따라서 ProSync의 Apply 입장에선 추출이 Cluster인지 아닌지는 관심사가 아니다. 어차피 DB Time기준으로 정렬이 가능한 데이터라면 단순히 한 줄로 세워 놓고 하나씩 쿼리로 변경해주면 된다. 다만 문제는 장애 상황이나 지연 상황에서 발생한다.

    만약에 한쪽 노드에서 아무런 부하가 없거나 장애로 멈춰버리게 되면 Redo Log 작성이 멈추게 된다. 읽을 것이 없는 Extract 프로세스는 아무런 데이터를 보낼 수가 없다. 이렇게 되면 Apply 프로세스 입장에선 현재 Cluster 중 하나가 장애가 나서 못 보내고 있는 것인지, 부하가 없어서 데이터를 못 보내는 것인 지 확인할방법이 없다.

    따라서 Extract 에서는 발생했을, 장애가 발생했다는 메시지를 TCP Socket으로 전달해주고, 부하가 없는 상황을 대비하여 ProSync용 Dummy Table에 강제로 부하를 만들어 데이터를 생산해서 전달해준다.

    이 과정을 통해 Apply프로세스는 서로 다른 Cluster Node의 데이터들을 항상 정렬할 수 있다. 하지만 정렬을 하기 위해선 정렬을 위한 공간이 필요하며, 이 위치는 아래 그림과 같다.

    그림 4. Merge Queue

    위와 같이 Extract가 여러 개인 상황 (Active Cluster) 에선 각 Extract 별로 데이터를 먼저 Merge Queue에 쌓아 놓는다. 쌓인 데이터가 직렬화가 되려면 모든 Extract 별 데이터가 1개라도 있어야 하기 때문에 이때까진 Merge Queue에 데이터가 쌓이게 된다.

    다만 네트워크 장애나 모종의 이유로 한쪽에서 데이터가 들어오는 행위가 매우 지연될 수 있기 때문에, 마찬가지로 여기서도 추가적인 데이터가 들어오지 못하게 TCP Socket으로 부터 데이터를 막는 동작이 사용된다.

    여기에 사용되는 파라미터는 아래와 같다.

    • MERGE_BLOCK_CNT 특정 노드로부터 데이터가 이 갯수 이상만큼 쌓이면 해당 TCP Socket을 막는다.

    • MERGE_RESUME_CNT 특정 노드로부터 데이터가 이 갯수 보다 작다면 해당 TCP Socket을 다시 열어준다.

    그림으로 보면 아래와 같다.

    그림 5. Socket Block in ProSync 2

    Extract 별로 연결이 따로 존재하므로 이와 같이 별도로 관리하게 된다.

    hashtag

    그림 1. ProSync DataFlow
    SELECT O.OBJ#
    FROM SYS.OBJ$ O, SYS.USER$ U
    WHERE O.OWNER# = U.USER#
    AND O.TYPE# = 2
    AND U.TYPE# = 1
    AND U.NAME = 'Target Prosync Instance Meta User'
    AND O.NAME = 'PRS_COMMITTED_TX_LIST';
    SELECT DATAOBJ#
    FROM SYS.OBJ$ O, SYS.USER$ U
    WHERE O.OWNER# = U.USER#
    AND O.TYPE# IN (2, 19, 34)
    AND U.TYPE# = 1
    AND U.NAME = 'Target Prosync Instance Meta User'
    AND O.NAME = 'PRS_COMMITTED_TX_LIST'
    AND O.DATAOBJ# IS NOT NULL;
    SELECT DATAOBJ#, OBJ#
    FROM SYS.OBJ$ O, SYS.USER$ U
    WHERE O.OWNER# = U.USER#
    AND O.TYPE# IN (2, 19, 34)
    AND U.TYPE# = 1
    AND U.NAME = 'Target Prosync Instance Meta User'
    AND O.NAME = 'PRS_COMMITTED_TX_LIST'
    AND O.DATAOBJ# IS NOT NULL;
    SELECT O.OBJ_ID
    FROM SYS._DD_OBJ O, SYS._DD_USER U
    WHERE O.OWNER_ID = U.USER_ID
    AND O.TYPE_NO = 1
    AND U.TYPE_NO = 1
    AND U.NAME = 'Target Prosync Instance Meta User'
    AND O.NAME = 'PRS_COMMITTED_TX_LIST';
    'Memory Control'
    '운영 가이드'
    Admin
    그림 2. ProSync DataFlow
    그림 3. Inter process & Inter thread communication in Prosync.
    그림4. Prosync Processes

    Discard

    hashtag
    DML DISCARD

    ProSync가 동기화 과정 속에 DML을 Target DB에 반영 중 에러가 발생할 수 있다. 일반적인 경우에는 ProSync가 해당 DML에 대한 반영을 성공할 때 까지 재시도하게 된다.

    해당 기능을 사용하면 특정한 에러에 대해 재시도하는 대신 해당 DML에 대한 반영을 생략하고 이후의 동기화를 진행하도록 설정할 수 있다.

    또한 DISCARD 기능이 발생한 이력을 기록하는 Discard file 을 작성할 수 있다.

    해당 기능을 사용하기 위해선 config 파일에 다음과 같은 Parameter를 설정해야 한다.

    DISCARD_YN=[Y|N]
    DISCARD_EC=2 10007 8033
    DISCARD_FILE_YN=[Y|N]
    
    DISCARD_FILE_DIR=/directory/to/save/file
    DISCARD_FILE_SIZE=200M
    DISCARD_BACKUP_DIR=/directory/to/save/backup/file
    DISCARD_BACKUP_SIZE=10G
    파라미터 이름
    설명
    circle-exclamation

    주의

    • DISCARD 기능을 활성화하면 batch apply 기능이 사용 불가능하다.

    • DML을 반영할 때 발생하는 에러에 대해서 만 DISCARD 기능을 지원한다.

    hashtag


    hashtag
    DDL DISCARD

    DDL도 DML과 마찬가지로 Target DB에 반영 중 에러가 발생할 수 있다. 일반적인 경우에는 ProSync가 해당 DDL에 대한 반영을 성공할 때 까지 재시도하게 된다.

    해당 기능을 사용하면 재시도하는 대신 해당 DDL에 대한 반영을 생략하고 이후의 동기화를 진행하도록 설정할 수 있다.

    circle-exclamation

    주의

    단, TABLE 관련 DDL은 해당 기능을 사용하더라도 실패하는 경우 생략할 수 없다.

    또한 DISCARD 기능이 발생한 이력을 기록하는 Discard file 을 작성할 수 있다.

    해당 기능을 사용하기 위해선 config 파일에 다음과 같은 Parameter를 설정해야 한다.

    파라미터 이름
    설명

    hashtag

    ProSync의 동기화 대상 테이블을 추가/제거 하거나 파라미터 값을 변경한다.

    EXIT / QUIT

    ProSync Admin Utility를 정지한다.

    HELP

    도움말을 출력한다.

    PAUSE

    사용자가 입력한 INST_ID에 속한 Extract 프로세스의 작업을 멈춘다.

    RESUME

    사용자가 입력한 INST_ID에 속한 Extract 프로세스의 작업을 재개한다.

    SET

    ProSync Admin Utility의 시스템 변수를 설정한다.

    SHOW

    ProSync Admin Utility의 시스템 변수 및 각 프로세스의 파라미터를 출력한다.

    SHUTDOWN

    사용자가 입력한 INST_ID의 프로세스 혹은 매니저 프로세스를 정지한다.

    STARTUP

    사용자가 입력한 INST_ID의 프로세스 혹은 매니저 프로세스를 실행한다.

    STATUS

    전체 프로세스, 사용자가 입력한 INST_ID의 프로세스 혹은 매니저 프로세스의 상태를 확인하는 명령어이다.

    MONITOR

    Instance의 apply 프로세스가 Target DB에 반영 중인 Query의 정보를 출력한다.

    ! / HOST
    @
    /
    ALTER

    Tables

    Extract 프로세스에서 Source DB에 생성하고 사용하는 메타 테이블에 대해 안내한다.

    hashtag
    PRS_OBJ_LIST

    동기화 할 object들의 Type, Owner, Name, 등록 시기를 저장한다.

    hashtag
    PRS_TXINFO

    tlr(olr)파일의 위치, seq정보를 저장한다.

    tlr(olr)파일은 Redo Log를 모두 읽고 다음 Log를 읽기 전 아직 commit되지 않은 tx 정보를 저장한 파일로 ProSync는 Begin이 없는 tx에 대해서는 추출하지 않기 때문에, 기동 시점에 따라 누락되는 tx가 없도록 이전 Redo Log를 읽었을 때 아직 commit되지 않은 tx정보를 저장한다.

    hashtag
    PRS_DDL_HIST

    발생한 DDL의 시점, DDL 종류, 메타 테이블 업데이트 여부, 이후 프로싱크가 사용하는 DD의 Sequence 정보를 저장한다.

    hashtag
    PRS_DICT_HIST

    Source DB가 Oracle이며 Log Miner를 사용하여 동기화 하는 경우 사용한다. DD 정보를 저장한 dict파일 정보를 저장한다.

    hashtag
    PRS_DD_USR

    Source DB에 존재하는 USER들의 이름과 USER_ID를 저장한다. User Filtering 기능을 사용하기 위해 저장한다.

    hashtag
    PRS_DD_TBL

    동기화 테이블의 DD sequence, object id, 테이블 명 정보를 저장한다. Redo Log는 object id만 남기기 때문에, 해당 정보를 Apply 프로세스에 전달하여 적절하게 반영 쿼리를 생성한다.

    hashtag
    PRS_DD_SGMT

    특정 object_id가 어느 테이블에 속하는지 정보를 저장한다.

    파티션 등에 저장되는 데이터는 테이블 과는 다른 object_id를 남기기 떄문에, 해당 데이터를 문제없이 추출하기 위해 파티션의 object_id와 테이블의 object_id를 매핑한다.

    hashtag
    PRS_DD_COL

    컬럼의 속성과 어느 테이블에 속하는지 정보를 저장한다. Redo Log는 컬럼 속성 정보를 남기지 않기 때문에, 해당 정보를 Apply 프로세스에 전달하여 적절하게 반영 쿼리를 생성한다.

    hashtag
    PRS_DD_CON

    컬럼의 제약 조건 정보를 저장한다. Apply 프로세스의 Parallel Replay에서 적절하게 반영 순서를 조합하기 위하여 사용된다.

    hashtag
    PRS_DD_ENC

    테이블의 암호화 정보를 저장한다. Apply 프로세스에서 복호화하기 위해 저장한다.

    hashtag
    PRS_DUMMY_TBL

    변경 데이터가 없는 경우에도 추출, 반영에 문제 없는지 확인용으로서 주기적으로 부하를 발생시키기 위한 목적으로 사용된다. 부하가 없는 경우, 주기적으로 해당 테이블에 대한 부하를 발생시킨다.

    hashtag
    PRS_LOGMNR_INFO

    Source DB가 Oracle이며 Log Miner를 사용하여 동기화 하는 경우 사용한다. 마지막으로 추출한 시점 정보를 저장한다.

    hashtag
    PRS_DD_SEQ_TBL

    시퀀스 동기화를 위한 정보를 저장한다.

    hashtag
    PRS_DD_ETL_HIST

    ProSync의 초기적재 기능을 사용하기 위한 정보를 저장한다.

    hashtag
    PRS_INSTALL_TOP

    Source DB가 Oracle이며 Log Miner를 사용하여 동기화 하는 경우 사용한다. instance 이름을 저장한다.

    circle-info

    참고

    본 페이지에 언급되지 않은 테이블은 Deprecated 되어 불필요한 테이블이다.

    hashtag

    DISCARD_BACKUP_DIR

    discard 파일의 크기가 설정한 최대 크기를 초과하게 되면 생성하는 백업파일의 위치를 지정하는 파라미터.

    • 유형: 디렉토리

    • 범위: -

    • 기본값: DISCARD_FILE_DIR/backup

    DISCARD_BACKUP_SIZE

    backup 디렉토리의 최대 크기를 지정하는 파라미터.

    • 유형: uint64, dynamic

    • 범위: 0 - 128G

    • 기본값: 0(무제한)

    (12032)Deadlock detected. 에러는 DISCARD 기능을 지원하지 않는다.

  • SAM_BIND_VALUE=Y 를 사용하면, discard log에 실패한 query의 value 값이 함께 저장된다.

  • DDL_DISCARD_BACKUP_DIR

    discard 파일의 크기가 설정한 최대 크기를 초과하게 되면 생성하는 백업파일의 위치를 지정하는 파라미터.

    • 유형: 디렉토리

    • 범위: -

    • 기본값: "/"

    DDL_DISCARD_BACKUP_SIZE

    backup 디렉토리의 최대 크기를 지정하는 파라미터.

    • 유형: uint64

    • 범위: 0 - 128G

    • 기본값: 0

    DISCARD_YN

    동기화 중 에러가 발생하는 경우에 스킵할 지에 여부를 설정한다. Y 상태에선 발생한 에러가 DISCARD_EC 에 작성된 에러코드에 속해있는 경우 재시도를 생략한다.

    • 유형: Y/N

    • 범위: Y/N

    • 기본값: N

    DISCARD_EC

    재시도를 하지 않고 건너뛰고자 하는 에러코드를 입력한다.

    • 유형: 에러코드

    • 범위: 최대 256개

    • 기본값:

    DISCARD_FILE_YN

    DISCARD 동작이 발생했을 때 해당 내용을 discard 파일에 남기는 기능을 활성화 하는 파라미터이다.

    • 유형: Y/N, dynamic

    • 범위: Y/N

    • 기본값: N

    DISCARD_FILE_DIR

    discard file의 저장 위치를 지정하는 파라미터.

    • 유형: 디렉토리

    • 범위: -

    • 기본값: (LOG_DIR과 같은 디렉토리)

    DISCARD_FILE_SIZE

    discard 파일의 최대 크기를 지정하는 파라미터.

    • 유형: int32, dynamic

    • 범위: 1M - 1G

    • 기본값: 100M

    DDL_DISCARD_YN

    동기화 중 에러가 발생하는 경우에 스킵할 지에 여부를 설정한다.

    • 유형: Y/N

    • 범위: Y/N

    • 기본값: N

    DDL_DISCARD_FILE_YN

    DISCARD 동작이 발생했을 때 해당 내용을 discard 파일에 남기는 기능을 활성화 하는 파라미터이다.

    • 유형: Y/N

    • 범위: Y/N

    • 기본값: N

    DDL_DISCARD_FILE_DIR

    discard file의 저장 위치를 지정하는 파라미터.

    • 유형: 디렉토리

    • 범위: -

    • 기본값: "/"

    DDL_DISCARD_FILE_SIZE

    discard 파일의 최대 크기를 지정하는 파라미터.

    • 유형: int32

    • 범위: 1M - 1G

    • 기본값: 100M

    DDL_DISCARD_YN=[Y|N]
    DDL_DISCARD_FILE_YN=[Y|N]
    
    DDL_DISCARD_FILE_DIR=/directory/to/save/file
    DDL_DISCARD_FILE_SIZE=200M
    DDL_DISCARD_BACKUP_DIR=/directory/to/save/backup/file
    DDL_DISCARD_BACKUP_SIZE=10G

    DDL Rule

    ProSync 사용자는 적용 프로세스의 설정 파일에서 DDL 파라미터를 설정할 수 있다. DDL 파라미터는 동기화 할 DDL에 대한 설정이다.

    DDL 파라미터는 하나 이상의 DDL Rule 문장으로 구성된다. DDL Rule에는 DDL 동기화를 포함/배제할 대상과 DDL 종류를 명시할 수 있다.

    hashtag
    사용법

    DDL=([SET] [RANGE], TYPE=('[DDL OPERATION] [DDL OBJECT]', ...))
    항목
    설명
    circle-info

    참고

    [RANGE]의 오브젝트 이름이나 [DDL OPERATION], [DDL OBJECT]에 %를 명시에 포함시켜 wildcard로 처리할 수 있다.

    Source DB가 Oracle인 경우 [DDL OPERATION]과 [DDL OBJECT]에 '%'를 사용할 수 없다.

    다음은 Source DB에 따라 설정 가능한 [DDL OPERATION]과 [DDL OBJECT]의 조합이다.

    hashtag
    Source DB가 Tibero인 경우

    DDL OPERATION
    DDL OBJECT

    hashtag
    Source DB가 Oracle인 경우

    DDL OPERATION
    DDL OBJECT

    hashtag
    예제

    다음은 모든 스키마에 대해서 모든 종류의 DDL 동기화를 하지만, 스키마 EXCLUDED_USR의 모든 테이블에 대한 DDL 동기화는 배제하는 예제이다.

    다음은 동기화 대상 테이블에 대해 TABLE을 대상으로 하는 DDL을 동기화하고, INCLUDED_USR의 모든 오브젝트 이름에 대해 INDEX를 대상으로 하는 DDL을 동기화한다. 반면, 오브젝트 이름이 EXCLUDED_USR.IDX1일 경우 INDEX를 대상으로 하는 DDL을 동기화하지 않는다.

    다음은 SRCUSR의 모든 테이블에 대해 TYPE에 해당되는 DDL을 동기화하지만, SRCUSR.T1에 대해서는 DROP TABLE과 CREATE TABLE에 해당되는 DDL을 동기화하지 않는다.

    hashtag
    DDL 동기화 설정 시 유의사항

    • DDL 문장 크기 동기화 할 DDL 문장의 각 요소는 128글자를 넘을 수 없다.

    • 설정 전 확인 DDL 파라미터의 대상과, 동기화 할 DDL 종류가 정확한지 Wildcard를 고려하여 확인하고 설정한다. 다른 DB나 대상에게 먼저 적용해보고 설정하는 것을 권장한다.

    • CREATE TABLE 이후 동기화 CREATE TABLE에 대한 DDL 동기화 후 생성된 테이블을 DML 동기화 하려면 수동으로 동기화 대상 추가를 해야한다. 반면 DDL은 Rule에 의해 생성된 직후부터 동기화 될 수 있으므로 주의한다.

    circle-exclamation

    주의 DDL=(INCLUDE ALL, TYPE=('%'))설정 시, Source DB의 모든 스키마에서 수행되는 모든 타입의 DDL이 동기화된다. 동기화 대상 여부와 관계없이 모든 DDL이 적용되므로 사용 시 주의가 필요하다. 추가적으로 INCLUDE ALL로 설정하는 경우 설치될 Instance 는 단일 Instance 로 구성되어야 한다.

    hashtag

    Llob Process

    hashtag
    Process 설명

    Llob 프로세스는 Apply 프로세스의 요청에 따라 Source DB의 Long, Clob, Blob 등의 대용량 데이터를 전달하는 동작을 수행한다.

    그림1. Llob 프로세스

    hashtag


    hashtag
    Threads

    hashtag
    Control Thread

    기동 시 타 Thread 시작, 메시지 수신 및 전송 등의 작업을 수행한다. Apply Thread 의 요청이 오는 경우, 적절한 Read Thread 에 전달한다.

    hashtag
    Read Thread

    Apply Thread 의 요청에 따라 Source DB에 flashback query를 통해 llob 데이터를 조회하고 이를 Control Thread 를 통해 요청한 Apply 프로세스에 전달한다.

    해당 시점으로 flashback query를 할 수 없다면, 현재 시점의 데이터를 조회한다.

    hashtag

    -

    TRUNCATE

    TABLE

    implicit DDL CREATE TABLE에 대한 DDL 동기화 실행 중 컬럼의 PRIMARY KEY로 인해 INDEX 생성이 되는 것처럼 명시되지 않은 DDL을 implicit DDL이라 하며, 동기화 설정할 때 이를 주의한다.
  • RENAME 지원 DDL 중 RENAME은 지원하지 않는다. ALTER ... RENAME을 이용한 DDL 구문은 ALTER를 동기화 설정하여 사용할 수 있다.

  • ORACLE LOGMNR Source DB가 Oracle, logmnr 를 사용할 때 동기화 대상에 대한 DDL 동기화만 지원한다.

  • INDEX / CONSTRAINTS 관련 주의사항 INDEX / CONSTRAINTS의 경우 SRC/TAR DB에서 이름이 다를 경우 동기화가 불가능하다.

  • DDL 설정 조합 복수 개의 DDL 룰에 대한 설정 시 아래와 같은 형태로 명시한다.

  • OBJECT 동기화 DDL 동기화의 경우 INCLUDE DEFAULT 사용 시 오브젝트에 대한 DDL 동기화는 수행되지 않으며, 오브젝트에 대한 DDL 동기화 수행을 원하는 경우 직접 명시해야한다

  • 스키마 미명시 DDL 구문의 동기화 제한 DDL 구문에서 대상 객체의 스키마(Schema) 가 명시되지 않은 경우, 해당 구문은 동기화가 수행되지 않는다. 따라서 스키마를 명시한 형태의 DDL 구문으로 작성해야만 동기화가 가능하다.

    예시

  • SYS 스키마 DDL 동기화 제약사항 스키마가 SYS인 경우, 해당 스키마를 대상으로 수행되는 모든 DDL은 동기화 시 Skip 처리된다.

  • 스키마 비종속 객체(Non-Schema Object) 동기화 제약사항

    TABLESPACE, DIRECTORY, DATABASE LINK, ROLE, LIBRARY 객체는 특정 스키마에 종속되지 않는 객체로, DDL 동기화 시 INCLUDE ALL 옵션이 설정된 경우에만 동기화를 지원한다. INCLUDE DEFAULT인 경우 동기화를 지원하지 않는다.

  • Password 포함 DDL 동기화 제약사항

    CREATE ROLE, ALTER ROLE, CREATE PUBLIC DATABASE LINK 등 비밀번호 정보가 포함될 수 있는 DDL 문장은 비밀번호를 명시하지 않는 경우에만 DDL 동기화를 지원한다.

  • [SET]

    INCLUDE 또는 EXCLUDE를 명시할 수 있다.

    • INCLUDE: 기술된 규칙에 대해 동기화한다.

    • EXCLUDE: 기술된 규칙에 대해 동기화하지 않는다. 어떠한 INCLUDE보다 EXCLUDE를 우선시한다.

    [RANGE]

    ALL 또는 DEFAULT 중 하나를 명시하거나, DB의 오브젝트 이름을 직접 명시할 수 있다.

    • ALL: 모든 스키마, 테이블에 대해 적용된다.

    • DEFAULT: 모든 동기화 대상 테이블에 대해 적용된다.

    • 오브젝트 이름을 직접 명시: 대상에 대해 적용된다.

    TYPE

    TYPE은 하나 이상의 DDL OPERATION과 DDL OBJECT 쌍으로 구성된다. 지정되어 있지 않는 경우, Wildcard로 처리한다.

    [DDL OPERATION]

    Rule에 적용할 DDL 종류를 명시한다.

    [DDL OBJECT]

    Rule에 적용할 DDL 종류에 대한 대상을 명시한다.

    CREATE

    ALTER

    DROP

    COMMENT ON

    TABLE

    INDEX

    TRIGGER

    SEQUENCE

    VIEW

    FUNCTION

    PACKAGE

    PACKAGE BODY

    PROCEDURE

    SYNONYM

    PUBLIC SYNONYM

    TRUNCATE

    TABLE

    CREATE

    TABLE

    INDEX

    TRIGGER

    SEQUENCE

    VIEW

    MVIEW

    FUNCTION

    PACKAGE

    PACKAGE BODY

    PROCEDURE SYNONYM

    PUBLIC SYNONYM TABLESPACE DIRECTORY MLOG

    ROLE (⚠ Password 포함 DDL 동기화 제약사항 참조)

    PUBLIC DATABASE LINK (⚠ Password 포함 DDL 동기화 제약사항 참조)

    LIBRARY TYPE TYPEBODY

    ALTER

    TABLE

    INDEX

    TRIGGER

    SEQUENCE

    VIEW

    MVIEW

    FUNCTION

    PACKAGE

    PACKAGE BODY

    PROCEDURE SYNONYM

    PUBLIC SYNONYM TABLESPACE DIRECTORY MLOG

    ROLE (⚠ Password 포함 DDL 동기화 제약사항 참조) TYPE TYPEBODY

    DROP

    TABLE

    INDEX

    TRIGGER

    SEQUENCE

    VIEW

    MVIEW

    FUNCTION

    PACKAGE

    PACKAGE BODY

    PROCEDURE

    SYNONYM

    PUBLIC SYNONYM TABLESPACE DIRECTORY MLOG

    ROLE

    DATABASE LINK

    PUBLIC DATABASE LINK LIBRARY TYPE TYPEBODY

    COMMENT ON

    DDL=([SET] [RANGE], TYPE=('[DDL OPERATION] [DDL OBJECT]', ...)
                    [SET] [RANGE], TYPE=('[DDL OPERATION] [DDL OBJECT]', ...) ....)
    CREATE TABLE TEST_TABLE2 (
        c1 NUMBER,
        CONSTRAINT fk_test FOREIGN KEY (c1) REFERENCES [스키마명].TEST_TABLE1 (c1)
    );
    DDL=(
        INCLUDE ALL, TYPE=('%')
        EXCLUDE EXCLUDED_USR.%, TYPE=('%')
    )
    DDL=(
        INCLUDE DEFAULT, TYPE=('% TABLE')
        INCLUDE INCLUDED_USR.%, TYPE=('% INDEX')
        EXCLUDE EXCLUDED_USR.IDX1, TYPE=('% INDEX')
    )
    DDL=(
        INCLUDE SRCUSR.%, TYPE=('DROP TABLE', 'ALTER TABLE', 'TRUNCATE TABLE')
        EXCLUDE SRCUSR.T1, TYPE=('DROP TABLE', 'CREATE TABLE')
    )

    MAP Rule

    테이블, 컬럼 매핑 기능을 사용하기 위한

    테이블, 컬럼 매핑 기능을 사용하기 위해서는 $PRS_HOME/config 디렉터리의 Apply config file인 '[INST_ID]_apply1.cfg'를 설정한다.

    다음은 설정해야 할 파라미터에 대한 설명이다.

    기본 MAP 파라미터에 Source DB의 특정 테이블을 Target DB의 특정 테이블로 동기화하기 위한 규칙을 설정한다.

    MAP=([SYNC OPTION] SOURCE_USER.SOURCE_TABLE [SOURCE_COLUMNS]
         [COLUMN FILTERING OPTION],
         [TARGET_DATABASE.]TARGET_USER.TARGET_TABLE [TARGET_COLUMNS]
         [RESOLVE OPTION] [SKIP OPTION]))
    인자
    설명
    circle-exclamation

    주의

    다음 키워드는 MAP Rule 의 예약어이므로 table 등 대상을 명시하는 용도로 사용 불가하다.

    "ALL" "BY" "DEFAULT" "EXCEPT FOR" "EXCLUDE" "FILTER" "INCLUDE" "MAX" "MIN" "RESOLVE" "SOURCE" "SKIP" "SYNC" "TABLE" "TARGET" "TYPE" "OBJECT" "INSERT" "DELETE" "UPDATE"

    hashtag
    동기화 대상 반영 기능 사용

    다음은 MAP 파라미터를 이용해서 동기화 대상 반영 기능을 사용하는 방법에 대한 예제이다.

    hashtag
    서로 다른 오너 / 다른 이름을 가진 테이블 동기화

    다음은 Source DB의 PROSYNC1 사용자의 T1 테이블을 Target DB의 PROSYNC2 사용자의 T2 테이블로 동기화하는 예제이다.

    hashtag
    테이블의 특정 컬럼들만 동기화

    다음은 Source DB의 PROSYNC1 사용자의 T1 테이블에 컬럼 C1, C2, C3가 있고, 이중 C1와 C2 컬럼만 Target DB의 PROSYNC2 사용자의 T2 테이블의 C1, C2 컬럼과 동기화하는 예제이다.

    hashtag
    테이블간 컬럼 이름을 다르게 동기화

    다음은 Source DB의 PROSYNC1 사용자의 T1 테이블에 컬럼 C1, C2, C3가 있고, 이중 C1와 C2 컬럼만 Target DB의 PROSYNC2 사용자의 T2 테이블의 D1, D2 컬럼과 동기화하는 예제이다.

    hashtag


    hashtag
    SYNC OPTION

    동기화 테이블 사용여부를 설정한다.

    hashtag
    TABLE

    동기화 테이블을 지정하는 경우 SYNC OPTION에 TABLE을 설정한다.

    hashtag
    OBJECT

    동기화 대상이 아닌 오브젝트의 DDL 매핑을 지정하는 경우 SYNC OPTION에 OBJECT를 설정한다.

    동기화 대상 테이블에 대해서는 앞서 설명한 TABLE 규칙을 따라 DDL 매핑이 지원되며, TABLE 규칙이 명시되지 않은 경우 매핑 없이 동기화된다. 동기화 대상으로 설정할 수 없는 INDEX 등의 OBJECT나 동기화 대상이 아닌 테이블에 대해서만 해당 규칙으로 설정할 수 있다. OBJECT 규칙에 대해서는 반드시 위의 형태로만 사용 가능하다. OBJECT_NAME에 와일드 카드로 '%'를 입력할 수 있다. 이 경우 [SOURCE_USER]의 임의의 OBJECT [SOURCE_USER].[OBJECT_NAME]을 [TARGET_USER].[OBJECT_NAME]에 DDL 매핑하여 DDL을 동기화한다.

    circle-exclamation

    주의

    DB 버전, 비표준 쿼리 등으로 인해 DDL의 OBJECT의 인식이 불가능할 수 있다. 따라서 MAP 파라미터를 사용해서 DDL 매핑을 할 때 TABLE과 OBJECT에 schema를 명시하는 것을 권장한다.

    또한, 동기화 테이블 T1에 대해 DROP TABLE T1 실행 후 CREATE TABLE T1를 실행할 때 T1은 OBJECT로써 매핑될 것이고, 생성될 컬럼은 동기화 테이블 컬럼 MAP 파라미터에 영향을 받지 않는다.

    hashtag
    EXCLUDE

    동기화를 제외할 테이블을 지정하는 경우 SYNC OPTION에 EXCLUDE를 설정한다.

    hashtag
    예제

    Source DB의 PROSYNC 사용자의 SKIP 테이블을 제외하고 동기화 할 때 다음과 같이 '[INST_ID]_apply1.cfg'의 MAP 파라미터를 설정한다.

    hashtag


    hashtag
    COLUMN FILTERING OPTION

    COLUMN FILTERING OPTION을 사용하여 일부 컬럼에 대한 동기화를 제거할 수 있다. 다만 Constraint가 걸려있는 컬럼에 대해서는 해당 옵션을 사용할 수 없다.

    다음과 같이 COLUMN FILTERING OPTION을 사용할 수 있다.

    hashtag
    예제

    Source DB의 PROSYNC1 사용자의 T1 테이블에 컬럼 C1, C2, C3가 있고, 이중 C1 컬럼만 제외하고 Target DB의 PROSYNC2 사용자의 T2 테이블의 C2, C3 컬럼과 동기화할 경우 다음과 같이 '[INST_ID]_apply1.cfg'의 MAP 파라미터를 설정한다.

    hashtag


    hashtag
    RESOLVE OPTION (Data Conflict Rule, DCR)

    동기화 시 충돌 상황에서 Source DB에 정합성 기준을 맞출 지, Target DB에 정합성 기준을 맞출 지, 아니면 특정 컬럼의 Min 혹은 Max 값 기준으로 데이터 정합성을 맞출 지를 결정하는 옵션이다. 필수 옵션은 아니며 주로 양방향 동기화에 사용된다.

    정해진 Rule에 따라 DML 들이 변경되거나 생략 된다.

    circle-info

    참고

    보다 상세한 사항은 을 참고한다.

    hashtag
    RESOLVE_RULE

    다음은 RESOLVE OPTION에 설정할 수 있는 RESOLVE_RULE의 종류이다.

    RESOLVE_RULE
    설명

    MAX와 MIN RESOLVE_RULE의 경우에는 반드시 DEFAULT OPTION을 설정해야 한다. 컬럼 값이 null인 경우에 설정한 DEFAULT 값으로 비교한다. 단, 동기화는 설정한 DEFAULT 값이 아니라 실제 컬럼 값으로 수행한다.

    hashtag
    예제

    UPDATE을 동기화하는 경우 MIN, MAX Rule을 사용한다면 비교 대상 컬럼의 변경 유무에 따라 다르게 비교를 수행한다. 비교 대상 컬럼이 변경되었다면 변경된 값, 변경되지 않았다면 기존 값으로 Target DB의 row와 비교를 진행한다. 비교 대상 컬럼이 NULL인 상태에서 UPDATE가 발생하는 경우 비교가 불가능하기 때문에 비교 없이 Source DB 값을 우선으로 DML을 수행한다.

    예를 들어 DB1과 DB2간의 양방향 동기화하는 경우 DB1의 PROSYNC 사용자의 T1 테이블을 DB2의 PROSYNC 사용자의 T1 테이블로 동기화하고, column c3의 값이 더 큰 값을 우선하고자 하는 경우 마지막으로 INSERT할 때 DCR 컬럼인 c3에 null이 들어가는 경우 10으로 비교할 경우 다음과 같이 설정한다.

    circle-info

    참고

    RESOLVE OPTION이 정상 작동하기 위해서는 설정할 Source와 Target 테이블에 primary key가 필요하다.

    MIN, MAX 룰을 사용하는 경우 비교 대상 컬럼에 NULL이 들어가는 경우에 대비 사용될 DEFAULT OPTION을 반드시 사용해야 한다.

    hashtag


    hashtag
    SKIP OPTION

    SKIP OPTION에는 동기화하지 않길 원하는 row들을 특정하기 위한 조건을 설정한다.

    hashtag
    지원 컬럼 타입

    Database
    Supported Column Types

    hashtag
    지원 비교 조건

    SKIP OPTION은 다음과 같이 설정한다. SKIP_CONDITION이 True인 Row들은 동기화하지 않는다.

    hashtag
    예제

    Source DB의 PROSYNC 사용자의 T1 테이블을 Target DB의 PROSYNC 사용자의 T1 테이블로 동기화하고, column c1의 값이 'example'이 아니면 DML을 skip할 경우 다음과 같이 MAP 파라미터를 설정한다.

    위의 조건에 추가로 Source DB의 PROSYNC 사용자의 T2 테이블을 Target DB의 PROSYNC 사용자의 T2 테이블로 동기화하고, column c2의 값이 'example2'이면 DML을 skip할 경우 다음과 같이 MAP 파라미터를 설정한다.

    circle-info

    참고

    SKIP RULE를 사용할 때 UPDATE의 경우에서는 SET 절에 있는 값을 기준으로 skip을 할 것인지, 아니면 WHERE 절의 값을 기준으로 skip을 할 것인지 설정할 수 있다.

    Apply Process Parameter 중에서 MAP_SKIP_UPD_WHERE의 값이 N 일 때 먼저 SET 절에 기준 컬럼이 있는지 확인 후 있으면 SET 절의 값을 기반으로, 없으면 WHERE 절에 있는 기준 컬럼의 값을 기반으로 skip한다. 해당 파라미터가 Y인 경우에는 무조건 WHERE에 있는 기준 컬럼의 값을 기반으로 Skip한다.

    SKIP OPTION은 단방향 동기화에서만 지원한다. 양방향의 경우 정합성 문제로 지원하지 않는다.

    hashtag

    Agent Parameters

    hashtag
    CONN_MAX

    CONN_MAX specifies the max number of connections between processes.

    hashtag
    Parameter Format

    TARGET_DATABASE

    동기화시킬 Target DB의 데이터베이스 이름을 설정한다.

    TARGET_USER

    동기화시킬 Target DB 테이블의 사용자 이름을 설정한다.

    TARGET_TABLE

    동기화시킬 Target DB 테이블의 테이블 이름을 설정한다. 인자에 대한 자세한 내용은 각 절의 설명을 참고한다.

    RESOLVE OPTION

    동기화시킬 Target DB 테이블의 테이블 중 DCR Rule를 적용할 테이블의 이름을 설정한다. 인자에 대한 자세한 내용은 각 절의 설명을 참고한다.

    SKIP OPTION

    동기화 할 때 동기화를 하지 않을 row의 조건을 설정한다.

    TARGET_COLUMNS

    동기화시킬 Target DB 테이블의 컬럼들을 설정한다. SOURCE_COLUMNS와 순서대로 매핑되고 컬럼 개수는 일치해야 한다. (Column1, Column2, Column3)과 같은 방식으로 설정한다.

    해당 컬럼의 값이 더 작은 Row를 우선으로 한다.

    반드시 DEFAULT OPTION을 설정해야 한다.

    SYNC OPTION

    TABLE : 동기화 할 테이블을 지정하는 경우 설정한다. OBJECT : 동기화 대상이 아닌 오브젝트의 DDL 매핑을 지정하는 경우 설정한다. EXCLUDE : 동기화를 제외할 테이블을 지정하는 경우 설정한다.

    SOURCE_USER

    동기화 할 Source DB 테이블의 사용자 이름을 설정한다.

    SOURCE_TABLE

    동기화 할 Source DB 테이블의 테이블 이름을 설정한다.

    SOURCE_COLUMNS

    동기화 할 Source DB 테이블의 컬럼들을 설정한다. (Column1, Column2, Column3)과 같은 방식으로 설정한다.

    COLUMN FILTERING OPTION

    동기화하지 않을 Source DB 테이블의 컬럼들을 설정한다.

    SOURCE

    Source 테이블의 Row를 우선으로 한다.

    TARGET

    Target 테이블의 Row를 우선으로 한다.

    MAX(COLUMN_NAME)

    해당 컬럼의 값이 더 큰 Row를 우선으로 한다.

    반드시 DEFAULT OPTION을 설정해야 한다.

    TIBERO

    CHAR, VARCHAR, NUMBER, TIME, DATE, TIMESTAMP

    ORACLE

    CHAR, VARCHAR, NUMBER

    POSTGRESQL

    CHAR, VARCHAR, NUMBER

    CHAR, VARCHAR

    EQUAL (=), NOT_EQUAL (!=)

    NUMBER, TIME, DATE, TIMESTAMP

    EQUAL (=), NOT_EQUAL (!=), INEQUALITY (<, <=, >, >=)

    Flow Control

    MIN(COLUMN_NAME)

    MAP=(TABLE PROSYNC1.T1, PROSYNC2.T2)
    MAP=(TABLE PROSYNC1.T1(C1, C2), PROSYNC2.T2)
    MAP=(TABLE PROSYNC1.T1(C1, C2), PROSYNC2.T2(D1, D2))
    MAP=(TABLE [SOURCE_USER].[SOURCE_TABLE]... )
    MAP=(OBJECT [SOURCE_USER].[OBJECT_NAME], [TARGET_USER].[OBJECT_NAME])
    MAP=(EXCLUDE [SOURCE_USER].[SOURCE_TABLE]...)
    MAP=(TABLE DEFAULT EXCLUDE PROSYNC.SKIP TABLE TIBERO.T1)
    MAP=(... EXCEPT FOR ([COLUMN_NAME], ..., [COLUMN_NAME])...)
    MAP=(TABLE PROSYNC1.T1 EXCEPT FOR (C1), PROSYNC2.T2)
    MAP=(... RESOLVE BY [RESOLVE_RULE] ...)
    MAP=(... RESOLVE BY MAX(COLUMN_NAME) DEFAULT (COLUMN_VALUE) ...)
    MAP=(TABLE PROSYNC.T1, PROSYNC.T1 RESOLVE BY MAX(c3) DEFAULT (10))
    MAP=(... SKIP=(SKIP_CONDITION))
    MAP=(TABLE PROSYNC.T1, PROSYNC.T1 SKIP=(c1!="example"))
    MAP=(TABLE PROSYNC.T1, PROSYNC.T1 SKIP=(c1!="example")
        TABLE PROSYNC.T2, PROSYNC.T2 SKIP=(c2="example2"))
    Property
    Description

    Parameter type

    Integer

    Default Value

    128

    Class

    Optional, Static

    Range

    32 - 1024

    hashtag
    LISTENER_PORT

    LISTENER_PORT specifies the port number used by each process. All processes on the same machine must use different ports.

    hashtag
    Parameter Format

    Property
    Description

    Parameter type

    Integer

    Default Value

    7600

    Class

    Optional, Static

    hashtag
    LOG_BACKUP_DIR

    LOG_BACKUP_DIR specifies the directory where the ProSync log files are backed up. It must be specified as an absolute path.

    hashtag
    Parameter Format

    Property
    Description

    Parameter type

    path

    Default Value

    ""

    Class

    Mandatory, Static

    hashtag
    LOG_BACKUP_SIZE

    LOG_BACKUP_SIZE specifies the maximum size of all backup files in the process. If this limit is exceeded, the oldest log files in the directory are deleted.

    hashtag
    Parameter Format

    Property
    Description

    Parameter type

    Integer

    Default Value

    0

    Class

    Optional, Dynamic

    hashtag
    LOG_DIR

    LOG_DIR specifies the directory where the ProSync log files are stored. It must be specified as an absolute path.

    hashtag
    Parameter Format

    Property
    Description

    Parameter type

    path

    Default Value

    ""

    Class

    Mandatory, Static

    hashtag
    LOG_FILE_SIZE

    LOG_FILE_SIZE specifies the maximum log file size. If a log file exceeds this limit, it is moved to the backup directory and a new log file is created.

    hashtag
    Parameter Format

    Property
    Description

    Parameter type

    Integer

    Default Value

    104857600

    Class

    Optional, Dynamic

    hashtag
    LOG_LEVEL

    LOG_LEVEL specifies the log level of the process. A higher log-level produces more detailed logs.

    hashtag
    Parameter Format

    Property
    Description

    Parameter type

    Integer

    Default Value

    3

    Class

    Mandatory, Dynamic

    hashtag
    PRS_AGENT_CM_PROBE_TIMEOUT

    cm probe timeout. when it's 0, indefinitely wait returns from cm. works only when USE_CM=Y

    hashtag
    Parameter Format

    Property
    Description

    Parameter type

    Integer

    Default Value

    0

    Class

    Optional, Static

    hashtag
    PRS_AGENT_PROC_CHECK_INTERVAL

    time interval to check whether child process is dead or not.

    hashtag
    Parameter Format

    Property
    Description

    Parameter type

    Integer

    Default Value

    1

    Class

    Optional, Static

    hashtag
    PRS_AGENT_PROC_MAX_FAIL_CNT

    maximum fail count to calibrate process status internally. works only when USE_CM=Y

    hashtag
    Parameter Format

    Property
    Description

    Parameter type

    Integer

    Default Value

    5

    Class

    Optional, Static

    hashtag
    PRS_AGENT_PROC_STARTUP_TIMEOUT

    startup timeout seconds, [startup request to wthr - logon recv]. works only when USE_CM=Y

    hashtag
    Parameter Format

    Property
    Description

    Parameter type

    Integer

    Default Value

    10

    Class

    Optional, Static

    hashtag
    PRS_AGENT_PROC_STATUS_INTERVAL

    proc status check interval. works only when USE_CM=Y

    hashtag
    Parameter Format

    Property
    Description

    Parameter type

    Integer

    Default Value

    3

    Class

    Optional, Static

    hashtag
    PRS_AGENT_PROC_STATUS_REPLY_TIMEOUT

    read idle timeout seconds, for status reply. works only when USE_CM=Y

    hashtag
    Parameter Format

    Property
    Description

    Parameter type

    Integer

    Default Value

    10

    Class

    Optional, Static

    hashtag
    PRS_AGENT_TIME_INTERVAL

    time interval to get statistic information. agent sends info req msg to ext and apply.

    hashtag
    Parameter Format

    Property
    Description

    Parameter type

    Integer

    Default Value

    60

    Class

    Optional, Static

    hashtag
    REPO_RESOURCE_INSERT_INTERVAL

    This parameter decides how often to insert resource data into repoDB.

    hashtag
    Parameter Format

    Property
    Description

    Parameter type

    Integer

    Default Value

    60

    Class

    Optional, Static

    hashtag
    USE_CM

    USE_CM specifiese whether use cm management for failover or not.

    hashtag
    Parameter Format

    Property
    Description

    Parameter type

    Boolean

    Default Value

    N

    Class

    Optional, Static

    hashtag

    Range

    1024 - 65535

    Range

    Range

    0 - 128G

    Range

    Range

    1M - 1G

    Range

    1 - 5

    Range

    0 - PRS_AGENT_CM_PROBE_TIMEOUT < PRS_AGENT_PROC_STATUS_INTERVAL

    Range

    1 - 3600

    Range

    1 - 3600

    Range

    5 - 256

    Range

    2 - 256

    Range

    6 - 256

    Range

    1 - 3600

    Range

    60 - 3600

    Range

    prosync, 프로싱크 Llob 프로세스

    Sequential Access Method (SAM)

    ProSync는 동기화 과정 중에 전달하는 세그먼트를 파일에 순차적으로 기록할 수 있다. APPLY 프로세스에서 Target DB에 반영하는 STATEMENT 를 파일에 저장할 수 있는데, 이를 SAM 기능이라고 한다.

    다음은 SAM 기능을 지원하는 데이터 타입이다.

    구분
    지원 타입

    Tibero

    NUMBER, CHAR, VARCHAR, DATE, TIME, TIMESTAMP, INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND, CLOB, TIMESTAMP WITH TIMEZONE, TIMESTAMP WITH LOCAL TIMEZONE, BINARY_FLOAT, BINARY_DOUBLE

    Oracle

    hashtag

    hashtag
    SAM 기능에 사용되는 Parameters

    [INST_ID]_apply1.cfg 파일에 다음의 파라미터를 설정해야 한다.

    hashtag
    Parameters 설명

    Parameter
    설명
    circle-exclamation

    주의

    SAM_BIND_VALUE 를 사용하여 SAM 파일에 Query의 value 값을 저장할 시, 동기화를 진행중인 table의 column 유형에 따라 SAM 파일의 과도한 용량 증가를 주의해야 한다.

    hashtag
    SAM FILE TEMPLATE 설정

    본 절에서는 TX_SAM_TEMPLATE, STMT_SAM_TEMPLATE, COL_SAM_TEMPLATE 파라미터에서 사용할 템플릿을 설정하는 방법에 대해 서술한다.

    템플릿 구성요소는 '% + 알파벳 하나(대소문자 구분)"으로 구성하며, 이렇게 구성된 표현값을 치환하여 Sam File에 출력한다.

    hashtag
    TX_SAM_TEMPLATE

    항목
    표현값
    의미

    hashtag
    STMT_SAM_TEMPLATE, COL_SAM_TEMPLATE

    hashtag
    STMT_SAM_TEMPLATE

    항목
    표현값
    설명

    hashtag
    COL_SAM_TEMPLATE

    항목
    표현값
    설명

    hashtag

    SAM_FILE_SIZE

    프로세스별 SAM 파일의 최대 크기를 설정한다.

    SAM 파일의 크기가 SAM_FILE_SIZE를 넘으면 SAM_BACKUP_DIR로 옮긴 후 새로운 SAM 파일을 생성한다. (기본값: 100MB, 범위: 1MB ~ 1GB)

    SAM_BACKUP_DIR

    SAM 파일의 백업 파일이 저장되는 디렉터리 위치를 설정한다.

    SAM_BACKUP_SIZE

    SAM_BACKUP_SIZE는 SAM_BACKUP_DIR에 백업되는 SAM 파일들의 최대 크기를 설정한다. (기본값: 0 (제한없음), 범위: 0 ~ 128GB)

    SQL_REDO_MODE

    SQL_REDO_MODE 파라미터는 Sam File에 적히는 내용을 full dml/ddl로 적어주는 기능이다. (Y|N)

    • Y : sam file에 row by row로 DML이 남게 된다. (기본값)

    • N : sam file에 row by row로 DML이 남지 않는다.

    TX_SAM_TEMPLATE

    TX_SAM_TEMPLATE 파라미터는 트랜잭션을 Sam File에 출력할 때 사용할 user_defined_template 파일의 경로를 설정하는 파라미터이다. SQL_REDO_MODE가 N인 경우에 동작한다.

    ProSync는 트랜잭션이 commit을 만날 때마다 본 파라미터 경로에 있는 템플릿을 읽어 해당 템플릿 형식대로 sam file에 트랜잭션 내용을 남긴다.

    STMT_SAM_TEMPLATE

    STMT_SAM_TEMPLATE 파라미터는 statement(dml/ddl) 내용을 Sam File에 남겨줄 때 사용할 user_defined_template 파일의 경로를 설정하는 파라미터이다. SQL_REDO_MODE가 N인 경우에 동작한다.

    ProSync는 DDL과 DML 내용을 Sam File에 남겨줄 때 본 파라미터 경로에 있는 템플릿을 읽어 해당 템플릿 형식대로 sam file에 DDL, DML 내용을 남긴다.

    COL_SAM_TEMPLATE

    COL_SAM_TEMPLATE 파라미터는 DML을 출력할 때 컬럼 내용을 남길 때 사용할 user_defined_template 파일의 경로를 설정하는 파라미터이다. SQL_REDO_MODE가 N인 경우에 동작한다.

    ProSync는 DML을 파일에 남겨줄 때 COL_SAM_TEMPLATE에 컬럼에 대한 정의가 되어 있다면 해당 템플릿 형식대로 sam file에 컬럼 정보를 남긴다.

    %T

    트랜잭션의 commit tsn

    %W

    statement의 user name

    name

    %N

    statement의 table name

    sgmt id

    %I

    해당 object의 segment id

    tsn

    %T

    statement가 실행된 tsn

    wrap no

    %R

    statement의 wrap number

    log seq

    %L

    statement가 기록된 log sequence number

    set

    %s

    update 구문의 set 절에 대한 내용 (insert와 delete의 경우 empty string으로 치환)

    where

    %w

    update, delete 구문의 where 절에 대한 내용 (insert의 경우 empty string으로 치환)

    values

    %v

    insert 구문의 values 절에 대한 내용 (update, delete의 경우 empty string으로 치환)

    ddl/dml string

    %D

    statement의 full dml/ddl string

    %n

    column count

    NUMBER, CHAR, VARCHAR, DATE, TIME, TIMESTAMP, INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND, CLOB

    PostgreSQL

    SMALLINT, INTEGER, BIGINT, NUMERIC, DECIMAL, REAL, DOUBLE PRECISION, CHARACTER, CHARACTER VARYING, DATE, TIMESTAMP WITHOUT TIMEZONE

    APPLY_TO_SAM

    APPLY 프로세스에서 DB로 반영하는 STATEMENT를 SAM 파일로 남길지 여부를 설정한다. (Y/N)

    SAM_BIND_VALUE

    SAM 파일에 남겨지는 Query 의 Value 값 저장 여부를 설정한다. (Y/N)

    • Y : Value 값을 저장한다. (기본값)

    • N : Value 값을 '?' 로 치환한다.

    SAM_LOG_PREFIX

    해당 Query가 수행된 시간과 스레드 데이터 정보를 SAM 파일 row의 시작 부분에 붙이는 기능이다. (Y|N)

    • Y : 해당 정보를 row의 시작 부분에 첨부한다. (기본값)

    • N : 해당 정보를 남기지 않는다.

    SAM_DIR

    xid

    %X

    트랜잭션의 xid

    statement count

    %C

    트랜잭션의 statement(dml) 개수, ext sam에서는 출력하지 않는다.

    op(string)

    %O

    dml : INSERT, UPDATE, DELETE, ddl : DDL

    op code

    %o

    insert, update, delete, ddl에 대한 opcode

    column name

    %N

    column 이름

    column value

    %V

    column 값

    프로세스의 SAM 파일이 저장되는 디렉터리 위치를 나타낸다.

    commit tsn

    owner

    column count

    APPLY_TO_SAM=[Y|N]
    SAM_BIND_VALUE=[Y|N]
    SAM_LOG_PREFIX=[Y|N]
    
    SAM_DIR=sam_dir_path
    SAM_FILE_SIZE=file_size(1M-1G)
    SAM_BACKUP_DIR=sam_backup_dir_path
    SAM_BACKUP_SIZE=file_size(0-128G)
    
    SQL_REDO_MODE=[Y|N]
    TX_SAM_TEMPLATE=tx_template_file_path
    STMT_SAM_TEMPLATE=stmt_template_file_path
    COL_SAM_TEMPLATE=col_template_file_path
    *transaction template file 설정*
    tx {
    xid: %X
    stmt count: %C
    commit tsn: %T
    }
    
    *EXT SAM FILE 출력 예제*
    tx {
    xid: 655403
    stmt count:
    commit tsn: 26362351
    }
    
    *APPLY SAM FILE 출력 예제*
    tx {
    xid: 655403
    stmt count: 100
    commit tsn: 26362351
    }
    *statement template file 설정*
    stmt {
        op: %O
        op code: %o
        owner: %W
        table name: %N
        sgmt id: %I
        tsn: %T
        wrap no: %R
        log seq: %L
        set: %s
        where: %w
        values: %v
        ddl/dml string: %D
    }
    
    *column template file 설정*
    col {
        name: %N
        values: %V
        column count: %n
    }
    
    *INSERT STATEMENT 결과 예제*
    INSERT)
    stmt {
        op:INSERT
        op code:0
        owner:PRS_TEST
        table name:VARCHAR_T
        sgmt id:26424
        tsn:26362394
        wrap no:43
        log seq:2102
        set:
        where:
        values:
            col {
                name:C1
                values:1
                column count:0
            }
            col {
                name:VCHAR_COL
                values:VARCHAR
                column count:1
            }
        ddl/dml string:INSERT INTO "PRS_TEST"."VARCHAR_T" ("C1", "VCHAR_COL") VALUES
                   (1, VARCHAR)
    }
    
    *UPDATE STATEMENT 결과 예제*
    UPDATE)
    stmt {
        op:UPDATE
        op code:2
        owner:PRS_TEST
        table name:NVARCHAR_T
        sgmt id:26436
        tsn:26362421
        wrap no:87
        log seq:2103
        set:
            col {
                name:NVCHAR_COL
                values:NVARCHAR2
                column count:1
            }
        where:
            col {
                name:C1
                values:10
                column count:0
            }
            col {
                name:NVCHAR_COL
                values:NVCHAR
                column count:1
            }
        values:
        ddl/dml string:UPDATE "PRS_TEST"."NVARCHAR_T" SET NVCHAR_COL = NVARCHAR2
                   WHERE C1 = 10 AND NVCHAR_COL = NVCHAR
    }
    
    *DELETE STATEMENT 결과 예제*
    DELETE)
    stmt {
        op:DELETE
        op code:1
        owner:PRS_TEST
        table name:NVARCHAR_T
        sgmt id:26436
        tsn:26362437
        wrap no:175
        log seq:2103
        set:
        where:
            col {
                name:C1
                values:10
                column count:0
            }
            col {
                name:NVCHAR_COL
                values:NVARCHAR2
                column count:1
            }
        values:
        ddl/dml string:DELETE FROM "PRS_TEST"."NVARCHAR_T" WHERE C1 = 10 AND
                   NVCHAR_COL = NVARCHAR2
    }
    
    *DDL STATEMENT 결과 예제*
    DDL)
    stmt {
        op:DDL
        op code:9
        owner:PRS_TEST
        table name:NVARCHAR_T
        sgmt id:
        tsn:26362654
        wrap no:332
        log seq:2103
        set:
        where:
        values:
        ddl/dml string:truncate table nvarchar_t
    }        

    LLOB Parameters

    hashtag
    CLIENT_DRIVER

    CLIENT_DRIVER specifies a path to the client library used to access a database. An absolute path must be specified. For Tibero, set a path to the libtbclnt.so file. And for Oracle, enter a path to the libclntsh.so file.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    CONN_MAX

    CONN_MAX specifies the max number of connections between processes.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    DSN_DIR

    DSN_DIR specifies the directory where the dsn file located. It must be specified as an absolute path.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    DSN_FILE

    DSN_FILE specifies name of dsn file.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    LISTENER_PORT

    LISTENER_PORT specifies the port number used by each process. All processes on the same machine must use different ports.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    LLOB_FLASHBACK_ERROR

    LLOB_FLASHBACK_ERROR specifies how to handle an error during a flashback query on a LONG/LOB column. If set to 'SKIP', the column is not synchronized; if set to 'CURRENT', the query is re-executed for the latest value.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    LLOB_THREAD_CNT

    Number of llob thread cnt when starting prosync.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    LOG_BACKUP_DIR

    LOG_BACKUP_DIR specifies the directory where the ProSync log files are backed up. It must be specified as an absolute path.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    LOG_BACKUP_SIZE

    LOG_BACKUP_SIZE specifies the maximum size of all backup files in the process. If this limit is exceeded, the oldest log files in the directory are deleted.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    LOG_DIR

    LOG_DIR specifies the directory where the ProSync log files are stored. It must be specified as an absolute path.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    LOG_FILE_SIZE

    LOG_FILE_SIZE specifies the maximum log file size. If a log file exceeds this limit, it is moved to the backup directory and a new log file is created.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    LOG_LEVEL

    LOG_LEVEL specifies the log level of the process. A higher log-level produces more detailed logs.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    OCI_DRIVER

    OCI_DRIVER specifies a path to the client library used to access a database. An absolute path must be specified. for Oracle, enter a path to the libclntsh.so file.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    ODBC_DRIVER

    ODBC_DRIVER specifies a path to the client library used to access a database. An absolute path must be specified. Set a path to the proper library file.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    PRS_PROC_AGENT_CONNECTION_TIMEOUT

    connection timeout from process to agent. if a process cannot connect to agent while this timeout, kill itself

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    PRS_PWD

    PRS_PWD specifies the database user password. If the password is encrypted, append the string '#encrypted'.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    PRS_USER

    PRS_USER specifies the database user.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    SRC_DB_IP

    SRC_DB_IP specifies the database IP Address.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    SRC_DB_NAME

    SRC_DB_NAME specifies the name(Alias) of the source database. For TIBERO, UPDB, or K-DB, use the value specified in the dsn file. For ORACLE, use the value specified in the tnsname file.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    SRC_DB_PORT

    SRC_DB_PORT specifies the database port.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    SRC_DB_TYPE

    SRC_DB_TYPE specifies the type of the source database to extract data from. Options are TIBERO, UPDB, KDB, or ORACLE.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    USE_LOGMNR

    USE_LOGMNR specifies whether to use oracle logminer or to use oracle log reader, when analyzing redo logs.

    hashtag
    Parameter Format

    Property
    Description

    hashtag

    명령어 목록

    hashtag
    ! / HOST

    ProSync Admin Utility 내에서 운영체제의 명령어를 실행한다.

    항목
    설명

    32 - 1024

    1024 - 65535

    1 - 4

    0 - 128G

    1M - 1G

    1 - 5

    0 - 86400

    Parameter type

    path

    Default Value

    ""

    Class

    Optional, Static

    Parameter type

    Integer

    Default Value

    128

    Class

    Optional, Static

    Parameter type

    path

    Default Value

    ""

    Class

    Optional, Static

    Parameter type

    String

    Default Value

    ""

    Class

    Optional, Static

    Parameter type

    Integer

    Default Value

    7600

    Class

    Optional, Static

    Parameter type

    String

    Default Value

    "CURRENT"

    Class

    Mandatory, Static

    Parameter type

    Integer

    Default Value

    1

    Class

    Optional, Static

    Parameter type

    path

    Default Value

    ""

    Class

    Mandatory, Static

    Parameter type

    Integer

    Default Value

    0

    Class

    Optional, Dynamic

    Parameter type

    path

    Default Value

    ""

    Class

    Mandatory, Static

    Parameter type

    Integer

    Default Value

    104857600

    Class

    Optional, Dynamic

    Parameter type

    Integer

    Default Value

    3

    Class

    Mandatory, Dynamic

    Parameter type

    path

    Default Value

    "/"

    Class

    Optional, Static

    Parameter type

    path

    Default Value

    "/"

    Class

    Optional, Static

    Parameter type

    Integer

    Default Value

    180

    Class

    Optional, Static

    Parameter type

    String

    Default Value

    "#encrypted"

    Class

    Mandatory, Static

    Parameter type

    String

    Default Value

    ""

    Class

    Mandatory, Static

    Parameter type

    String

    Default Value

    "localhost"

    Class

    Optional, Static

    Parameter type

    String

    Default Value

    ""

    Class

    Mandatory, Static

    Parameter type

    String

    Default Value

    "7600"

    Class

    Optional, Static

    Parameter type

    String

    Default Value

    "TIBERO"

    Class

    Mandatory, Static

    Parameter type

    Boolean

    Default Value

    N

    Class

    Optional, Static

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    운영체제의 명령어이다.

    운영체제의 명령어 없이 ! 명령어만 입력하면 운영체제의 명령 프롬프트로 나가서 운영체제의 명령어를 여러 번 입력할 수 있다.

    이때 다시 ProSync Admin Utility로 돌아오려면 EXIT 명령어를 입력한다.

    다음은 현재 디렉터리에 내에 확장자가 ext인 모든 디렉터리와 파일 목록을 출력하는 예제이다.

    hashtag


    hashtag
    @

    특정 스크립트 파일을 실행한다. 파일의 확장자가 SUFFIX 시스템 변수에 등록되어 있으면, 확장자를 생략하고 파일명을 지정할 수 있다.

    스크립트 실행 전에 SET 명령어로 설정된 시스템 변수는 실행 도중에도 유효하다. 스크립트 내에서 EXIT 또는 QUIT 명령어를 실행하면 ProSync Admin Utility가 정지한다.

    항목
    설명

    filename

    스크립트 파일의 이름이다. ProSync Admin Utility는 파일을 현재 디렉터리에서 찾는다.

    다음은 현재 디렉터리 내의 스크립트 파일을 실행하는 예제이다.

    hashtag


    hashtag
    /

    ProSync Admin Utility 내에서 히스토리 버퍼에 저장된 명령어를 재수행한다. 사용자는 지정된 숫자에 해당하는 명령어를 반복 실행할 수 있다.

    다음은 히스토리 버퍼에 저장된 'HELP' 명령어를 재수행하는 예제이다:

    hashtag


    hashtag
    ALTER

    ProSync 운영 중에 동기화 대상 테이블을 추가/제거 하거나, 기동 중인 ProSync 프로세스의 Parameter를 변경할 수 있다.

    동기화 테이블 추가/제거의 경우, 기동 전에 prs_obj_group1.list에 추가하지 못했던 테이블을 ProSync 운영 중에 동적으로 추가할 수 있다. Source DB를 오라클을 사용하고, 로그마이너를 통한 추출을 하는 경우 다음과 같은 동작을 수행해야 동적 동기화 테이블 추가가 가능하다.

    1. 소스 오라클, 타겟 티베로 동기화 대상 테이블 생성(CREATE 수행)

    2. admin> ALTER [Top_ID] ADD TABLE 수행 SUPP LOG 추가

    3. 소스 오라클 ALTER SYSTEM SWITCH LOGFILE 수행

    4. DML/DDL 동기화 확인

    Parameter 변경의 경우, 수정을 원하는 Parameter의 유형이 Dynamic 인 경우에만 변경할 수 있다.

    hashtag


    hashtag
    EXIT / QUIT

    ProSync Admin Utility를 정지한다. 현재 진행 중이던 프로세스에 영향을 전혀 주지 않고 Utility만 정지된다.

    hashtag


    hashtag
    HELP

    Admin 명령어 사용에대한 도움말을 화면에 출력한다.

    항목
    설명

    topic

    도움말을 출력할 단어를 지정한다.

    옵션을 지정하지 않으면 ProSync Admin Utility에서 사용할 수 있는 전체 명령어를 출력한다.

    다음은 SET 파라미터에 대한 도움말을 화면에 출력하는 예제이다.

    hashtag


    hashtag
    PAUSE

    사용자가 입력한 INST_ID의 작업을 멈추는 명령어이다.

    모든 프로세스가 정지하는 것이 아닌, 추출이 더 이상 데이터를 추출하지 않도록 하는 기능이다. 즉 현재 반영중인 내용이나 이미 소켓을 타고 넘어간 데이터들에 대한 반영은 이루어진다.

    항목
    설명

    inst_id

    일시 정지할 inst_id이다.

    다음은 'prosync4'의 작업을 일시정지하는 예제이다.

    hashtag


    hashtag
    RESUME

    사용자가 입력한 INST_ID의 작업을 재개하는 명령어이다.

    PAUSE 의 동작을 되돌리는 것으로, 추출이 다시 시작되는 기능으로 볼 수 있다.

    항목
    설명

    inst_id

    재시작할 inst_id이다.

    예제

    hashtag


    hashtag
    SET

    ProSync Admin Utility의 시스템 변수를 설정한다.

    SET 명령어로 설정된 시스템 변수는 SHOW 명령어를 사용하여 출력한다. 단, 변경된 시스템 변수는 현재 세션 내에서만 유효하다. 각각의 시스템 변수에 대해서는 시스템 변수 를 참고한다.

    항목
    설명

    parameter

    ProSync Admin Utility 시스템 변수의 이름이다.

    value

    ProSync Admin Utility 시스템 변수의 값이다.

    예제

    hashtag


    hashtag
    SHOW

    ProSync Admin Utility의 시스템 변수 및 각 프로세스의 파라미터를 출력한다.

    항목
    설명

    ALL

    모든 ProSync Admin Utility 시스템 변수를 출력한다.

    PARAM[ETER]

    파라미터의 값을 출력할 때 사용한다.

    instance_id

    파라미터를 확인하고자 하는 instance 의 instance_id.

    EXT[RACT] {num}

    다음은 시스템 변수를 출력하는 예제이다.

    다음은 'prosync4' 에 속한 프로세스들의 파라미터를 출력하는 예제이다.

    다음은 'agent1' 에 속한 모든파라미터를 출력하는 예제이다.

    hashtag


    hashtag
    SHUTDOWN

    사용자가 입력한 INST_ID의 프로세스 혹은 매니저 프로세스를 정지한다.

    항목
    설명

    ALL

    등록된 모든 instance를 정지한다.

    AGE[NT]

    Agent 프로세스를 정지할 때 사용한다.

    agent_id

    특정 agent_id 의 프로세스를 정지할 때 사용한다.

    inst_id

    다음은 'pro'의 프로세스를 정지하는 예제이다.

    다음은 'agent1'의 매니저 프로세스를 정지하는 예제이다.

    hashtag


    hashtag
    STARTUP

    사용자가 입력한 INST_ID의 프로세스를 실행한다.

    항목
    설명

    ALL

    등록된 모든 instance를 기동한다.

    AGE[NT]

    Agent 프로세스를 실행할 때 사용한다.

    agent_id

    특정 agent_id 의 프로세스를 실행할 때 사용한다.

    inst_id

    다음은 'agent1'의 매니저 프로세스를 실행하는 예제이다.

    다음은 'pro' instacne를 실행하는 예제이다.

    hashtag


    hashtag
    STATUS

    전체 프로세스, 사용자가 입력한 INST_ID의 프로세스 혹은 매니저 프로세스의 상태를 확인하는 명령어이다.

    항목
    설명

    inst_id

    특정 inst_id의 Ext, Apply, LONG/LOB 프로세스의 상태를 조회할 때 사용한다.

    전체 프로세스의 상태를 조회하는 경우 STATUS 명령어만 사용한다.

    다음은 모든 Instance(inst_id) 프로세스를 조회하는 예제이다.

    다음은 Instance(inst_id)가 'prosync4'인 모든 프로세스 및 스레드의 상태를 조회하는 예제이다.

    hashtag


    hashtag
    MONITOR

    Instance의 apply 프로세스가 Target DB에 반영 중인 Query의 정보를 출력한다.

    다음은 MONITOR 명령어를 통해 현재 적용 중인 쿼리를 조회하는 예제이다.

    항목
    설명

    SQL_TEXT

    Replay 스레드가 현재 적용 중인 Query

    SQL_ET

    해당 Query문을 수행 시작하고 경과된 시간

    hashtag


    hashtag
    명령어 실행 및 정지

    ProSync Admin Utility에서 주로 사용하는 기능은 명령어를 직접 입력하여 프로세스를 실행하고 정지하고 일시정지하는 것이다. ProSync Admin Utility 명령어는 실행을 위한 명령어가 따로 없으며, 입력된 명령어는 버퍼에 저장된다. ProSync Admin Utility 명령어는 입력을 마침과 동시에 실행된다.

    위의 예는 INST_ID가 prosync4인 모든 프로세스를 실행하는 명령어의 입력 및 실행 결과를 보이고 있다. INST_ID의 추출, 적용, LONG/LOB 프로세스가 각각 기동된다. 예제의 명령어를 입력하기 이전에 해당 INST_ID에 연결되어 있는 매니저 프로세스를 실행시켜야 한다.

    INST_ID를 정지하면, 매니저 프로세스를 제외한 추출, 적용, LONG/LOB 프로세스가 중단된다.

    hashtag

    ! [command]
    HO[ST] [command]

    command

    Admin> ! dir *.ext
    Admin> !
    
    Admin> HOST dir *.ext
    Admin> HOST
    @ {filename}
    Admin> @ run
    Admin> @ run.sql
    /
    Admin> HELP
    Admin> /
    #동기화 테이블 추가/제거
    ALTER inst_id {ADD|DEL[ETE]} TABLE table_owner.table_name GROUP=group_num
    
    #Parameter 변경
    ALTER inst_id {EXT|APP[LY]|LLOB} SET parameter='values'
    EXIT | Q[UIT]
    H[ELP] [topic]
    Admin> HELP SET
    PAUSE {inst_id}
    Admin> PAUSE prosync4
    prosync4 paused.
    RESUME {inst_id}
    Admin> RESUME prosync4
    prosync4 resumed.
    SET {parameter} {value}
    Admin> SET HISTORY 100
    SHO[W] ALL
    SHO[W] PARAM[ETER] instance_id {EXT[RACT] num | APP[LY] num | LLOB} [parameter_name]
    SHO[W] PARAM[ETER] AGE[NT] agent_id [parameter_name]
    Admin> SHOW ALL
    Admin> SHOW PARAM prosync4 EXT 1 LOG_LEVEL
    Admin> SHOW PARAM prosync4 APPLY 1 MAP
    Admin> SHOW PARAM prosync4 LLOB LLOB_FLASHBACK_ERROR
    Admin> SHOW PARAM AGENT agent1
    SHUTD[OWN] ALL
    SHUTD[OWN] AGE[NT] [ABORT] [agent_id]
    SHUTD[OWN] inst_id [EXT[RACT] [num] | APP[LY] [num]] [ABORT]
    Admin> SHUTDOWN pro
    *** Shutdown Process... [pro_ext1]
    	Process 'pro_ext1' aborted.
    *** Shutdown Process... [pro_apply1]
    	Process 'pro_apply1' aborted.
    *** Shutdown Process... [pro_llob]
    	Process 'pro_llob' aborted.
    Admin> SHUTDOWN AGENT agent1
    *** Shutdown Agent Process... [agent1]
    	Process 'prs_agent' aborted.
    START[UP] ALL
    START[UP] AGE[NT] agent_id
    START[UP] inst_id [EXT[RACT] [num] | APP[LY] [num]]
    Admin> STARTUP AGENT agent1
    *** Startup Agent Process... [agent1]
    	Process 'prs_agent' started.
    Admin> STARTUP pro
    *** Startup Process... [pro_ext1]
    	Process 'pro_ext1' started.
    *** Startup Process... [pro_apply1]
    	Process 'pro_apply1' started.
    *** Startup Process... [pro_llob]
    	Process 'pro_llob' started.
    STATUS
    STATUS inst_id
    Admin> STATUS
    prs_agent ID: agent1, HOST: 192.168.51.45, PORT: 7600 is running
    prs_agent ID: agent2, HOST: 192.168.51.54, PORT: 7601 is running
    prs_agent ID: agent3, HOST: 192.168.51.55, PORT: 7602 is stopped
    
    Instance ID: [prosync4]
    prosync4_ext1 (1) is running (prs_mgr ID : agent1, HOST: 192.168.51.45, PORT: 7600)
    prosync4_ext2 (2) is running (prs_mgr ID : agent1, HOST: 192.168.51.45, PORT: 7600)
    prosync4_apply1 (1) is running (prs_mgr ID : agent2, HOST: 192.168.51.54, PORT: 7601)
    prosync4_llob (1) is stopped (prs_mgr ID : agent1, HOST: 192.168.51.45, PORT: 7600)
    
    Instance ID: [prosync3]
    Agent Process for proc[Extract], num[1] is not running.
    Agent Process for proc[Extract], num[2] is not running.
    Agent Process for proc[Apply], num[1] is not running.
    Agent Process for proc[LONG/LOB], num[1] is not running.
    Agent Process for proc[Verify], num[1] is not running.
    Admin> STATUS prosync4
    prosync4_ext1 (20133) has 8 cores, started at 2020/09/09 15:44:19
      + control thread, running
      + worker thread, running
      + sam thread, recv waiting
      + read thread, recv waiting
    
    prosync4_apply1 (20154) has 8 cores, started at 2020/09/09 15:44:19
      + control thread, running
      + replay thread, recv waiting
      + construct thread, recv waiting
    
    prosync4_llob (20168) has 8 cores, started at 2020/09/09 15:44:19
      + control thread, running
      + long/lob thread, recv waiting
    
    prosync4_vf, stopped
    MON[ITOR] {inst_id}
    Thread #0
    sql_text:
    DELETE FROM "TEST"."T33" WHERE "C1" = :"C1" AND "C2" = :"C2" AND 
    "C3" = :"C3" AND "C4" = :"C4" AND "C5" = :"C5" AND "C6" = :"C6" 
    AND "C7" = :"C7" AND "C8" = :"C8" AND "C9" = :"C9" AND "C10" = 
    :"C10" AND "C11" = :"C11" AND "TIME" = :"TIME" AND ROWNUM = 1
    sql_et: 0 (ms)
    
    Thread #1
    sql_text:
    DELETE FROM "TEST"."T33" WHERE "C1" = :"C1" AND "C2" = :"C2" AND
    "C3" = :"C3" AND "C4" = :"C4" AND "C5" = :"C5" AND "C6" = :"C6"
    AND "C7" = :"C7" AND "C8" = :"C8" AND "C9" = :"C9" AND "C10" =
     :"C10" AND "C11" = :"C11" AND "TIME" = :"TIME" AND ROWNUM = 1
    sql_et: 0 (ms)
    
    Thread #2
    sql_text:
    UPDATE "TEST"."T31" SET "C2" = :"C2", "C3" = :"C3", "C9" = :"C9"
    , "C10" = :"C10", "C11" = :"C11" WHERE "C1" = :"C1" AND "C2" = :
    "C2" AND "C3" = :"C3" AND "C4" = :"C4" AND "C5" = :"C5" AND "C6"
    = :"C6" AND "C7" = :"C7" AND "C8" = :"C8" AND "C9" = :"C9" AND 
    "C10" = :"C10" AND "C11" = :"C11" AND "TIME" = :"TIME" AND ROWNUM
     = 1
    sql_et: 0 (ms)
    
    Thread #3
    sql_text:
    UPDATE "TEST"."T33" SET "C2" = :"C2", "C3" = :"C3", "C9" = :"C9"
    , "C10" = :"C10", "C11" = :"C11" WHERE "C1" = :"C1" AND "C2" = :
    "C2" AND "C3" = :"C3" AND "C4" = :"C4" AND "C5" = :"C5" AND "C6"
    = :"C6" AND "C7" = :"C7" AND "C8" = :"C8" AND "C9" = :"C9" AND "
    C10" = :"C10" AND "C11" = :"C11" AND "TIME" = :"TIME" AND ROWNUM
     = 1
    sql_et: 0 (ms)
    Admin> START AGENT agent1
    *** Startup Agent Process... [agent1]
            Process 'prs_agent' started.
    
    Admin> STARTUP prosync4
    *** Startup Process... [prosync4_ext1]
            Process 'prosync4_ext1' started.
    *** Startup Process... [prosync4_apply1]
            Process 'prosync4_apply1' started.
    *** Startup Process... [prosync4_llob]
            Process 'prosync4_llob' started.
    Admin> SHUTDOWN prosync4
    *** Shutdown Process... [prosync4_ext1]
            Process 'prosync4_ext1' aborted.
    *** Shutdown Process... [prosync4_apply1]
            Process 'prosync4_apply1' aborted.
    *** Shutdown Process... [prosync4_llob]
            Process 'prosync4_llob' aborted.

    {num} 번째 노드의 추출 프로세스에 속한 파라미터를 출력한다.

    APP[LY] {num}

    {num} 번째 노드의 적용 프로세스에 속한 파라미터를 출력한다.

    LLOB

    LONG/LOB 프로세스에 속한 파라미터를 출력한다.

    AGE[NT]

    agent 프로세스의 파라미터를 출력할 때 사용한다.

    agent_id

    파라미터를 확인하고자 하는 agent 의 agent_id.

    parameter_name

    확인하고자 하는 parameter의 이름을 입력한다. 파라미터 이름을 입력하지 않으면 해당 프로세스에 속한 모든 파라미터의 값이 출력된다.

    특정 inst_id의 프로세스를 정지할 때 사용한다.

    EXT[RACT] [num]

    [num]번째 노드의 추출 프로세스를 정지할 때 사용한다.

    APP[LY] [num]

    [num]번째 노드의 적용 프로세스를 정지할 때 사용한다.

    ABORT

    강제로 정지할 때 사용한다.

    특정 inst_id의 프로세스를 실행할 때 사용한다.

    EXT[RACT] [num]

    [num]번째 노드의 추출 프로세스를 실행할 때 사용한다.

    APP[LY] [num]

    [num]번째 노드의 적용 프로세스를 실행할 때 사용한다.

    Single to Single

    hashtag
    SRC DB와 TAR DB가 서로 같은 장비에 설치된 경우

    hashtag
    1. Agent 설치

    hashtag
    prs_install_agent.cfg 예시

    hashtag
    agent 설치 및 설치 결과 예시

    hashtag
    2. Instance 설치

    hashtag
    prs_install.cfg 설정 예시

    hashtag
    instance 설치 및 설치 결과 예시

    hashtag
    2.1 config 수정 (PostgreSQL)

    • ext

    • apply

    • llob

    hashtag
    3. Prosync 실행

    hashtag


    hashtag
    SRC DB와 TAR DB가 서로 다른 장비에 설치된 경우

    hashtag
    1. Agent 설치

    SRC DB가 설치된 장비에서 Agent를 설치한다.

    hashtag
    prs_install_agent.cfg 예시

    hashtag
    agent 설치 및 설치 결과 예시

    hashtag
    2. tbdsn.tbr 설정

    SRC DB 장비에서 TAR DB Client 접근을 위한 tbdsn.tbr 설정으로, src db 장비에서 instance를 설치하기 위해서 src db 장비에서 tar db client에 접근할 수 있어야 한다. 이를 위해 src db 장비의 tbdsn.tbr 파일에 tar db 정보를 추가해야 한다.

    hashtag
    TAR DB tbdsn.tbr 파일 예시

    hashtag
    SRC DB 장비에 TAR DB 정보를 반영한 tbdsn.tbr 예시

    hashtag
    SRC DB 장비에서 TAR DB client로 접근 가능여부 확인

    접근 확인 예시

    hashtag
    3. Instance 설치

    SRC DB가 설치된 장비에서 Instance를 설치한다.

    hashtag
    prs_install.cfg 설정 예시

    hashtag
    instance 설치 및 설치 결과 예시

    hashtag
    4. 설치 파일 및 디렉토리 이동

    TAR DB 장비 Prosync 디렉토리에 설치 파일 및 디렉토리를 옮긴다. ProSync는 SRC DB 장비에서만 설치되었기 때문에, TAR DB 장비에서도 ProSync를 기동하려면 SRC DB 장비에서 설치 후 생성된 파일 및 디렉토리를 TAR DB 장비로 복사해야 한다.

    circle-exclamation

    주의

    설치 시 생성된 설정 파일들(*.cfg)에는 SRC DB 장비 기준의 경로가 포함되어 있으므로, TAR DB 장비로 복사한 후에는 경로를 TAR DB 장비 기준으로 수정해야 한다.

    hashtag
    복사 필요한 파일 및 디렉토리

    $PRS_HOME/config

    • prs_adm.cfg

    • <instance_id>_apply1.cfg

    • prs_agent_<agent_id>.cfg

    • prs_instance.map

    $PRS_HOME/var

    hashtag
    옮긴 파일 예시

    hashtag
    5. Prosync 실행

    hashtag

    AGENT_CNT=1
    
    AGENT_ID_0=agent1
    AGENT_HOST_0=172.19.0.11
    AGENT_PORT_0=7600
    $ cd $PRS_HOME/install
    $ . prs_install_agent.sh
    ********************************************************************************
    * Agent Install Step (1/4)
    * Check System Parameters 
    ********************************************************************************
    * Checking system type... 
    Linux
    
    * Checking PRS_HOME... 
    PRS_HOME: /home/prosync/example
    
    ********************************************************************************
    * Agent Install Step (2/4)
    * Check install agent config file   [prs_install_agent.cfg]  
    * Check Instance file               [prs_instance.map] 
    ********************************************************************************
    * Checking configuration file... 
    [/home/prosync/example/install/prs_install_agent.cfg] exists.
    
    _list_create: Variable AGENT_CM_GROUP_0 is undefined or empty.
    _list_create: Variable AGENT_CM_ID_0 is undefined or empty.
    * Checking Agent configuration... 
    Usage: _list_get <list> <index>
    Usage: _list_get <list> <index>
    parameter check for Agent[0] Started 
        AGENT_ID: agent1
        AGENT_HOST: 172.19.0.11
        AGENT_PORT: 7600
    parameter check for Agent[0] Done 
    
    * Checking prs_instance.map file... 
    [/home/prosync/example/config/prs_instance.map] exists.
    
    ********************************************************************************
    * Agent Install Step (3/4)
    * Writing agent config file         [/home/prosync/example/install/prs_install_agent.cfg]  
    * Writing Instance file             [/home/prosync/example/config/prs_instance.map] 
    * Total Agent Cnt                   [1] 
    ********************************************************************************
    * Writing all agents.. cnt: 1
    Usage: _list_get <list> <index>
    Usage: _list_get <list> <index>
    * Writing Agent.. Index:           0
    * Writing Agent.. AGENT_ID:        agent1
    * Writing Agent.. AGENT_HOST:      172.19.0.11
    * Writing Agent.. AGENT_PORT:      7600
    * Writing Agent.. AGENT_CM_GROUP:  
    * Writing Agent.. AGENT_CM_ID:     
    * Writing Agent configuration... 
    /home/prosync/example/config/prs_agent_agent1.cfg not found. Writing files...
    Done.
    
    * Writing Agent information... 
    
    
    * Creating var directory...
       * Already Created.
    ********************************************************************************
    * Agent Install Step (4/4)
    * Creating files for CM
    ********************************************************************************
    Agent installation Done.
    
    ############################################
    #
    # ProSync Installation Parameters
    #
    ############################################
    
    # (Mandatory)
    INSTANCE_ID=instance
    PRS_USER=prosync_user
    PRS_PWD=prosync_user_password
    
    # (Optional)
    #PRS_TS_NAME=
    #PRS_TS_FILE=
    #PRS_TS_SIZE=
    #PRS_SKIP_USER_CREATE=N
    #PRS_TARGET_MIN_PRIVILEGE=N
    #PRS_LOG_DIR=
    #LOG_BACKUP_DIR=
    #CREATE_DSN_FILE=N
    #DSN_DIR=
    
    ############################################
    #
    # ProSync Processes Informations for Instance Map
    #
    ############################################
    ### (Optional)
    AGENT_LIST_DELIMITER=,
    
    ### (Mandatory)
    # Ext process
    ## Ext cnt must be the same as SRC_DB_CNT
    EXT_CNT=1
    EXT_AGENT_ID_LIST_0=agent1
    #EXT_AGENT_ID_LIST_1=agent1,agent2
    
    # Apply process
    APPLY_PORT=7620
    APPLY_AGENT_ID_LIST=agent1
    
    # Llob process
    LLOB_PORT=7630
    LLOB_AGENT_ID_LIST=agent1
    
    ############################################
    #
    # Source database informations
    #
    ############################################
    
    # (Mandatory)
    SRC_DB_TYPE=TIBERO
    SRC_DB_NAME=tibero
    SRC_INSTALL_USER=sys
    SRC_INSTALL_PWD=tibero
    
    # (Optional)
    #AUTO_ADD_SUPP_LOG=Y
    #SRC_SKIP_TS_CREATE=N
    
    # (Number Of Database Instances)
    #SRC_DB_CNT=1
    
    # (Dsn)
    #SRC_DB_REAL_NAME=
    #SRC_DB_IP_0=
    #SRC_DB_PORT_0=
    #SRC_DB_IP_1=
    #SRC_DB_PORT_1=
    
    # (for Cluster, only Extract Needed)
    #SRC_DB_ALIAS_0=
    #SRC_DB_ALIAS_1=
    
    # (for Oracle Logminer only)
    # Oracle 11g or less, use utl_file_dir instead of DICT_FILE_DIR
    #USE_LOGMNR=Y
    #DICT_FILE_DIR=
    
    # (for MySQL only)
    #PRS_EXT_IP=
    
    ############################################
    #
    # Target database informations
    #
    ############################################
    
    # (Mandatory)
    TAR_DB_TYPE=TIBERO
    TAR_DB_NAME=tar_tibero
    TAR_INSTALL_USER=sys
    TAR_INSTALL_PWD=tibero
    
    # (Optional)
    #TAR_SKIP_TS_CREATE=N
    
    # (Number Of Database Instances)
    #TAR_DB_CNT=1
    
    # (Dsn)
    #TAR_DB_REAL_NAME=
    #TAR_DB_IP_0=
    #TAR_DB_PORT_0=
    #TAR_DB_IP_1=
    #TAR_DB_PORT_1=
    
    # (for MySQL only)
    #PRS_APPLY_IP=
    
    # (for multi thread)
    #GROUP_NUM=1
    
    # (for TDE(transparent data encryption) synchronization)
    #USE_TDE=N
    $ cd $PRS_HOME/install
    $ . prs_install.sh
    ********************************************************************************
    * Check System Parameters (1/5)
    ********************************************************************************
    Checking system type... Linux
    Checking PRS_HOME... /home/prosync/example
    Checking TB_HOME... /home/tibero/tibero/tibero7
    Checking ORACLE_HOME... not found
    Checking psql ... available
    Checking psql service ...not found
    
    ********************************************************************************
    * Check Installation Parameters (2/5)
    ********************************************************************************
    Checking configuration file... ok
    Checking prs_instance.map file... ok
    Checking Instance Id from prs_instance.map...
    * topology information for instance was not found. It will be written in this script...
    ok
    Checking proecsses infos...
    * Checking Ext processes Informations... EXT_CNT: 1
    * Delimiter: [,]
       * Ext[0] process's Agent Id List 
           * Agent ID[agent1]
           * [agent1] found.
    * Checking Apply process Informations...
    * Checking Apply Port..
       * APPLY_PORT=[7620]
    * Checking Apply process's Agent Id List..
           * Agent ID[agent1]
           * [agent1] found.
    * Checking Llob process Informations...
    * Checking Llob Port..
       * LLOB_PORT=[7630]
    * Checking Llob process's Agent Id List..
           * Agent ID[agent1]
           * [agent1] found.
    
    Checking INSTANCE_ID... instance
    Checking PRS_USER... prosync_user
    Checking PRS_TS_NAME... instance_ts
    Checking PRS_TS_FILE... instance_ts.dtf
    Checking PRS_TS_SIZE... 1G
    Checking PRS_EXT_IP... %
    Checking PRS_APPLY_IP... %
    Checking SRC_DB_CNT... 1
    Checking SRC_DB_TYPE... TIBERO
    Checking SRC_INSTALL_USER... sys
    Checking SRC_DB_NAME... tibero
    Checking source connection(1/2)... ok
    Checking source connection(2/2)... ok
    _list_create: Variable TAR_DB_IP_0 is undefined or empty.
    _list_create: Variable TAR_DB_PORT_0 is undefined or empty.
    Checking TAR_DB_TYPE... TIBERO
    Checking TAR_INSTALL_USER... sys
    Checking TAR_DB_NAME... tar_tibero
    Checking target connection [tar_tibero](1/2)... ok
    Checking target connection [tar_tibero](2/2)... ok
    
    ********************************************************************************
    * Install to Source Database (3/5)
    ********************************************************************************
    Checking archived log mode... ok
    Usage: _list_get <list> <index>
    Checking log mining parameters [tibero]... ok
    Usage: _list_get <list> <index>
    Get Archive log directory [tibero]... ok
    Get Archive log format [tibero]... ok
    Dropping ProSync objects... ok
    Dropping ProSync tablespace... DROP TABLESPACE instance_ts INCLUDING CONTENTS AND DATAFILES;
    
    done
    
    ok
    Creating ProSync tablespace... ok
    Dropping ProSync user... ok
    Creating ProSync user... ok
    Granting privileges... ok
    Granting privileges for trigger... ok
    Creating ProSync internal tables... ok
    Creating ProSync internal package... ok
    Creating ProSync internal trigger... ok
    Prosync user prosync_user to uppercase PROSYNC_USER... ok
    Checking source object file(group num : 1)... ok
    Building source object for TEST.%... ok
    Building source object for TEST%.%... ok
    Adding table supplemental log... 6, and one for prosync
      "PROSYNC_USER"."PRS_DUMMY_TBL" : Supplemental logging set
      "TEST"."T1" : supplemental log already exists, continue.
      "TEST"."T2" : supplemental log already exists, continue.
      "TEST"."T3" : supplemental log already exists, continue.
      "TEST"."T4" : supplemental log already exists, continue.
      "TEST"."T5" : supplemental log already exists, continue.
      prosync_user.PRS_DUMMY_TBL : supplemental log already exists, continue.
    Counting total source objects... 6
    Generating initial DDL history... ok
    Checking initial DDL history... ok
    Insert default value in PRS_DUMMY_TBL...ok
    Querying NLS_CHARACTERSET... UTF8
    Querying NLS_NCHAR_CHARACTERSET... UTF16
    Switching logfile... ok
    Usage: _list_get <list> <index>
    Querying current log sequence [tibero]... 196
    Querying current snapshot#... 4463078
    
    ********************************************************************************
    * Install to Target Database (4/5)
    ********************************************************************************
    Dropping ProSync objects... ok
    Dropping ProSync tablespace... DROP TABLESPACE instance_ts INCLUDING CONTENTS AND DATAFILES;
    
    done
    
    ok
    Creating ProSync tablespace... ok
    Dropping ProSync user... ok
    Creating ProSync user... ok
    Granting privileges... ok
    Creating ProSync internal tables... ok
    Usage: _list_get <list> <index>
    Generating initial construct history [tibero (group 1)]... ok
    Generating initial commit history... ok
    
    ********************************************************************************
    * Generate Configuration Parameters (5/5)
    ********************************************************************************
    Generating Wallet... ok
    Usage: _list_get <list> <index>
    Generating Extract [tibero] configuration...  ok
    Generating Apply [tar_tibero] configuration...  ok
    Generating LONG/LOB configuration...  ok
    Generating instance map to prs_instance.map ...
    
    
    ********************************************************************************
    * ProSync is installed successfully on Mon, 21 Apr 2025 13:04:35 +0900.
    *
    *   PRS_HOME     = /home/prosync/example
    *   Binary Path  = /home/prosync/example/bin
    *   ProSync User = prosync_user
    *
    *   Archived Log Path     = /home/tibero/tibero/tibero7/database/tibero/archive/
    *   Archived Log Format   = log-t%t-r%r-s%s.arc
    *   Initial log sequence# = 196
    *
    *   Initial change# (TSN) = 4463078 
    *
    ********************************************************************************
    
    LOG_LEVEL=3
    
    PRS_USER=example
    PRS_PWD=#encrypted
    
    ...
    
    # have to set
    ODBC_DRIVER=/example/path/psqlodbcw.so
    PQ_DRIVER=/example/path/libpq.so.5
    PQ_REP_CONN_NAME=example
    LOG_LEVEL=3
    
    PRS_USER=example
    PRS_PWD=#encrypted
    
    ...
    
    # have to set
    ODBC_DRIVER=/example/path/psqlodbcw.so
    LOG_LEVEL=3
    
    PRS_USER=example
    PRS_PWD=#encrypted
    
    ...
    
    # have to set
    ODBC_DRIVER=/example/path/psqlodbcw.so
    AGENT_CNT=2
    
    AGENT_ID_0=agent1
    AGENT_HOST_0=172.19.0.11
    AGENT_PORT_0=7600
    
    AGENT_ID_1=agent2
    AGENT_HOST_1=172.19.0.12
    AGENT_PORT_1=7700
    $ cd $PRS_HOME/install
    $ . prs_install_agent.sh
    ********************************************************************************
    * Agent Install Step (1/4)
    * Check System Parameters 
    ********************************************************************************
    * Checking system type... 
    Linux
    
    * Checking PRS_HOME... 
    PRS_HOME: /home/prosync/example
    
    ********************************************************************************
    * Agent Install Step (2/4)
    * Check install agent config file   [prs_install_agent.cfg]  
    * Check Instance file               [prs_instance.map] 
    ********************************************************************************
    * Checking configuration file... 
    [/home/prosync/example/install/prs_install_agent.cfg] exists.
    
    _list_create: Variable AGENT_CM_GROUP_0 is undefined or empty.
    _list_create: Variable AGENT_CM_ID_0 is undefined or empty.
    * Checking Agent configuration... 
    Usage: _list_get <list> <index>
    Usage: _list_get <list> <index>
    parameter check for Agent[0] Started 
        AGENT_ID: agent1
        AGENT_HOST: 172.19.0.11
        AGENT_PORT: 7600
    parameter check for Agent[0] Done 
    Usage: _list_get <list> <index>
    Usage: _list_get <list> <index>
    parameter check for Agent[1] Started 
        AGENT_ID: agent2
        AGENT_HOST: 172.19.0.12
        AGENT_PORT: 7700
    parameter check for Agent[1] Done 
    
    * Checking prs_instance.map file... 
    [/home/prosync/example/config/prs_instance.map] exists.
    
    ********************************************************************************
    * Agent Install Step (3/4)
    * Writing agent config file         [/home/prosync/example/install/prs_install_agent.cfg]  
    * Writing Instance file             [/home/prosync/example/config/prs_instance.map] 
    * Total Agent Cnt                   [2] 
    ********************************************************************************
    * Writing all agents.. cnt: 2
    Usage: _list_get <list> <index>
    Usage: _list_get <list> <index>
    * Writing Agent.. Index:           0
    * Writing Agent.. AGENT_ID:        agent1
    * Writing Agent.. AGENT_HOST:      172.19.0.11
    * Writing Agent.. AGENT_PORT:      7600
    * Writing Agent.. AGENT_CM_GROUP:  
    * Writing Agent.. AGENT_CM_ID:     
    * Writing Agent configuration... 
    /home/prosync/example/config/prs_agent_agent1.cfg not found. Writing files...
    Done.
    
    * Writing Agent information... 
    
    
    Usage: _list_get <list> <index>
    Usage: _list_get <list> <index>
    * Writing Agent.. Index:           1
    * Writing Agent.. AGENT_ID:        agent2
    * Writing Agent.. AGENT_HOST:      172.19.0.12
    * Writing Agent.. AGENT_PORT:      7700
    * Writing Agent.. AGENT_CM_GROUP:  
    * Writing Agent.. AGENT_CM_ID:     
    * Writing Agent configuration... 
    /home/prosync/example/config/prs_agent_agent2.cfg not found. Writing files...
    Done.
    
    * Writing Agent information... 
    
    
    * Creating var directory...
       * Already Created.
    ********************************************************************************
    * Agent Install Step (4/4)
    * Creating files for CM
    ********************************************************************************
    Agent installation Done.
    
    #-------------------------------------------------
    # /home/tibero_tar/tibero/tibero7/client/config/tbdsn.tbr
    # Network Configuration File.
    # Generated by gen_tip_for_tac.sh at Thu Apr 17 10:51:54 UTC 2025
    tar_tibero=(
        (INSTANCE=(HOST=172.19.0.12)
    	      (PORT=8620)
                  (DB_NAME=tibero)
        )
    )
    
    #-------------------------------------------------
    # /home/tibero/tibero/tibero7/client/config/tbdsn.tbr
    # Network Configuration File.
    # Generated by gen_tip_for_tac.sh at Thu Apr 17 10:19:44 UTC 2025
    tibero=(
        (INSTANCE=(HOST=172.19.0.11)
    	      (PORT=8620)
                  (DB_NAME=tibero)
        )
    )
    
    tar_tibero=(
        (INSTANCE=(HOST=172.19.0.12)
    	      (PORT=8620)
                  (DB_NAME=tibero)
        )
    )
           
    $ tbsql sys/tibero@tar_tibero
    tbSQL 7  
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    Connected to Tibero using tar_tibero.
    
    SQL> 
    ############################################
    #
    # ProSync Installation Parameters
    #
    ############################################
    
    # (Mandatory)
    INSTANCE_ID=SINGLE2SINGLE
    PRS_USER=SINGLE2SINGLE
    PRS_PWD=SINGLE2SINGLE
    
    # (Optional)
    #PRS_TS_NAME=
    #PRS_TS_FILE=
    #PRS_TS_SIZE=
    #PRS_SKIP_USER_CREATE=N
    #PRS_TARGET_MIN_PRIVILEGE=N
    #PRS_LOG_DIR=
    #LOG_BACKUP_DIR=
    #CREATE_DSN_FILE=N
    #DSN_DIR=
    #DSN_FILE=#need DSN_DIR
    
    ############################################
    #
    # ProSync Processes Informations for Instance Map
    #
    ############################################
    ### (Optional)
    AGENT_LIST_DELIMITER=,
    
    ### (Mandatory)
    # Ext process
    ## Ext cnt must be the same as SRC_DB_CNT
    EXT_CNT=1
    EXT_AGENT_ID_LIST_0=agent1
    # EXT_AGENT_ID_LIST_1=agent2,agent1
    
    # Apply process
    APPLY_PORT=7620
    APPLY_AGENT_ID_LIST=agent2
    
    # Llob process
    LLOB_PORT=7630
    LLOB_AGENT_ID_LIST=agent1
    
    ############################################
    #
    # Source database informations
    #
    ############################################
    
    # (Mandatory)
    SRC_DB_TYPE=TIBERO
    SRC_DB_NAME=tibero
    SRC_INSTALL_USER=sys
    SRC_INSTALL_PWD=tibero
    
    # (Optional)
    #AUTO_ADD_SUPP_LOG=Y
    #SRC_SKIP_TS_CREATE=N
    
    # (Number Of Database Instances)
    # SRC_DB_CNT=1
    
    # (Dsn)
    #SRC_DB_REAL_NAME=
    #SRC_DB_IP_0=
    #SRC_DB_PORT_0=
    #SRC_DB_IP_1=
    #SRC_DB_PORT_1=
    
    # (for Cluster, only Extract Needed)
    # SRC_DB_ALIAS_0=
    # SRC_DB_ALIAS_1=
    
    # (for Oracle Logminer only)
    # Oracle 11g or less, use utl_file_dir instead of DICT_FILE_DIR
    #USE_LOGMNR=Y
    #DICT_FILE_DIR=
    
    # (for MySQL only)
    #PRS_EXT_IP=
    
    ############################################
    #
    # Target database informations
    #
    ############################################
    
    # (Mandatory)
    TAR_DB_TYPE=TIBERO
    TAR_DB_NAME=tar_tibero
    TAR_INSTALL_USER=sys
    TAR_INSTALL_PWD=tibero
    
    # (Optional)
    #TAR_SKIP_TS_CREATE=N
    
    # (Number Of Database Instances)
    # TAR_DB_CNT=1
    
    # (Dsn)
    #TAR_DB_REAL_NAME=
    #TAR_DB_IP_0=
    #TAR_DB_PORT_0=
    #TAR_DB_IP_1=
    #TAR_DB_PORT_1=
    
    # (for MySQL only)
    #PRS_APPLY_IP=
    
    # (for multi thread)
    #GROUP_NUM=1
    
    # (for TDE(transparent data encryption) synchronization)
    #USE_TDE=N
    $ cd $PRS_HOME/install
    $ . prs_install.sh
    ********************************************************************************
    * Check System Parameters (1/5)
    ********************************************************************************
    Checking system type... Linux
    Checking PRS_HOME... /home/prosync/example
    Checking TB_HOME... /home/tibero/tibero/tibero7
    Checking ORACLE_HOME... not found
    Checking psql ... available
    Checking psql service ...not found
    
    ********************************************************************************
    * Check Installation Parameters (2/5)
    ********************************************************************************
    Checking configuration file... ok
    Checking prs_instance.map file... ok
    Checking Instance Id from prs_instance.map...
    * topology information for instance was not found. It will be written in this script...
    ok
    Checking proecsses infos...
    * Checking Ext processes Informations... EXT_CNT: 1
    * Delimiter: [,]
       * Ext[0] process's Agent Id List 
           * Agent ID[agent1]
           * [agent1] found.
    * Checking Apply process Informations...
    * Checking Apply Port..
       * APPLY_PORT=[7620]
    * Checking Apply process's Agent Id List..
           * Agent ID[agent1]
           * [agent1] found.
    * Checking Llob process Informations...
    * Checking Llob Port..
       * LLOB_PORT=[7630]
    * Checking Llob process's Agent Id List..
           * Agent ID[agent1]
           * [agent1] found.
    
    Checking INSTANCE_ID... instance
    Checking PRS_USER... prosync_user
    Checking PRS_TS_NAME... instance_ts
    Checking PRS_TS_FILE... instance_ts.dtf
    Checking PRS_TS_SIZE... 1G
    Checking PRS_EXT_IP... %
    Checking PRS_APPLY_IP... %
    Checking SRC_DB_CNT... 1
    Checking SRC_DB_TYPE... TIBERO
    Checking SRC_INSTALL_USER... sys
    Checking SRC_DB_NAME... tibero
    Checking source connection(1/2)... ok
    Checking source connection(2/2)... ok
    _list_create: Variable TAR_DB_IP_0 is undefined or empty.
    _list_create: Variable TAR_DB_PORT_0 is undefined or empty.
    Checking TAR_DB_TYPE... TIBERO
    Checking TAR_INSTALL_USER... sys
    Checking TAR_DB_NAME... tar_tibero
    Checking target connection [tar_tibero](1/2)... ok
    Checking target connection [tar_tibero](2/2)... ok
    
    ********************************************************************************
    * Install to Source Database (3/5)
    ********************************************************************************
    Checking archived log mode... ok
    Usage: _list_get <list> <index>
    Checking log mining parameters [tibero]... ok
    Usage: _list_get <list> <index>
    Get Archive log directory [tibero]... ok
    Get Archive log format [tibero]... ok
    Dropping ProSync objects... ok
    Dropping ProSync tablespace... DROP TABLESPACE instance_ts INCLUDING CONTENTS AND DATAFILES;
    
    done
    
    ok
    Creating ProSync tablespace... ok
    Dropping ProSync user... ok
    Creating ProSync user... ok
    Granting privileges... ok
    Granting privileges for trigger... ok
    Creating ProSync internal tables... ok
    Creating ProSync internal package... ok
    Creating ProSync internal trigger... ok
    Prosync user prosync_user to uppercase PROSYNC_USER... ok
    Checking source object file(group num : 1)... ok
    Building source object for TEST.%... ok
    Building source object for TEST%.%... ok
    Adding table supplemental log... 6, and one for prosync
      "PROSYNC_USER"."PRS_DUMMY_TBL" : Supplemental logging set
      "TEST"."T1" : supplemental log already exists, continue.
      "TEST"."T2" : supplemental log already exists, continue.
      "TEST"."T3" : supplemental log already exists, continue.
      "TEST"."T4" : supplemental log already exists, continue.
      "TEST"."T5" : supplemental log already exists, continue.
      prosync_user.PRS_DUMMY_TBL : supplemental log already exists, continue.
    Counting total source objects... 6
    Generating initial DDL history... ok
    Checking initial DDL history... ok
    Insert default value in PRS_DUMMY_TBL...ok
    Querying NLS_CHARACTERSET... UTF8
    Querying NLS_NCHAR_CHARACTERSET... UTF16
    Switching logfile... ok
    Usage: _list_get <list> <index>
    Querying current log sequence [tibero]... 196
    Querying current snapshot#... 4463078
    
    ********************************************************************************
    * Install to Target Database (4/5)
    ********************************************************************************
    Dropping ProSync objects... ok
    Dropping ProSync tablespace... DROP TABLESPACE instance_ts INCLUDING CONTENTS AND DATAFILES;
    
    done
    
    ok
    Creating ProSync tablespace... ok
    Dropping ProSync user... ok
    Creating ProSync user... ok
    Granting privileges... ok
    Creating ProSync internal tables... ok
    Usage: _list_get <list> <index>
    Generating initial construct history [tibero (group 1)]... ok
    Generating initial commit history... ok
    
    ********************************************************************************
    * Generate Configuration Parameters (5/5)
    ********************************************************************************
    Generating Wallet... ok
    Usage: _list_get <list> <index>
    Generating Extract [tibero] configuration...  ok
    Generating Apply [tar_tibero] configuration...  ok
    Generating LONG/LOB configuration...  ok
    Generating instance map to prs_instance.map ...
    
    
    ********************************************************************************
    * ProSync is installed successfully on Mon, 21 Apr 2025 13:04:35 +0900.
    *
    *   PRS_HOME     = /home/prosync/example
    *   Binary Path  = /home/prosync/example/bin
    *   ProSync User = prosync_user
    *
    *   Archived Log Path     = /home/tibero/tibero/tibero7/database/tibero/archive/
    *   Archived Log Format   = log-t%t-r%r-s%s.arc
    *   Initial log sequence# = 196
    *
    *   Initial change# (TSN) = 4463078 
    *
    ********************************************************************************
    total 35
    drwxr-xr-x 3 tibero tibero 4096 Apr 18 02:15 ./
    drwxr-xr-x 8 tibero tibero 4096 Apr 18 02:24 ../
    -rw-r--r-- 1 tibero tibero  534 Apr 18 02:15 SINGLE2SINGLE_apply1.cfg
    -rw-r--r-- 1 tibero tibero  339 Apr 18 02:15 prs_adm.cfg
    -rw-r--r-- 1 tibero tibero  353 Apr 18 02:15 prs_agent_agent2.cfg
    -rw-r--r-- 1 tibero tibero 1262 Apr 18 02:07 prs_instance.map
    drwxr-xr-x 2 tibero tibero 4096 Apr 17 10:51 templates/
    -rw-r--r-- 1 tibero tibero    5 Feb  5 04:59 variant
    # var directory tree 예시
    .
    ├── admin
    │   └── log
    ├── agent
    │   └── agent1
    └── SINGLE2SINGLE
        ├── alloc
        ├── log
        ├── lr1
        ├── path
        └── sam
    

    CM Failover 기능 사용

    hashtag
    1. Agent 설치

    circle-info

    Prosync Process에 대한 Failover 기능을 CM 에서 사용을 할 경우 각 Node Prosync Ext Prcess 가 Failover 로 변경이 되었을 때, Source DB 의 Redo/Archive File 을 읽을 수 있는 위치에 있어야 한다.

    hashtag
    prs_install_agent.cfg 예시

    hashtag
    agent 설치 및 설치 결과 예시

    hashtag


    hashtag
    2. CM Failover 스크립트 설정

    이 스크립트 파일에는 Agent 기동을 위한 환경 변수를 설정해야 하며, 반드시 TB_HOME ,AGENT_ID 등을환경에 맞게 수정해야 한다.

    예시: $PRS_HOME/bin/prs_0.sh

    circle-info

    참고

    script 내의 source 명령어는 POSIX 표준 sh에서는 존재하지 않는다.

    만약 CM에서 해당 스크립트를 실행하는데 권한에 문제가 없는데도 127 에러가 발생한다면, /bin/sh를 /bin/bash로 변경하면 해결된다.

    hashtag


    hashtag
    3. Agent Parameter 설정

    CM Failover 기능을 사용하기 위해 prs_agent_<agent_id>.cfg 파일에 다음과 같은 파라미터를 설정한다.

    파라미터
    설명
    circle-info

    참고

    USE_CM을 Y로 설정한 경우에만 PRS_AGENT_PROC_MAX_FAIL_CNT, PRS_AGENT_PROC_STARTUP_TIMEOUT, PRS_AGENT_PROC_STATUS_REPLY_TIMEOUT, PRS_AGENT_PROC_STATUS_INTERVAL, PRS_AGENT_CM_PROBE_TIMEOUT 파라미터가 동작한다.

    hashtag
    agent config file 설정 예시

    예시 : $PRS_HOME/config/prs_agent_agent1.cfg

    hashtag


    hashtag
    4. Instance 설치

    hashtag
    prs_install.cfg 설정 예시

    hashtag
    instance 설치 및 설치 결과 예시

    hashtag


    hashtag
    5. CM 설정

    hashtag
    5.1. tibero 기동 종료

    hashtag
    5.2. cm 기동 종료

    hashtag
    5.3. cm tip file에 cm_id 추가

    $TB_HOME/config 예시

    <$CM_SID>.tip file들을 열어 맨 윗줄에 CM_ID를 추가해준다. CM_ID는 agent 설치 시 prs_install_agent.cfg에 작성한 내용을 기반으로 추가한다.

    cm_tibero1.tip 예시

    hashtag
    5.4. cm 기동

    hashtag
    5.5. tibero 기동

    hashtag
    5.6. cm 확인

    cm info 예시

    hashtag


    hashtag
    7. CM group 등록

    agent 설치 시, prs_install_agent.cfg에 작성한 내용을 기반으로 CM group을 추가한다.

    Key
    Value Type
    설명

    hashtag
    예시

    등록에 성공하면 다음과 같은 문구가 나온다.

    hashtag


    hashtag
    8. CM agent 등록

    Key
    Value Type
    설명

    hashtag
    예시

    circle-exclamation

    주의

    prs_0.sh 파일은 기본적으로 $PRS_HOME/bin에 위치하고 있다.

    cm에서 해당 파일을 실행할 수 있는 권한이 있어야 한다.

    등록에 성공하면 다음과 같은 문구가 나온다.

    cm을 확인해보면 다음과 같이 group과 agent가 등록된 info를 확인할 수 있다.

    cm info 예시

    hashtag
    5.9. CM group 기동

    cm을 통해 prosync를 기동하고 failover기능을 사용하기 위해 cm group을 기동시킨다.

    결과 예시

    hashtag


    hashtag
    6. Prosync 기동 확인

    admin process를 통해 prosync의 기동을 확인한다.

    cm failover 기능을 사용하는 경우 $PRS_HOME/var에 cm을 통해 agent를 기동한 log파일들이 생긴다.

    • cmagent.log

    • prs_cm_<$agent_id>.log

    • prs_cm_sh_err_<$agent_id>.log

    hashtag

    PRS_AGENT_PROC_STATUS_INTERVAL

    Agent 프로세스가 CM에게 cmrctl check 명령을 보내는 주기를 설정한다.

    PRS_AGENT_CM_PROBE_TIMEOUT

    CM 상태 확인 시 대기하는 최대 시간(초)을 설정한다. 0으로 설정할 경우 cmrctl 응답을 무한히 대기한다. 설정값을 초과할 경우 CM hang으로 판단하여 Agent 및 하위 프로세스를 정리한다. (기본값: 0) ※ 표준 출력을 우회하여 응답을 수신하므로, 응답 지연이 우려될 경우 0으로 설정한다.

    string

    그룹의 종류를 나타내기 위한 용도이다. (필수)

    failover

    string

    agent가 종료되었을때 failover 기능 사용 여부이다. (default: true)

    string(directory path)

    agent cmd를 실행시킬 script가 위치한 절대경로이다 (필수)

    pubnet

    string

    public 용도로 사용할 네트워크 리소스 이름이다. dependency를 추가하려면 입력해야한다.

    retry_cnt

    integer

    최대 retry 시도 횟수이다. (default: 3)

    USE_CM

    CM 사용 여부를 설정한다. Y로 설정할 경우 하위 프로세스의 상태를 모니터링하고, 장애 발생 시 재기동을 수행한다. 내부 장애 발생 시 cmrctl을 통해 정지 요청을 수행한다. (기본값: N)

    PRS_AGENT_PROC_MAX_FAIL_CNT

    하위 프로세스 장애 발생 시 상태를 보정하기 위해 재시도하는 최대 횟수를 설정한다. (기본값: 10)

    PRS_AGENT_PROC_STARTUP_TIMEOUT

    프로세스 기동 요청 이후 정상적으로 처리되기까지 대기하는 최대 시간(초)을 설정한다. 기동 요청이 정상 처리되지 않을 경우, 설정한 시간만큼 대기한 후 재시도한다.

    PRS_AGENT_PROC_STATUS_REPLY_TIMEOUT

    name

    string

    그룹 리소스 이름이다. (unique, 필수)

    cname

    string

    해당 그룹 리소스가 속할 cluster 리소스 이름이다. (필수)

    name

    string

    agent 리소스 이름이다. (unique, 필수)

    grpname

    string

    agent 리소스가 속할 그룹 리소스 이름이다 (필수)

    하위 프로세스로부터 응답이 없을 경우 대기하는 최대 시간(초)을 설정한다. 초과 시 해당 프로세스에 hang이 발생한 것으로 판단하고 재기동을 수행한다.

    grptype

    script

    AGENT_CNT=4
    
    AGENT_ID_0=agent1
    AGENT_HOST_0=172.19.0.11
    AGENT_PORT_0=7600
    AGENT_CM_GROUP_0=CM1
    AGENT_CM_ID_0=0
    
    AGENT_ID_1=agent2
    AGENT_HOST_1=172.19.0.12
    AGENT_PORT_1=7700
    AGENT_CM_GROUP_1=CM1
    AGENT_CM_ID_1=1
    
    AGENT_ID_2=agent3
    AGENT_HOST_2=172.19.0.13
    AGENT_PORT_2=7800
    AGENT_CM_GROUP_2=CM2
    AGENT_CM_ID_2=0
    
    AGENT_ID_3=agent4
    AGENT_HOST_3=172.19.0.14
    AGENT_PORT_3=7900
    AGENT_CM_GROUP_3=CM2
    AGENT_CM_ID_3=1
    $ cd $PRS_HOME/install
    $ . prs_install_agent.sh
    ********************************************************************************
    * Agent Install Step (1/4)
    * Check System Parameters 
    ********************************************************************************
    * Checking system type... 
    Linux
    
    * Checking PRS_HOME... 
    PRS_HOME: /home/prosync/example
    
    ********************************************************************************
    * Agent Install Step (2/4)
    * Check install agent config file   [prs_install_agent.cfg]  
    * Check Instance file               [prs_instance.map] 
    ********************************************************************************
    * Checking configuration file... 
    [/home/prosync/example/install/prs_install_agent.cfg] exists.
    
    * Checking Agent configuration... 
    parameter check for Agent[0] Started 
        AGENT_ID: agent1
        AGENT_HOST: 172.19.0.11
        AGENT_PORT: 7600
        AGENT_CM_GROUP: CM1
        AGENT_CM_ID: 0
    parameter check for Agent[0] Done 
    parameter check for Agent[1] Started 
        AGENT_ID: agent2
        AGENT_HOST: 172.19.0.12
        AGENT_PORT: 7700
        AGENT_CM_GROUP: CM1
        AGENT_CM_ID: 1
    parameter check for Agent[1] Done 
    parameter check for Agent[2] Started 
        AGENT_ID: agent3
        AGENT_HOST: 172.19.0.13
        AGENT_PORT: 7800
        AGENT_CM_GROUP: CM2
        AGENT_CM_ID: 0
    parameter check for Agent[2] Done 
    parameter check for Agent[3] Started 
        AGENT_ID: agent4
        AGENT_HOST: 172.19.0.14
        AGENT_PORT: 7900
        AGENT_CM_GROUP: CM2
        AGENT_CM_ID: 1
    parameter check for Agent[3] Done 
    
    * Checking prs_instance.map file... 
    [/home/prosync/example/config/prs_instance.map] exists.
    
    ********************************************************************************
    * Agent Install Step (3/4)
    * Writing agent config file         [/home/prosync/example/install/prs_install_agent.cfg]  
    * Writing Instance file             [/home/prosync/example/config/prs_instance.map] 
    * Total Agent Cnt                   [4] 
    ********************************************************************************
    * Writing all agents.. cnt: 4
    * Writing Agent.. Index:           0
    * Writing Agent.. AGENT_ID:        agent1
    * Writing Agent.. AGENT_HOST:      172.19.0.11
    * Writing Agent.. AGENT_PORT:      7600
    * Writing Agent.. AGENT_CM_GROUP:  CM1
    * Writing Agent.. AGENT_CM_ID:     0
    * Writing Agent configuration... 
    /home/prosync/example/config/prs_agent_agent1.cfg not found. Writing files...
    Done.
    
    * Writing Agent information... 
    
    
    * Writing Agent.. Index:           1
    * Writing Agent.. AGENT_ID:        agent2
    * Writing Agent.. AGENT_HOST:      172.19.0.12
    * Writing Agent.. AGENT_PORT:      7700
    * Writing Agent.. AGENT_CM_GROUP:  CM1
    * Writing Agent.. AGENT_CM_ID:     1
    * Writing Agent configuration... 
    /home/prosync/example/config/prs_agent_agent2.cfg not found. Writing files...
    Done.
    
    * Writing Agent information... 
    
    
    * Writing Agent.. Index:           2
    * Writing Agent.. AGENT_ID:        agent3
    * Writing Agent.. AGENT_HOST:      172.19.0.13
    * Writing Agent.. AGENT_PORT:      7800
    * Writing Agent.. AGENT_CM_GROUP:  CM2
    * Writing Agent.. AGENT_CM_ID:     0
    * Writing Agent configuration... 
    /home/prosync/example/config/prs_agent_agent3.cfg not found. Writing files...
    Done.
    
    * Writing Agent information... 
    
    
    * Writing Agent.. Index:           3
    * Writing Agent.. AGENT_ID:        agent4
    * Writing Agent.. AGENT_HOST:      172.19.0.14
    * Writing Agent.. AGENT_PORT:      7900
    * Writing Agent.. AGENT_CM_GROUP:  CM2
    * Writing Agent.. AGENT_CM_ID:     1
    * Writing Agent configuration... 
    /home/prosync/example/config/prs_agent_agent4.cfg not found. Writing files...
    Done.
    
    * Writing Agent information... 
    
    
    * Creating var directory...
       * Already Created.
    ********************************************************************************
    * Agent Install Step (4/4)
    * Creating files for CM
    ********************************************************************************
    AGENT_CM_ID detected
    generating prs_0.sh...
    PRS_HOME=/home/prosync/example
    AGENT_ID=agent1
    prs_0.sh has created in $PRS_HOME/bin/
    AGENT_CM_ID detected
    generating prs_1.sh...
    PRS_HOME=/home/prosync/example
    AGENT_ID=agent2
    prs_1.sh has created in $PRS_HOME/bin/
    AGENT_CM_ID detected
    generating prs_0.sh...
    PRS_HOME=/home/prosync/example
    AGENT_ID=agent3
    prs_0.sh has created in $PRS_HOME/bin/
    AGENT_CM_ID detected
    generating prs_1.sh...
    PRS_HOME=/home/prosync/example
    AGENT_ID=agent4
    prs_1.sh has created in $PRS_HOME/bin/
    Agent installation Done.
    
    #!/bin/sh
    
    export TB_HOME=/home/tibero/tibero/tibero7   ## TB_HOME 입력
    export PRS_HOME=/home/prosync/example
    AGENT_ID=agent1                              ## agent_id 입력
    TIMEOUT_CNT=7
    source $PRS_HOME/bin/prs_cm.sh
    export logdir=$PRS_HOME/var
    
    echo "`date +%Y/%m/%d\ %H:%M:%S` cm agent Start (Agent Command $1)" >> $logdir/cmagent.log
    case $1 in
    START)
        echo "start $TIMEOUT_CNT $AGENT_ID" >> $logdir/cmagent.log
        start $TIMEOUT_CNT $AGENT_ID
        rc=$?
        ;;
    PROBE)
        echo "probe $TIMEOUT_CNT $AGENT_ID" >> $logdir/cmagent.log
        probe $TIMEOUT_CNT $AGENT_ID
        rc=$?
        ;;
    DOWN)
        echo "stop $TIMEOUT_CNT $AGENT_ID" >> $logdir/cmagent.log
        stop $TIMEOUT_CNT $AGENT_ID
        rc=$?
        ;;
    KILL)
        echo "stop $TIMEOUT_CNT $AGENT_ID" >> $logdir/cmagent.log
        stop $TIMEOUT_CNT $AGENT_ID
        rc=$?
        ;;
    NOTI)
        rc=0
        ;;
    COMMIT)
        echo "send $TIMEOUT_CNT $AGENT_ID ${@:2}" >> $logdir/cmagent.log
        send $TIMEOUT_CNT $AGENT_ID ${@:2}
        rc=$?
        ;;
    
    *)
        ;;
    esac
    echo "`date +%Y/%m/%d\ %H:%M:%S` cm agent End  (Agent Command $1)" >> $logdir/cmagent.log
    
    
    exit $rc
    cd $PRS_HOME/config
    vi prs_agent_agent1.cfg
    ################################################################################
    # 
    # ProSync Agent Configurations (Template)
    #
    ################################################################################                                      
    
    #-------------------------------------------------------------------------------
    # LOG
    #-------------------------------------------------------------------------------
    LOG_LEVEL = 3
    LOG_DIR = /home/prosync/example/var/agent/agent1/log                  
    LOG_BACKUP_DIR = /home/prosync/example/var/agent/agent1/log/backup         
    #-------------------------------------------------------------------------------
    # CM
    #-------------------------------------------------------------------------------
    USE_CM = Y
    PRS_AGENT_PROC_MAX_FAIL_CNT = 10		#Dependency Param : USE_CM=Y
    PRS_AGENT_PROC_STARTUP_TIMEOUT = 10	        #Dependency Param : USE_CM=Y
    PRS_AGENT_PROC_STATUS_REPLY_TIMEOUT = 10	#Dependency Param : USE_CM=Y
    PRS_AGENT_PROC_STATUS_INTERVAL = 3		#Dependency Param : USE_CM=Y
    PRS_AGENT_CM_PROBE_TIMEOUT = 0			#Dependency Param : USE_CM=Y
    ############################################
    #
    # ProSync Installation Parameters
    #
    ############################################
    
    # (Mandatory)
    INSTANCE_ID=TAC2TAC
    PRS_USER=TAC2TAC
    PRS_PWD=TAC2TAC
    
    # (Optional)
    #PRS_TS_NAME=
    #PRS_TS_FILE=
    #PRS_TS_SIZE=
    #PRS_SKIP_USER_CREATE=N
    #PRS_TARGET_MIN_PRIVILEGE=N
    #PRS_LOG_DIR=
    #LOG_BACKUP_DIR=
    #CREATE_DSN_FILE=N
    #DSN_DIR=
    #DSN_FILE=#need DSN_DIR
    
    ############################################
    #
    # ProSync Processes Informations for Instance Map
    #
    ############################################
    ### (Optional)
    AGENT_LIST_DELIMITER=,
    
    ### (Mandatory)
    # Ext process
    ## Ext cnt must be the same as SRC_DB_CNT
    EXT_CNT=2
    EXT_AGENT_ID_LIST_0=agent1,agent2
    EXT_AGENT_ID_LIST_1=agent2,agent1
    
    # Apply process
    APPLY_PORT=7620
    APPLY_AGENT_ID_LIST=agent3,agent4
    
    # Llob process
    LLOB_PORT=7630
    LLOB_AGENT_ID_LIST=agent1,agent2
    
    ############################################
    #
    # Source database informations
    #
    ############################################
    
    # (Mandatory)
    SRC_DB_TYPE=TIBERO
    SRC_DB_NAME=tibero
    SRC_INSTALL_USER=sys
    SRC_INSTALL_PWD=tibero
    
    # (Optional)
    #AUTO_ADD_SUPP_LOG=Y
    #SRC_SKIP_TS_CREATE=N
    
    # (Number Of Database Instances)
    SRC_DB_CNT=2
    
    # (Dsn)
    #SRC_DB_REAL_NAME=
    #SRC_DB_IP_0=
    #SRC_DB_PORT_0=
    #SRC_DB_IP_1=
    #SRC_DB_PORT_1=
    
    # (for Cluster, only Extract Needed)
    SRC_DB_ALIAS_0=tibero1
    SRC_DB_ALIAS_1=tibero2
    
    # (for Oracle Logminer only)
    # Oracle 11g or less, use utl_file_dir instead of DICT_FILE_DIR
    #USE_LOGMNR=Y
    #DICT_FILE_DIR=
    
    # (for MySQL only)
    #PRS_EXT_IP=
    
    ############################################
    #
    # Target database informations
    #
    ############################################
    
    # (Mandatory)
    TAR_DB_TYPE=TIBERO
    TAR_DB_NAME=tibero_tar
    TAR_INSTALL_USER=sys
    TAR_INSTALL_PWD=tibero
    
    # (Optional)
    #TAR_SKIP_TS_CREATE=N
    
    # (Number Of Database Instances)
    TAR_DB_CNT=2
    
    # (Dsn)
    #TAR_DB_REAL_NAME=
    #TAR_DB_IP_0=
    #TAR_DB_PORT_0=
    #TAR_DB_IP_1=
    #TAR_DB_PORT_1=
    
    # (for MySQL only)
    #PRS_APPLY_IP=
    
    # (for multi thread)
    #GROUP_NUM=1
    
    # (for TDE(transparent data encryption) synchronization)
    #USE_TDE=N
    
    $ cd $PRS_HOME/install
    $ . prs_install.sh
    ********************************************************************************
    * Check System Parameters (1/5)
    ********************************************************************************
    Checking system type... Linux
    Checking PRS_HOME... /home/prosync/example
    Checking TB_HOME... /home/tibero/tibero/tibero7
    Checking ORACLE_HOME... not found
    Checking psql ... not available
    Checking psql service ...not found
    
    ********************************************************************************
    * Check Installation Parameters (2/5)
    ********************************************************************************
    Checking configuration file... ok
    Checking prs_instance.map file... ok
    Checking Instance Id from prs_instance.map...
    * instance information for TAC2TAC was not found. It will be written in this script...
    ok
    Checking proecsses infos...
    * Checking Ext processes Informations... EXT_CNT: 2
    * Delimiter: [,]
       * Ext[0] process's Agent Id List 
           * Agent ID[agent1]
           * [agent1] found.
           * Agent ID[agent2]
           * [agent2] found.
       * Ext[1] process's Agent Id List 
           * Agent ID[agent2]
           * [agent2] found.
           * Agent ID[agent1]
           * [agent1] found.
    * Checking Apply process Informations...
    * Checking Apply Port..
       * APPLY_PORT=[7620]
    * Checking Apply process's Agent Id List..
           * Agent ID[agent3]
           * [agent3] found.
           * Agent ID[agent4]
           * [agent4] found.
    * Checking Llob process Informations...
    * Checking Llob Port..
       * LLOB_PORT=[7630]
    * Checking Llob process's Agent Id List..
           * Agent ID[agent1]
           * [agent1] found.
           * Agent ID[agent2]
           * [agent2] found.
    
    Checking INSTANCE_ID... TAC2TAC
    Checking PRS_USER... TAC2TAC
    Checking PRS_TS_NAME... TAC2TAC_ts
    Checking PRS_TS_FILE... TAC2TAC_ts.dtf
    Checking PRS_TS_SIZE... 1G
    Checking PRS_EXT_IP... %
    Checking PRS_APPLY_IP... %
    Checking SRC_DB_CNT... 2
    Checking SRC_DB_TYPE... TIBERO
    Checking SRC_INSTALL_USER... sys
    Checking SRC_DB_NAME... tibero
    Checking source connection(1/2)... ok
    Checking source connection(2/2)... ok
    _list_create: Variable TAR_DB_IP_0 is undefined or empty.
    _list_create: Variable TAR_DB_PORT_0 is undefined or empty.
    Checking TAR_DB_TYPE... TIBERO
    Checking TAR_INSTALL_USER... sys
    Checking TAR_DB_NAME... tibero_tar
    Checking target connection [tibero_tar](1/2)... ok
    Checking target connection [tibero_tar](2/2)... ok
    
    ********************************************************************************
    * Install to Source Database (3/5)
    ********************************************************************************
    Checking archived log mode... ok
    Usage: _list_get <list> <index>
    Checking log mining parameters [tibero1]... ok
    Checking log mining parameters [tibero2]... ok
    Usage: _list_get <list> <index>
    Get Archive log directory [tibero1]... ok
    Get Archive log format [tibero1]... ok
    Get Archive log directory [tibero2]... ok
    Get Archive log format [tibero2]... ok
    Dropping ProSync objects... ok
    Dropping ProSync tablespace... DROP TABLESPACE instance_ts INCLUDING CONTENTS AND DATAFILES;
    
    done
    
    ok
    Creating ProSync tablespace... ok
    Dropping ProSync user... ok
    Creating ProSync user... ok
    Granting privileges... ok
    Granting privileges for trigger... ok
    Creating ProSync internal tables... ok
    Creating ProSync internal package... ok
    Creating ProSync internal trigger... ok
    Prosync user TAC2TAC to uppercase TAC2TACok
    Checking source object file(group num : 1)... ok
    Building source object for TEST%.%... ok
    Adding table supplemental log... 4, and one for prosync
      "TAC2TAC"."PRS_DUMMY_TBL" : Supplemental logging set
      "TEST"."T1" : supplemental log already exists, continue.
      "TEST"."T2" : supplemental log already exists, continue.
      "TEST"."T3" : supplemental log already exists, continue.
      TAC2TAC.PRS_DUMMY_TBL : supplemental log already exists, continue.
    Counting total source objects... 4
    Generating initial DDL history... ok
    Checking initial DDL history... ok
    Insert default value in PRS_DUMMY_TBL...ok
    Querying NLS_CHARACTERSET... UTF8
    Querying NLS_NCHAR_CHARACTERSET... UTF16
    Switching logfile [tibero1]... ok
    Switching logfile [tibero2]... ok
    Usage: _list_get <list> <index>
    Querying current log sequence [tibero1]... 8
    Querying current log sequence [tibero2]... 8
    Querying current snapshot#... 93289
    
    
    ********************************************************************************
    * Install to Target Database (4/5)
    ********************************************************************************
    Dropping ProSync objects... ok
    Dropping ProSync tablespace... DROP TABLESPACE TAC2TAC_ts INCLUDING CONTENTS AND DATAFILES;
    
    done
    
    ok
    Creating ProSync tablespace... ok
    Dropping ProSync user... ok
    Creating ProSync user... ok
    Granting privileges... ok
    Creating ProSync internal tables... ok
    Generating initial construct history [tibero1 (group 1)]... ok
    Generating initial construct history [tibero2 (group 1)]... ok
    Generating initial commit history... ok
    
    ********************************************************************************
    * Generate Configuration Parameters (5/5)
    ********************************************************************************
    Generating Wallet... ok
    Usage: _list_get <list> <index>
    Generating Extract [tibero1] configuration...  ok
    Generating Extract [tibero2] configuration...  ok
    Generating Apply [tibero_tar] configuration...  ok
    Generating LONG/LOB configuration...  ok
    Generating instance map to prs_instance.map ...
    
    
    ********************************************************************************
    * ProSync is installed successfully on Fri, 18 Apr 2025 02:01:32 +0000.
    *
    *   PRS_HOME     = /home/prosync/example
    *   Binary Path  = /home/prosync/example/bin
    *   ProSync User = TAC2TAC
    *
    *   Archived Log Path     = /home/tibero/tibero/tibero7/database/tibero/archive/
    *   Archived Log Format   = log-t%t-r%r-s%s.arc
    *   Initial log sequence# = 9
    *
    *   Archived Log Path     = /home/tibero/tibero/tibero7/database/tibero/archive/
    *   Archived Log Format   = log-t%t-r%r-s%s.arc
    *   Initial log sequence# = 9
    *
    *   Initial change# (TSN) = 94003 
    *
    ********************************************************************************
    $ tbdown
    $ tbcm -d
    $ cd $TB_HOME/config
    total 156
    drwxr-xr-x  2 tibero tibero  4096 Apr 21 05:54 ./
    drwxr-xr-x 13 tibero tibero  4096 Apr 17 10:19 ../
    -rw-r--r--  1 tibero tibero    72 Apr  1  2024 .gitignore
    -rw-r--r--  1 tibero tibero   474 Apr  1  2024 cm.template
    -rw-r--r--  1 tibero tibero   691 Apr 17 10:19 cm_tibero1.tip
    -rw-r--r--  1 tibero tibero   691 Apr 17 10:19 cm_tibero2.tip
    -rw-r--r--  1 tibero tibero   810 Apr  1  2024 common_tip.template
    -rwxr-xr-x  1 tibero tibero   982 Apr  1  2024 gen_QMS_store_dsn_for_sampler.sh*
    -rwxr-xr-x  1 tibero tibero  4433 Apr  1  2024 gen_psm_cmd.sh*
    -rwxr-xr-x  1 tibero tibero  4886 Apr  1  2024 gen_tip.sh*
    -rwxr-xr-x  1 tibero tibero  5938 Apr  1  2024 gen_tip_for_ssvr.sh*
    -rwxr-xr-x  1 tibero tibero 11797 Apr  1  2024 gen_tip_for_tac.sh*
    -rwxr-xr-x  1 tibero tibero 15732 Apr  1  2024 gen_tip_for_zeta.sh*
    -rw-r--r--  1 tibero tibero  1796 Apr  1  2024 ilog.map.example
    -rwxr-xr-x  1 tibero tibero  1628 Apr 17 10:19 psm_commands*
    -rw-r--r--  1 tibero tibero   567 Apr  1  2024 sampler.ssa.template
    -rw-r--r--  1 tibero tibero   488 Apr  1  2024 sampler.template
    -rw-r--r--  1 tibero tibero   434 Apr  1  2024 ssvr.template
    -rw-r--r--  1 tibero tibero   730 Apr  1  2024 tac.template
    -rw-r--r--  1 tibero tibero   572 Apr  1  2024 tas.template
    -rw-r--r--  1 tibero tibero   489 Apr  1  2024 tibero.template
    -rw-r--r--  1 tibero tibero   936 Apr 21 05:54 tibero1.tip
    -rw-r--r--  1 tibero tibero   936 Apr 21 05:54 tibero2.tip
    -rw-r--r--  1 tibero tibero   693 Apr  1  2024 tibero_dev.template
    -rw-r--r--  1 tibero tibero   344 Apr  1  2024 tibero_max.template
    -rw-r--r--  1 tibero tibero   582 Apr  1  2024 tip.ssa.template
    -rw-r--r--  1 tibero tibero   525 Apr  1  2024 tip.template
    -rw-r--r--  1 tibero tibero   689 Apr  1  2024 tip_dev.template
    -rw-r--r--  1 tibero tibero   528 Apr  1  2024 tip_jenkins.template
    -rw-r--r--  1 tibero tibero   340 Apr  1  2024 tip_max.template
    -rw-r--r--  1 tibero tibero     5 Apr  1  2024 variant
    
    # tip file generated from /home/tibero/tibero/tibero7/config/cm.template (Thu Apr 17 10:19:44 UTC 2025)
    #-------------------------------------------------------------------------------
    #
    # Cluster Manager initialization parameter
    #
    #-------------------------------------------------------------------------------
    CM_ID=0 # 여기에 CM_ID를 추가한다.
    CM_NAME=cm_tibero1
    CM_UI_PORT=8645
    CM_RESOURCE_FILE=/home/tibero/tibero/tibero7/cmfile/tibero/cm_tibero1.res
    
    CM_LOG_DEST=/home/tibero/tibero/tibero7/instance/tibero1/log/cm
    CM_GUARD_LOG_DEST=/home/tibero/tibero/tibero7/instance/tibero1/log/cm/guard
    
    #CM_HEARTBEAT_EXPIRE
    #CM_WATCHDOG_EXPIRE
    #LOG_LVL_CM
    
    #CM_ENABLE_FAST_NET_ERROR_DETECTION=Y
    #CM_FENCE=Y
    #_CM_CHECK_RUNLEVEL=Y
    
    tbcm -b
    tbboot
    cmrctl show all
    Resource List of Node cm_tibero1
    =====================================================================
      CLUSTER     TYPE        NAME       STATUS           DETAIL         
    ----------- -------- -------------- -------- ------------------------
         COMMON  network           inc1       UP (private) 172.19.0.11/8640
         COMMON  cluster     cls_tibero       UP inc: inc1, pub: N/A
     cls_tibero     file   cls_tibero:0       UP /home/tibero/tibero/tibero7/cmfile/tibero/cmdata
     cls_tibero  service         tibero       UP Database, Active Cluster (auto-restart: OFF)
     cls_tibero       db        tibero1 UP(NRML) tibero, /home/tibero/tibero/tibero7, failed retry cnt: 0
    =====================================================================
    Resource List of Node cm_tibero2
    =====================================================================
      CLUSTER     TYPE        NAME       STATUS           DETAIL         
    ----------- -------- -------------- -------- ------------------------
         COMMON  network           inc2       UP (private) 172.19.0.12/8670
         COMMON  cluster     cls_tibero       UP inc: inc2, pub: N/A
     cls_tibero     file   cls_tibero:0       UP /home/tibero/tibero/tibero7/cmfile/tibero/cmdata
     cls_tibero  service         tibero       UP Database, Active Cluster (auto-restart: OFF)
     cls_tibero       db        tibero2 UP(NRML) tibero, /home/tibero/tibero/tibero7, failed retry cnt: 0
    =====================================================================
    
    cmrctl add group --name <group_name> --cname <cluster_name> 
    --grptype <type> --failover <true|false>
    cmrctl add group --name CM1 --cname cls_tibero --grptype prosync
    $ Resource add success! (group, CM1)
    cmrctl add agent --name <agent_name> --grpname <group_name> --script <directory_path>
    --pubnet <public_network_resource_name> --retry_cnt <retry_cnt>
    cmrctl add agent --name agent1 --grpname CM1 --script "$TB_HOME/prs_0.sh"
    $ Resource add success! (agent, agent1)
    cmrctl show all
    Resource List of Node cm_tibero1
    =====================================================================
      CLUSTER     TYPE        NAME       STATUS           DETAIL         
    ----------- -------- -------------- -------- ------------------------
         COMMON  network           inc1       UP (private) 172.19.0.11/8640
         COMMON  cluster     cls_tibero       UP inc: inc1, pub: N/A
     cls_tibero     file   cls_tibero:0       UP /home/tibero/tibero/tibero7/cmfile/tibero/cmdata
     cls_tibero  service         tibero       UP Database, Active Cluster (auto-restart: OFF)
     cls_tibero       db        tibero1 UP(NRML) tibero, /home/tibero/tibero/tibero7, failed retry cnt: 0
     cls_tibero    group            CM1     DOWN type: prosync (failover: ON)
     cls_tibero    agent         agent1     DOWN /home/tibero/tibero/tibero7/prs0.sh, start retry cnt: 0
    =====================================================================
    Resource List of Node cm_tibero2
    =====================================================================
      CLUSTER     TYPE        NAME       STATUS           DETAIL         
    ----------- -------- -------------- -------- ------------------------
         COMMON  network           inc2       UP (private) 172.19.0.12/8670
         COMMON  cluster     cls_tibero       UP inc: inc2, pub: N/A
     cls_tibero     file   cls_tibero:0       UP /home/tibero/tibero/tibero7/cmfile/tibero/cmdata
     cls_tibero  service         tibero       UP Database, Active Cluster (auto-restart: OFF)
     cls_tibero       db        tibero2 UP(NRML) tibero, /home/tibero/tibero/tibero7, failed retry cnt: 0
     cls_tibero    group            CM1     DOWN type: prosync (failover: ON)
     cls_tibero    agent         agent2     DOWN /home/tibero/tibero/tibero7/prs1.sh, start retry cnt: 0
    =====================================================================
    
    cmrctl start group --name CM1
    =================================== SUCCESS! ===================================
     Succeeded to request at each node to boot resources under the group(CM1).
     Please use "cmrctl show group --name CM1" to verify the result.
    ================================================================================
    Resource List of Node cm_tibero1
    =====================================================================
      CLUSTER     TYPE        NAME       STATUS           DETAIL         
    ----------- -------- -------------- -------- ------------------------
         COMMON  network           inc1       UP (private) 172.19.0.11/8640
         COMMON  cluster     cls_tibero       UP inc: inc1, pub: N/A
     cls_tibero     file   cls_tibero:0       UP /home/tibero/tibero/tibero7/cmfile/tibero/cmdata
     cls_tibero  service         tibero       UP Database, Active Cluster (auto-restart: OFF)
     cls_tibero       db        tibero1 UP(NRML) tibero, /home/tibero/tibero/tibero7, failed retry cnt: 0
     cls_tibero    group            CM1       UP type: prosync (failover: ON)
     cls_tibero    agent         agent1       UP /home/tibero/tibero/tibero7/prs_0.sh, start retry cnt: 0
    =====================================================================
    Resource List of Node cm_tibero2
    =====================================================================
      CLUSTER     TYPE        NAME       STATUS           DETAIL         
    ----------- -------- -------------- -------- ------------------------
         COMMON  network           inc2       UP (private) 172.19.0.12/8670
         COMMON  cluster     cls_tibero       UP inc: inc2, pub: N/A
     cls_tibero     file   cls_tibero:0       UP /home/tibero/tibero/tibero7/cmfile/tibero/cmdata
     cls_tibero  service         tibero       UP Database, Active Cluster (auto-restart: OFF)
     cls_tibero       db        tibero2 UP(NRML) tibero, /home/tibero/tibero/tibero7, failed retry cnt: 0
     cls_tibero    group            CM1       UP type: prosync (failover: ON)
     cls_tibero    agent         agent2       UP /home/tibero/tibero/tibero7/prs_1.sh, start retry cnt: 0
    =====================================================================
    
    $ prs_adm
    
    ProSync 4 - Admin Utility
    
    TmaxData Corporation Copyright (c) 2024-. All rights reserved.
    
    Admin> status
    
    prs_agent ID: agent1, HOST: 172.19.0.11, PORT: 7600, CM_GROUP: CM1, CM_ID: 0 is running
    prs_agent ID: agent2, HOST: 172.19.0.12, PORT: 7700, CM_GROUP: CM1, CM_ID: 1 is running
    prs_agent ID: agent3, HOST: 172.19.0.13, PORT: 7800, CM_GROUP: CM2, CM_ID: 0 is running
    prs_agent ID: agent4, HOST: 172.19.0.14, PORT: 7900, CM_GROUP: CM2, CM_ID: 1 is running
    
    
    Instance ID: [TAC2TAC]
    prosync_ext1 (1) is running (prs_agent ID : agent1, HOST: 172.19.0.11, PORT: 7600)
    prosync_ext2 (2) is running (prs_agent ID : agent2, HOST: 172.19.0.12, PORT: 7700)
    prosync_apply1 is running (prs_agent ID : agent3, HOST: 172.19.0.13, PORT: 7800)
    prosync_llob (1) is running (prs_agent ID : agent1, HOST: 172.19.0.11, PORT: 7600)
    

    Cluster to Cluster (TAC예시)

    hashtag
    SRC DB와 TAR DB가 서로 같은 장비에 설치된 경우

    hashtag
    1. Agent 설치

    hashtag
    prs_install_agent.cfg 예시

    hashtag
    agent 설치 및 설치 결과 예시

    hashtag
    2. Instance 설치

    hashtag
    prs_install.cfg 설정 예시

    hashtag
    instance 설치 및 설치 결과 예시

    hashtag
    3. Prosync 실행

    hashtag


    hashtag
    SRC DB와 TAR DB가 서로 다른 장비에 설치된 경우

    hashtag
    1. Agent 설치

    SRC DB가 설치된 장비에서 Agent를 설치한다.

    hashtag
    prs_install_agent.cfg 예시

    hashtag
    agent 설치 및 설치 결과 예시

    hashtag
    2. tbdsn.tbr 설정

    SRC DB 장비에서 TAR DB Client 접근을 위한 tbdsn.tbr 설정으로, src db 장비에서 instance를 설치하기 위해서 src db 장비에서 tar db client에 접근할 수 있어야 한다. 이를 위해 src db 장비의 tbdsn.tbr 파일에 tar db 정보를 추가해야 한다.

    hashtag
    TAR DB tbdsn.tbr 파일 예시

    hashtag
    SRC DB 장비에 TAR DB 정보를 반영한 tbdsn.tbr 예시

    hashtag
    SRC DB 장비에서 TAR DB client에 접근할 수 있는지 확인

    접근 확인 예시

    hashtag
    3. Instance 설치

    SRC DB가 설치된 장비에서 Instance를 설치한다.

    hashtag
    prs_install.cfg 설정 예시

    hashtag
    instance 설치 및 설치 결과 예시

    hashtag
    4. 설치 파일 및 디렉토리 이동

    TAR DB 장비 Prosync 디렉토리에 설치 파일 및 디렉토리를 옮긴다. ProSync는 SRC DB 장비에서만 설치되었기 때문에, TAR DB 장비에서도 ProSync를 기동하려면 SRC DB 장비에서 설치 후 생성된 파일 및 디렉토리를 TAR DB 장비로 복사해야 한다.

    circle-exclamation

    주의

    설치 시 생성된 설정 파일들(*.cfg)에는 SRC DB 장비 기준의 경로가 포함되어 있으므로, TAR DB 장비로 복사한 후에는 경로를 TAR DB 장비 기준으로 수정해야 한다.

    hashtag
    복사 필요한 파일 및 디렉토리

    $PRS_HOME/config

    • prs_adm.cfg

    • <instance_id>_apply1.cfg

    • prs_agent_<agent_id>.cfg

    • prs_instance.map

    $PRS_HOME/var

    옮긴 파일 예시

    hashtag
    5. Prosync 실행

    hashtag

    AGENT_CNT=4
    
    AGENT_ID_0=agent1
    AGENT_HOST_0=172.19.0.11
    AGENT_PORT_0=7600
    
    AGENT_ID_1=agent2
    AGENT_HOST_1=172.19.0.11
    AGENT_PORT_1=7700
    
    AGENT_ID_2=agent3
    AGENT_HOST_2=172.19.0.11
    AGENT_PORT_2=7800
    
    AGENT_ID_3=agent4
    AGENT_HOST_3=172.19.0.11
    AGENT_PORT_3=7900
    $ cd $PRS_HOME/install
    $ . prs_install_agent.sh
    ********************************************************************************
    * Agent Install Step (1/4)
    * Check System Parameters 
    ********************************************************************************
    * Checking system type... 
    Linux
    
    * Checking PRS_HOME... 
    PRS_HOME: /home/prosync/example
    
    ********************************************************************************
    * Agent Install Step (2/4)
    * Check install agent config file   [prs_install_agent.cfg]  
    * Check Instance file               [prs_instance.map] 
    ********************************************************************************
    * Checking configuration file... 
    [/home/prosync/example/install/prs_install_agent.cfg] exists.
    
    * Checking Agent configuration... 
    parameter check for Agent[0] Started 
        AGENT_ID: agent1
        AGENT_HOST: 172.19.0.11
        AGENT_PORT: 7600
    parameter check for Agent[0] Done 
    parameter check for Agent[1] Started 
        AGENT_ID: agent2
        AGENT_HOST: 172.19.0.11
        AGENT_PORT: 7700
    parameter check for Agent[1] Done 
    parameter check for Agent[2] Started 
        AGENT_ID: agent3
        AGENT_HOST: 172.19.0.11
        AGENT_PORT: 7800
    parameter check for Agent[2] Done 
    parameter check for Agent[3] Started 
        AGENT_ID: agent4
        AGENT_HOST: 172.19.0.11
        AGENT_PORT: 7900
    parameter check for Agent[3] Done 
    
    * Checking prs_instance.map file... 
    [/home/prosync/example/config/prs_instance.map] exists.
    
    ********************************************************************************
    * Agent Install Step (3/4)
    * Writing agent config file         [/home/prosync/example/install/prs_install_agent.cfg]  
    * Writing Instance file             [/home/prosync/example/config/prs_instance.map] 
    * Total Agent Cnt                   [4] 
    ********************************************************************************
    * Writing all agents.. cnt: 4
    * Writing Agent.. Index:           0
    * Writing Agent.. AGENT_ID:        agent1
    * Writing Agent.. AGENT_HOST:      172.19.0.11
    * Writing Agent.. AGENT_PORT:      7600
    * Writing Agent.. AGENT_CM_GROUP:  
    * Writing Agent.. AGENT_CM_ID:     
    * Writing Agent configuration... 
    File already exists... 
    [/home/prosync/example/config/prs_agent_agent1.cfg]
    Want to Delete ? (Y/N)
    n
    Skip deleteing...
    
    * Writing Agent information... 
    Agent information already exist
    Want to Replace ? (Y/N)
    n
    Skipped... 
    
    
    * Writing Agent.. Index:           1
    * Writing Agent.. AGENT_ID:        agent2
    * Writing Agent.. AGENT_HOST:      172.19.0.11
    * Writing Agent.. AGENT_PORT:      7700
    * Writing Agent.. AGENT_CM_GROUP:  
    * Writing Agent.. AGENT_CM_ID:     
    * Writing Agent configuration... 
    /home/prosync/example/config/prs_agent_agent2.cfg not found. Writing files...
    Done.
    
    * Writing Agent information... 
    
    
    * Writing Agent.. Index:           2
    * Writing Agent.. AGENT_ID:        agent3
    * Writing Agent.. AGENT_HOST:      172.19.0.11
    * Writing Agent.. AGENT_PORT:      7800
    * Writing Agent.. AGENT_CM_GROUP:  
    * Writing Agent.. AGENT_CM_ID:     
    * Writing Agent configuration... 
    /home/prosync/example/config/prs_agent_agent3.cfg not found. Writing files...
    Done.
    
    * Writing Agent information... 
    
    
    * Writing Agent.. Index:           3
    * Writing Agent.. AGENT_ID:        agent4
    * Writing Agent.. AGENT_HOST:      172.19.0.11
    * Writing Agent.. AGENT_PORT:      7900
    * Writing Agent.. AGENT_CM_GROUP:  
    * Writing Agent.. AGENT_CM_ID:     
    * Writing Agent configuration... 
    /home/prosync/example/config/prs_agent_agent4.cfg not found. Writing files...
    Done.
    
    * Writing Agent information... 
    
    
    * Creating var directory...
       * Already Created.
    ********************************************************************************
    * Agent Install Step (4/4)
    * Creating files for CM
    ********************************************************************************
    There's no AGENT_CM_ID, finishing installation
    Agent installation Done.
    ############################################
    #
    # ProSync Installation Parameters
    #
    ############################################
    
    # (Mandatory)
    INSTANCE_ID=TAC2TAC
    PRS_USER=TAC2TAC
    PRS_PWD=TAC2TAC
    
    # (Optional)
    #PRS_TS_NAME=
    #PRS_TS_FILE=
    #PRS_TS_SIZE=
    #PRS_SKIP_USER_CREATE=N
    #PRS_TARGET_MIN_PRIVILEGE=N
    #PRS_LOG_DIR=
    #LOG_BACKUP_DIR=
    #CREATE_DSN_FILE=N
    #DSN_DIR=
    #DSN_FILE=#need DSN_DIR
    
    ############################################
    #
    # ProSync Processes Informations for Instance Map
    #
    ############################################
    ### (Optional)
    AGENT_LIST_DELIMITER=,
    
    ### (Mandatory)
    # Ext process
    ## Ext cnt must be the same as SRC_DB_CNT
    EXT_CNT=2
    EXT_AGENT_ID_LIST_0=agent1,agent2
    EXT_AGENT_ID_LIST_1=agent2,agent1
    
    # Apply process
    APPLY_PORT=7620
    APPLY_AGENT_ID_LIST=agent3
    
    # Llob process
    LLOB_PORT=7630
    LLOB_AGENT_ID_LIST=agent1,agent2
    
    ############################################
    #
    # Source database informations
    #
    ############################################
    
    # (Mandatory)
    SRC_DB_TYPE=TIBERO
    SRC_DB_NAME=tibero
    SRC_INSTALL_USER=sys
    SRC_INSTALL_PWD=tibero
    
    # (Optional)
    #AUTO_ADD_SUPP_LOG=Y
    #SRC_SKIP_TS_CREATE=N
    
    # (Number Of Database Instances)
    SRC_DB_CNT=2
    
    # (Dsn)
    #SRC_DB_REAL_NAME=
    #SRC_DB_IP_0=
    #SRC_DB_PORT_0=
    #SRC_DB_IP_1=
    #SRC_DB_PORT_1=
    
    # (for Cluster, only Extract Needed)
    SRC_DB_ALIAS_0=tibero1
    SRC_DB_ALIAS_1=tibero2
    
    # (for Oracle Logminer only)
    # Oracle 11g or less, use utl_file_dir instead of DICT_FILE_DIR
    #USE_LOGMNR=Y
    #DICT_FILE_DIR=
    
    # (for MySQL only)
    #PRS_EXT_IP=
    
    ############################################
    #
    # Target database informations
    #
    ############################################
    
    # (Mandatory)
    TAR_DB_TYPE=TIBERO
    TAR_DB_NAME=tibero_tar
    TAR_INSTALL_USER=sys
    TAR_INSTALL_PWD=tibero
    
    # (Optional)
    #TAR_SKIP_TS_CREATE=N
    
    # (Number Of Database Instances)
    TAR_DB_CNT=2
    
    # (Dsn)
    #TAR_DB_REAL_NAME=
    #TAR_DB_IP_0=
    #TAR_DB_PORT_0=
    #TAR_DB_IP_1=
    #TAR_DB_PORT_1=
    
    # (for MySQL only)
    #PRS_APPLY_IP=
    
    # (for multi thread)
    #GROUP_NUM=1
    
    # (for TDE(transparent data encryption) synchronization)
    #USE_TDE=N
    
    $ cd $PRS_HOME/install
    $ . prs_install.sh
    ********************************************************************************
    * Check System Parameters (1/5)
    ********************************************************************************
    Checking system type... Linux
    Checking PRS_HOME... /home/prosync/example
    Checking TB_HOME... /home/tibero/tibero/tibero7
    Checking ORACLE_HOME... not found
    Checking psql ... not available
    Checking psql service ...not found
    
    ********************************************************************************
    * Check Installation Parameters (2/5)
    ********************************************************************************
    Checking configuration file... ok
    Checking prs_instance.map file... ok
    Checking Instance Id from prs_instance.map...
    * instance information for TAC2TAC was not found. It will be written in this script...
    ok
    Checking proecsses infos...
    * Checking Ext processes Informations... EXT_CNT: 2
    * Delimiter: [,]
       * Ext[0] process's Agent Id List 
           * Agent ID[agent1]
           * [agent1] found.
           * Agent ID[agent2]
           * [agent2] found.
       * Ext[1] process's Agent Id List 
           * Agent ID[agent2]
           * [agent2] found.
           * Agent ID[agent1]
           * [agent1] found.
    * Checking Apply process Informations...
    * Checking Apply Port..
       * APPLY_PORT=[7620]
    * Checking Apply process's Agent Id List..
           * Agent ID[agent3]
           * [agent3] found.
           * Agent ID[agent4]
           * [agent4] found.
    * Checking Llob process Informations...
    * Checking Llob Port..
       * LLOB_PORT=[7630]
    * Checking Llob process's Agent Id List..
           * Agent ID[agent1]
           * [agent1] found.
           * Agent ID[agent2]
           * [agent2] found.
    
    Checking INSTANCE_ID... TAC2TAC
    Checking PRS_USER... TAC2TAC
    Checking PRS_TS_NAME... TAC2TAC_ts
    Checking PRS_TS_FILE... TAC2TAC_ts.dtf
    Checking PRS_TS_SIZE... 1G
    Checking PRS_EXT_IP... %
    Checking PRS_APPLY_IP... %
    Checking SRC_DB_CNT... 2
    Checking SRC_DB_TYPE... TIBERO
    Checking SRC_INSTALL_USER... sys
    Checking SRC_DB_NAME... tibero
    Checking source connection(1/2)... ok
    Checking source connection(2/2)... ok
    _list_create: Variable TAR_DB_IP_0 is undefined or empty.
    _list_create: Variable TAR_DB_PORT_0 is undefined or empty.
    Checking TAR_DB_TYPE... TIBERO
    Checking TAR_INSTALL_USER... sys
    Checking TAR_DB_NAME... tibero_tar
    Checking target connection [tibero_tar](1/2)... ok
    Checking target connection [tibero_tar](2/2)... ok
    
    ********************************************************************************
    * Install to Source Database (3/5)
    ********************************************************************************
    Checking archived log mode... ok
    Usage: _list_get <list> <index>
    Checking log mining parameters [tibero1]... ok
    Checking log mining parameters [tibero2]... ok
    Usage: _list_get <list> <index>
    Get Archive log directory [tibero1]... ok
    Get Archive log format [tibero1]... ok
    Get Archive log directory [tibero2]... ok
    Get Archive log format [tibero2]... ok
    Dropping ProSync objects... ok
    Dropping ProSync tablespace... DROP TABLESPACE instance_ts INCLUDING CONTENTS AND DATAFILES;
    
    done
    
    ok
    Creating ProSync tablespace... ok
    Dropping ProSync user... ok
    Creating ProSync user... ok
    Granting privileges... ok
    Granting privileges for trigger... ok
    Creating ProSync internal tables... ok
    Creating ProSync internal package... ok
    Creating ProSync internal trigger... ok
    Prosync user TAC2TAC to uppercase TAC2TACok
    Checking source object file(group num : 1)... ok
    Building source object for TEST%.%... ok
    Adding table supplemental log... 4, and one for prosync
      "TAC2TAC"."PRS_DUMMY_TBL" : Supplemental logging set
      "TEST"."T1" : supplemental log already exists, continue.
      "TEST"."T2" : supplemental log already exists, continue.
      "TEST"."T3" : supplemental log already exists, continue.
      TAC2TAC.PRS_DUMMY_TBL : supplemental log already exists, continue.
    Counting total source objects... 4
    Generating initial DDL history... ok
    Checking initial DDL history... ok
    Insert default value in PRS_DUMMY_TBL...ok
    Querying NLS_CHARACTERSET... UTF8
    Querying NLS_NCHAR_CHARACTERSET... UTF16
    Switching logfile [tibero1]... ok
    Switching logfile [tibero2]... ok
    Usage: _list_get <list> <index>
    Querying current log sequence [tibero1]... 8
    Querying current log sequence [tibero2]... 8
    Querying current snapshot#... 93289
    
    
    ********************************************************************************
    * Install to Target Database (4/5)
    ********************************************************************************
    Dropping ProSync objects... ok
    Dropping ProSync tablespace... DROP TABLESPACE TAC2TAC_ts INCLUDING CONTENTS AND DATAFILES;
    
    done
    
    ok
    Creating ProSync tablespace... ok
    Dropping ProSync user... ok
    Creating ProSync user... ok
    Granting privileges... ok
    Creating ProSync internal tables... ok
    Generating initial construct history [tibero1 (group 1)]... ok
    Generating initial construct history [tibero2 (group 1)]... ok
    Generating initial commit history... ok
    
    ********************************************************************************
    * Generate Configuration Parameters (5/5)
    ********************************************************************************
    Generating Wallet... ok
    Usage: _list_get <list> <index>
    Generating Extract [tibero1] configuration...  ok
    Generating Extract [tibero2] configuration...  ok
    Generating Apply [tibero_tar] configuration...  ok
    Generating LONG/LOB configuration...  ok
    Generating instance map to prs_instance.map ...
    
    
    ********************************************************************************
    * ProSync is installed successfully on Fri, 18 Apr 2025 02:01:32 +0000.
    *
    *   PRS_HOME     = /home/prosync/example
    *   Binary Path  = /home/prosync/example/bin
    *   ProSync User = TAC2TAC
    *
    *   Archived Log Path     = /home/tibero/tibero/tibero7/database/tibero/archive/
    *   Archived Log Format   = log-t%t-r%r-s%s.arc
    *   Initial log sequence# = 9
    *
    *   Archived Log Path     = /home/tibero/tibero/tibero7/database/tibero/archive/
    *   Archived Log Format   = log-t%t-r%r-s%s.arc
    *   Initial log sequence# = 9
    *
    *   Initial change# (TSN) = 94003 
    *
    ********************************************************************************
    
    
    AGENT_CNT=4
    
    AGENT_ID_0=agent1
    AGENT_HOST_0=172.19.0.11
    AGENT_PORT_0=7600
    
    AGENT_ID_1=agent2
    AGENT_HOST_1=172.19.0.12
    AGENT_PORT_1=7700
    
    AGENT_ID_2=agent3
    AGENT_HOST_2=172.19.0.13
    AGENT_PORT_2=7800
    
    AGENT_ID_3=agent4
    AGENT_HOST_3=172.19.0.14
    AGENT_PORT_3=7900
    $ cd $PRS_HOME/install
    $ . prs_install_agent.sh
    ********************************************************************************
    * Agent Install Step (1/4)
    * Check System Parameters 
    ********************************************************************************
    * Checking system type... 
    Linux
    
    * Checking PRS_HOME... 
    PRS_HOME: /home/prosync/example
    
    ********************************************************************************
    * Agent Install Step (2/4)
    * Check install agent config file   [prs_install_agent.cfg]  
    * Check Instance file               [prs_instance.map] 
    ********************************************************************************
    * Checking configuration file... 
    [/home/prosync/example/install/prs_install_agent.cfg] exists.
    
    * Checking Agent configuration... 
    parameter check for Agent[0] Started 
        AGENT_ID: agent1
        AGENT_HOST: 172.19.0.11
        AGENT_PORT: 7600
    parameter check for Agent[0] Done 
    parameter check for Agent[1] Started 
        AGENT_ID: agent2
        AGENT_HOST: 172.19.0.12
        AGENT_PORT: 7700
    parameter check for Agent[1] Done 
    parameter check for Agent[2] Started 
        AGENT_ID: agent3
        AGENT_HOST: 172.19.0.13
        AGENT_PORT: 7800
    parameter check for Agent[2] Done 
    parameter check for Agent[3] Started 
        AGENT_ID: agent4
        AGENT_HOST: 172.19.0.14
        AGENT_PORT: 7900
    parameter check for Agent[3] Done 
    
    * Checking prs_instance.map file... 
    [/home/prosync/example/config/prs_instance.map] exists.
    
    ********************************************************************************
    * Agent Install Step (3/4)
    * Writing agent config file         [/home/prosync/example/install/prs_install_agent.cfg]  
    * Writing Instance file             [/home/prosync/example/config/prs_instance.map] 
    * Total Agent Cnt                   [4] 
    ********************************************************************************
    * Writing all agents.. cnt: 4
    * Writing Agent.. Index:           0
    * Writing Agent.. AGENT_ID:        agent1
    * Writing Agent.. AGENT_HOST:      172.19.0.11
    * Writing Agent.. AGENT_PORT:      7600
    * Writing Agent.. AGENT_CM_GROUP:  
    * Writing Agent.. AGENT_CM_ID:     
    * Writing Agent configuration... 
    File already exists... 
    [/home/prosync/example/config/prs_agent_agent1.cfg]
    Want to Delete ? (Y/N)
    n
    Skip deleteing...
    
    * Writing Agent information... 
    Agent information already exist
    Want to Replace ? (Y/N)
    n
    Skipped... 
    
    
    * Writing Agent.. Index:           1
    * Writing Agent.. AGENT_ID:        agent2
    * Writing Agent.. AGENT_HOST:      172.19.0.12
    * Writing Agent.. AGENT_PORT:      7700
    * Writing Agent.. AGENT_CM_GROUP:  
    * Writing Agent.. AGENT_CM_ID:     
    * Writing Agent configuration... 
    /home/prosync/example/config/prs_agent_agent2.cfg not found. Writing files...
    Done.
    
    * Writing Agent information... 
    
    
    * Writing Agent.. Index:           2
    * Writing Agent.. AGENT_ID:        agent3
    * Writing Agent.. AGENT_HOST:      172.19.0.13
    * Writing Agent.. AGENT_PORT:      7800
    * Writing Agent.. AGENT_CM_GROUP:  
    * Writing Agent.. AGENT_CM_ID:     
    * Writing Agent configuration... 
    /home/prosync/example/config/prs_agent_agent3.cfg not found. Writing files...
    Done.
    
    * Writing Agent information... 
    
    
    * Writing Agent.. Index:           3
    * Writing Agent.. AGENT_ID:        agent4
    * Writing Agent.. AGENT_HOST:      172.19.0.14
    * Writing Agent.. AGENT_PORT:      7900
    * Writing Agent.. AGENT_CM_GROUP:  
    * Writing Agent.. AGENT_CM_ID:     
    * Writing Agent configuration... 
    /home/prosync/example/config/prs_agent_agent4.cfg not found. Writing files...
    Done.
    
    * Writing Agent information... 
    
    
    * Creating var directory...
       * Already Created.
    ********************************************************************************
    * Agent Install Step (4/4)
    * Creating files for CM
    ********************************************************************************
    There's no AGENT_CM_ID, finishing installation
    Agent installation Done.
    #-------------------------------------------------
    # /home/tibero_tar/tibero/tibero7/client/config/tbdsn.tbr
    # Network Configuration File.
    # Generated by gen_tip_for_tac.sh at Thu Apr 17 10:51:54 UTC 2025
    
    #-------------------------------------------------
    # Appended by gen_tip_for_tac.sh at Thu Apr 17 10:51:54 UTC 2025
    
    tibero_tar1=(
        (INSTANCE=(HOST=172.19.0.13)
                  (PORT=8620)
                  (DB_NAME=tibero_tar)
        )
    )
    tibero_tar1priv=(
        (INSTANCE=(HOST=172.19.0.13)
                  (PORT=8621)
                  (DB_NAME=tibero_tar)
        )
    )
    
    #-------------------------------------------------
    # Appended by gen_tip_for_tac.sh at Thu Apr 17 10:51:54 UTC 2025
    
    tibero_tar2=(
        (INSTANCE=(HOST=172.19.0.14)
                  (PORT=8650)
                  (DB_NAME=tibero_tar)
        )
    )
    tibero_tar2priv=(
        (INSTANCE=(HOST=172.19.0.14)
                  (PORT=8651)
                  (DB_NAME=tibero_tar)
        )
    )
    
    tibero_tar=(
        (INSTANCE=(HOST=172.19.0.13)
                  (PORT=8620)
                  (DB_NAME=tibero_tar)
        )
        (INSTANCE=(HOST=172.19.0.14)
                  (PORT=8650)
                  (DB_NAME=tibero_tar)
        )
        #(LOAD_BALANCE=Y)
    )
    
    #-------------------------------------------------
    # /home/tibero/tibero/tibero7/client/config/tbdsn.tbr
    # Network Configuration File.
    # Generated by gen_tip_for_tac.sh at Thu Apr 17 10:19:44 UTC 2025
    
    #-------------------------------------------------
    # Appended by gen_tip_for_tac.sh at Thu Apr 17 10:19:44 UTC 2025
    
    tibero1=(
        (INSTANCE=(HOST=172.19.0.11)
                  (PORT=8620)
                  (DB_NAME=tibero)
        )
    )
    tibero1priv=(
        (INSTANCE=(HOST=172.19.0.11)
                  (PORT=8621)
                  (DB_NAME=tibero)
        )
    )
    
    #-------------------------------------------------
    # Appended by gen_tip_for_tac.sh at Thu Apr 17 10:19:44 UTC 2025
    
    tibero2=(
        (INSTANCE=(HOST=172.19.0.12)
                  (PORT=8650)
                  (DB_NAME=tibero)
        )
    )
    tibero2priv=(
        (INSTANCE=(HOST=172.19.0.12)
                  (PORT=8651)
                  (DB_NAME=tibero)
        )
    )
    
    tibero=(
        (INSTANCE=(HOST=172.19.0.11)
                  (PORT=8620)
                  (DB_NAME=tibero)
        )
        (INSTANCE=(HOST=172.19.0.12)
                  (PORT=8650)
                  (DB_NAME=tibero)
        )
        #(LOAD_BALANCE=Y)
    )
    
    #-------------------------------------------------
    # Appended by gen_tip_for_tac.sh at Thu Apr 17 10:51:54 UTC 2025
    
    tibero_tar1=(
        (INSTANCE=(HOST=172.19.0.13)
                  (PORT=8620)
                  (DB_NAME=tibero_tar)
        )
    )
    tibero_tar1priv=(
        (INSTANCE=(HOST=172.19.0.13)
                  (PORT=8621)
                  (DB_NAME=tibero_tar)
        )
    )
    
    #-------------------------------------------------
    # Appended by gen_tip_for_tac.sh at Thu Apr 17 10:51:54 UTC 2025
    
    tibero_tar2=(
        (INSTANCE=(HOST=172.19.0.14)
                  (PORT=8650)
                  (DB_NAME=tibero_tar)
        )
    )
    tibero_tar2priv=(
        (INSTANCE=(HOST=172.19.0.14)
                  (PORT=8651)
                  (DB_NAME=tibero_tar)
        )
    )
    
    tibero_tar=(
        (INSTANCE=(HOST=172.19.0.13)
                  (PORT=8620)
                  (DB_NAME=tibero_tar)
        )
        (INSTANCE=(HOST=172.19.0.14)
                  (PORT=8650)
                  (DB_NAME=tibero_tar)
        )
        #(LOAD_BALANCE=Y)
    )            
    $ tbsql sys/tibero@tibero_tar1
    tbSQL 7  
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    Connected to Tibero using tibero_tar1.
    
    SQL> 
    ############################################
    #
    # ProSync Installation Parameters
    #
    ############################################
    
    # (Mandatory)
    INSTANCE_ID=TAC2TAC
    PRS_USER=TAC2TAC
    PRS_PWD=TAC2TAC
    
    # (Optional)
    #PRS_TS_NAME=
    #PRS_TS_FILE=
    #PRS_TS_SIZE=
    #PRS_SKIP_USER_CREATE=N
    #PRS_TARGET_MIN_PRIVILEGE=N
    #PRS_LOG_DIR=
    #LOG_BACKUP_DIR=
    #CREATE_DSN_FILE=N
    #DSN_DIR=
    #DSN_FILE=#need DSN_DIR
    
    ############################################
    #
    # ProSync Processes Informations for Instance Map
    #
    ############################################
    ### (Optional)
    AGENT_LIST_DELIMITER=,
    
    ### (Mandatory)
    # Ext process
    ## Ext cnt must be the same as SRC_DB_CNT
    EXT_CNT=2
    EXT_AGENT_ID_LIST_0=agent1,agent2
    EXT_AGENT_ID_LIST_1=agent2,agent1
    
    # Apply process
    APPLY_PORT=7620
    APPLY_AGENT_ID_LIST=agent3
    
    # Llob process
    LLOB_PORT=7630
    LLOB_AGENT_ID_LIST=agent1,agent2
    
    ############################################
    #
    # Source database informations
    #
    ############################################
    
    # (Mandatory)
    SRC_DB_TYPE=TIBERO
    SRC_DB_NAME=tibero
    SRC_INSTALL_USER=sys
    SRC_INSTALL_PWD=tibero
    
    # (Optional)
    #AUTO_ADD_SUPP_LOG=Y
    #SRC_SKIP_TS_CREATE=N
    
    # (Number Of Database Instances)
    SRC_DB_CNT=2
    
    # (Dsn)
    #SRC_DB_REAL_NAME=
    #SRC_DB_IP_0=
    #SRC_DB_PORT_0=
    #SRC_DB_IP_1=
    #SRC_DB_PORT_1=
    
    # (for Cluster, only Extract Needed)
    SRC_DB_ALIAS_0=tibero1
    SRC_DB_ALIAS_1=tibero2
    
    # (for Oracle Logminer only)
    # Oracle 11g or less, use utl_file_dir instead of DICT_FILE_DIR
    #USE_LOGMNR=Y
    #DICT_FILE_DIR=
    
    # (for MySQL only)
    #PRS_EXT_IP=
    
    ############################################
    #
    # Target database informations
    #
    ############################################
    
    # (Mandatory)
    TAR_DB_TYPE=TIBERO
    TAR_DB_NAME=tibero_tar
    TAR_INSTALL_USER=sys
    TAR_INSTALL_PWD=tibero
    
    # (Optional)
    #TAR_SKIP_TS_CREATE=N
    
    # (Number Of Database Instances)
    TAR_DB_CNT=2
    
    # (Dsn)
    #TAR_DB_REAL_NAME=
    #TAR_DB_IP_0=
    #TAR_DB_PORT_0=
    #TAR_DB_IP_1=
    #TAR_DB_PORT_1=
    
    # (for MySQL only)
    #PRS_APPLY_IP=
    
    # (for multi thread)
    #GROUP_NUM=1
    
    # (for TDE(transparent data encryption) synchronization)
    #USE_TDE=N
    $ cd $PRS_HOME/install
    $ . prs_install.sh
    ********************************************************************************
    * Check System Parameters (1/5)
    ********************************************************************************
    Checking system type... Linux
    Checking PRS_HOME... /home/prosync/example
    Checking TB_HOME... /home/tibero/tibero/tibero7
    Checking ORACLE_HOME... not found
    Checking psql ... not available
    Checking psql service ...not found
    
    ********************************************************************************
    * Check Installation Parameters (2/5)
    ********************************************************************************
    Checking configuration file... ok
    Checking prs_instance.map file... ok
    Checking Instance Id from prs_instance.map...
    * instance information for TAC2TAC was not found. It will be written in this script...
    ok
    Checking proecsses infos...
    * Checking Ext processes Informations... EXT_CNT: 2
    * Delimiter: [,]
       * Ext[0] process's Agent Id List 
           * Agent ID[agent1]
           * [agent1] found.
           * Agent ID[agent2]
           * [agent2] found.
       * Ext[1] process's Agent Id List 
           * Agent ID[agent2]
           * [agent2] found.
           * Agent ID[agent1]
           * [agent1] found.
    * Checking Apply process Informations...
    * Checking Apply Port..
       * APPLY_PORT=[7620]
    * Checking Apply process's Agent Id List..
           * Agent ID[agent3]
           * [agent3] found.
           * Agent ID[agent4]
           * [agent4] found.
    * Checking Llob process Informations...
    * Checking Llob Port..
       * LLOB_PORT=[7630]
    * Checking Llob process's Agent Id List..
           * Agent ID[agent1]
           * [agent1] found.
           * Agent ID[agent2]
           * [agent2] found.
    
    Checking INSTANCE_ID... TAC2TAC
    Checking PRS_USER... TAC2TAC
    Checking PRS_TS_NAME... TAC2TAC_ts
    Checking PRS_TS_FILE... TAC2TAC_ts.dtf
    Checking PRS_TS_SIZE... 1G
    Checking PRS_EXT_IP... %
    Checking PRS_APPLY_IP... %
    Checking SRC_DB_CNT... 2
    Checking SRC_DB_TYPE... TIBERO
    Checking SRC_INSTALL_USER... sys
    Checking SRC_DB_NAME... tibero
    Checking source connection(1/2)... ok
    Checking source connection(2/2)... ok
    _list_create: Variable TAR_DB_IP_0 is undefined or empty.
    _list_create: Variable TAR_DB_PORT_0 is undefined or empty.
    Checking TAR_DB_TYPE... TIBERO
    Checking TAR_INSTALL_USER... sys
    Checking TAR_DB_NAME... tibero_tar
    Checking target connection [tibero_tar](1/2)... ok
    Checking target connection [tibero_tar](2/2)... ok
    
    ********************************************************************************
    * Install to Source Database (3/5)
    ********************************************************************************
    Checking archived log mode... ok
    Usage: _list_get <list> <index>
    Checking log mining parameters [tibero1]... ok
    Checking log mining parameters [tibero2]... ok
    Usage: _list_get <list> <index>
    Get Archive log directory [tibero1]... ok
    Get Archive log format [tibero1]... ok
    Get Archive log directory [tibero2]... ok
    Get Archive log format [tibero2]... ok
    Dropping ProSync objects... ok
    Dropping ProSync tablespace... DROP TABLESPACE instance_ts INCLUDING CONTENTS AND DATAFILES;
    
    done
    
    ok
    Creating ProSync tablespace... ok
    Dropping ProSync user... ok
    Creating ProSync user... ok
    Granting privileges... ok
    Granting privileges for trigger... ok
    Creating ProSync internal tables... ok
    Creating ProSync internal package... ok
    Creating ProSync internal trigger... ok
    Prosync user TAC2TAC to uppercase TAC2TACok
    Checking source object file(group num : 1)... ok
    Building source object for TEST%.%... ok
    Adding table supplemental log... 4, and one for prosync
      "TAC2TAC"."PRS_DUMMY_TBL" : Supplemental logging set
      "TEST"."T1" : supplemental log already exists, continue.
      "TEST"."T2" : supplemental log already exists, continue.
      "TEST"."T3" : supplemental log already exists, continue.
      TAC2TAC.PRS_DUMMY_TBL : supplemental log already exists, continue.
    Counting total source objects... 4
    Generating initial DDL history... ok
    Checking initial DDL history... ok
    Insert default value in PRS_DUMMY_TBL...ok
    Querying NLS_CHARACTERSET... UTF8
    Querying NLS_NCHAR_CHARACTERSET... UTF16
    Switching logfile [tibero1]... ok
    Switching logfile [tibero2]... ok
    Usage: _list_get <list> <index>
    Querying current log sequence [tibero1]... 8
    Querying current log sequence [tibero2]... 8
    Querying current snapshot#... 93289
    
    
    ********************************************************************************
    * Install to Target Database (4/5)
    ********************************************************************************
    Dropping ProSync objects... ok
    Dropping ProSync tablespace... DROP TABLESPACE TAC2TAC_ts INCLUDING CONTENTS AND DATAFILES;
    
    done
    
    ok
    Creating ProSync tablespace... ok
    Dropping ProSync user... ok
    Creating ProSync user... ok
    Granting privileges... ok
    Creating ProSync internal tables... ok
    Generating initial construct history [tibero1 (group 1)]... ok
    Generating initial construct history [tibero2 (group 1)]... ok
    Generating initial commit history... ok
    
    ********************************************************************************
    * Generate Configuration Parameters (5/5)
    ********************************************************************************
    Generating Wallet... ok
    Usage: _list_get <list> <index>
    Generating Extract [tibero1] configuration...  ok
    Generating Extract [tibero2] configuration...  ok
    Generating Apply [tibero_tar] configuration...  ok
    Generating LONG/LOB configuration...  ok
    Generating instance map to prs_instance.map ...
    
    
    ********************************************************************************
    * ProSync is installed successfully on Fri, 18 Apr 2025 02:01:32 +0000.
    *
    *   PRS_HOME     = /home/prosync/example
    *   Binary Path  = /home/prosync/example/bin
    *   ProSync User = TAC2TAC
    *
    *   Archived Log Path     = /home/tibero/tibero/tibero7/database/tibero/archive/
    *   Archived Log Format   = log-t%t-r%r-s%s.arc
    *   Initial log sequence# = 9
    *
    *   Archived Log Path     = /home/tibero/tibero/tibero7/database/tibero/archive/
    *   Archived Log Format   = log-t%t-r%r-s%s.arc
    *   Initial log sequence# = 9
    *
    *   Initial change# (TSN) = 94003 
    *
    ********************************************************************************
    
    
    total 36
    drwxr-xr-x 3 tibero tibero 4096 Apr 18 02:15 ./
    drwxr-xr-x 8 tibero tibero 4096 Apr 18 02:24 ../
    -rw-r--r-- 1 tibero tibero  534 Apr 18 02:15 TAC2TAC_apply1.cfg
    -rw-r--r-- 1 tibero tibero  339 Apr 18 02:15 prs_adm.cfg
    -rw-r--r-- 1 tibero tibero  353 Apr 18 02:15 prs_agent_agent3.cfg
    -rw-r--r-- 1 tibero tibero  353 Apr 18 02:15 prs_agent_agent4.cfg
    -rw-r--r-- 1 tibero tibero 1262 Apr 18 02:07 prs_instance.map
    drwxr-xr-x 2 tibero tibero 4096 Apr 17 10:51 templates/
    -rw-r--r-- 1 tibero tibero    5 Feb  5 04:59 variant
    # var directory tree 예시
    .
    ├── admin
    │   └── log
    ├── agent
    │   ├── agent1
    │   └── agent2
    └── TAC2TAC
        ├── alloc
        ├── log
        ├── lr1
        ├── path
        └── sam
    

    Extract Parameters

    hashtag
    ARCHIVE_LOG_DIR

    ARCHIVE_LOG_DIR specifies the directory where the archive logs are stored. It must be specified as an absolute path.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    ARCHIVE_LOG_FORMAT

    ARCHIVE_LOG_FORMAT specifies the archived log file format. Supported formats are %r:RESETLOGS_CHANGE#, %s:SEQUENCE#, %S:8byte SEQUENCE# padded with 0, and %t:THREAD#.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    BINLOG_INIT_POSITION

    BINLOG_INIT_POSITION specifies the starting position of mysql binlog.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    COL_SAM_TEMPLATE

    The COL_SAM_TEMPLATE parameter sets the path to the user-defined template file to be used when outputting column content for DML statements. It works when SQL_REDO_MODE is set to N. When logging DML statements, if column definitions are present in the COL_SAM_TEMPLATE, ProSync logs the column information to the SAM file according to that template format.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    CONNECT_TO_APPLY_CHECK_INTERVAL

    CONNECT_TO_APPLY_CHECK_INTERVAL specifies the interval at which the connection is attempted when the connection between ext and apply is lost.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    CONN_MAX

    CONN_MAX specifies the max number of connections between processes.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    DICT_FILE_DIR

    DICT_FILE_DIR specifies the directory where user wants to make dictfile while using oracle logminer version.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    DSN_DIR

    DSN_DIR specifies the directory where the dsn file located. It must be specified as an absolute path.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    DSN_FILE

    DSN_FILE specifies name of dsn file.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    DUMMY_LOG_SEND_INTERVAL_COMMIT_TSN

    DUMMY_LOG_SEND_INTERVAL_COMMIT_TSN specifies the interval of sending dummy tx to prevent synchronization delay in TAC and RAC.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    DUMMY_TX_INTERVAL

    DUMMY_TX_INTERVAL specifies instance status check interval (in seconds) in a cluster database environment. The extract process does not perform status checks at each interval. The check occurs at the set interval from the time when there are no more redo or archive logs to read (no new logs are generated).

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    ENABLE_NETWORK_COMPRESS

    ENABLE_NETWORK_COMPRESS specifies whether to compress data when sending data from the extract process to the apply process. If set to 'Y', performance may be affected due to the compress/decompress process when sending/receiving data. This is useful when sending large amounts of data across a large network.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    ENABLE_NETWORK_ENCRYPT

    ENABLE_NETWORK_ENCRYPT specifies whether to encrypt data when sending data from the extract process to the apply process. If set to 'Y', data is sent using the SSL protocol.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    EXCLUDE_USER

    EXCLUDE_USER specifies the name of a user to be excluded from extract operations. If bi-directional synchronization is used, enter a ProSync user name that uses reverse directional synchronization.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    EXTRACT_ARCHIVE_LOG_ONLY

    EXTRACT_ARCHIVE_LOG_ONLY specifies to only extract archived log. If set to 'Y', redo log is archived and cannot be extracted until a new archived log is created.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    EXTRACT_NUM

    EXTRACT_NUM specifies the instance number of the source database. It must be greater than or equal to 1. For a database cluster, each extract process must be assigned a different number in sequential order (1, 2, 3...).

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    EXT_TO_APPLY

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    EXT_TO_SAM

    This parameter sets whether to log statements that are passed from the EXT process to the APPLY process into the SAM file. (Y/N)

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    INSTANCE_FAILURE_CHECK_INTERVAL

    INSTANCE_FAILURE_CHECK_INTERVAL specifies instance status check interval (in seconds) in a cluster database environment. The extract process does not perform status checks at each interval. The check occurs at the set interval from the time when there are no more redo or archive logs to read (no new logs are generated).

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    LOG_BACKUP_DIR

    LOG_BACKUP_DIR specifies the directory where the ProSync log files are backed up. It must be specified as an absolute path.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    LOG_BACKUP_SIZE

    LOG_BACKUP_SIZE specifies the maximum size of all backup files in the process. If this limit is exceeded, the oldest log files in the directory are deleted.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    LOG_DIR

    LOG_DIR specifies the directory where the ProSync log files are stored. It must be specified as an absolute path.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    LOG_FILE_SIZE

    LOG_FILE_SIZE specifies the maximum log file size. If a log file exceeds this limit, it is moved to the backup directory and a new log file is created.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    LOG_LEVEL

    LOG_LEVEL specifies the log level of the process. A higher log-level produces more detailed logs.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    LOG_SWITCH_INTERVAL

    LOG_SWITCH_INTERVAL specifies interval of log switch.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    LR_LOG_BACKUP_DIR

    LR_LOG_BACKUP_DIR specifies the directory where the LR_LOG files of ext process are backed up. It must be specified as an absolute path.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    LR_LOG_BACKUP_SIZE

    LR_LOG_BACKUP_SIZE specifies the maximum size of LR_LOG backup files of ext process. If this limit is exceeded, the oldest LR_LOG files in the directory are deleted.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    LR_LOG_DIR

    LR_LOG_DIR specifies the directory where the LR_LOG files are stored. It must be specified as an absolute path.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    LR_LOG_FILE_SIZE

    LR_LOG_FILE_SIZE specifies the maximum LR_LOG file size of ext process. If a LR_LOG file exceeds this limit, it is moved to the backup directory and a new LR_LOG file is created.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    LR_STOP_AT_CORRUPTED_LCR_0

    LR_STOP_AT_CORRUPTED_LCR_0 determines whether to stop when extracting a corrupted LCR for a table with object id and segment id equal to 0

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    LR_STOP_AT_CORRUPTED_LCR_ALL

    LR_STOP_AT_CORRUPTED_LCR_ALL determines whether to stop when extracting all types of corrupted LCR

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    LR_STOP_AT_CORRUPTED_LCR_TARGET

    LR_STOP_AT_CORRUPTED_LCR_TARGET determines whether to stop when a corrupted LCR is extracted for the synchronization table

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    LR_TRACE_LVL

    LR_TRACE_LVL specifies the logging level of the log reader. A higher log-level produces more detailed logs.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    LR_WARN_AT_CORRUPTED_LCR_0

    LR_WARN_AT_CORRUPTED_LCR_0 determines whether the log type of a corrupted LCR with object id and segment id equal to 0 will be [W] or [F]

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    LR_WARN_AT_CORRUPTED_LCR_ALL

    LR_WARN_AT_CORRUPTED_LCR_ALL determines whether the log type for all types of corrupted LCR will be [W] or [F]

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    LR_WARN_AT_CORRUPTED_LCR_TARGET

    LR_WARN_AT_CORRUPTED_LCR_TARGET determines whether the log type of a corrupted LCR for the synchronization table will be [W] or [F]

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    MYSQLBINLOG_RETRY_CNT

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    MYSQLBINLOG_RETRY_INTERVAL

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    MYSQL_BINLOG_PREFIX

    MYSQL_BINLOG_PREFIX specifies the prefix of mysql binlog file name.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    NETWORK_COMPRESS_LEVEL

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    OCI_DRIVER

    OCI_DRIVER specifies a path to the client library used to access a database. An absolute path must be specified. for Oracle, enter a path to the libclntsh.so file.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    ODBC_DRIVER

    ODBC_DRIVER specifies a path to the client library used to access a database. An absolute path must be specified. Set a path to the proper library file.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    PQ_DRIVER

    PQ_DRIVER specifies a path to the pq library used to access a database. An absolute path must be specified. For Tibero, set a path to the libpq.so file.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    PQ_REP_CONN_NAME

    PQ_REP_CONN_NAME specifies the repliucation connection name.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    PREFETCH_SIZE

    PREFETCH_SIZE specifies the number of rows to fetch for each oci fetch call. This parameter is used only in oracle logminer version.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    PRS_PROC_AGENT_CONNECTION_TIMEOUT

    connection timeout from process to agent. if a process cannot connect to agent while this timeout, kill itself

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    PRS_PWD

    PRS_PWD specifies the database user password. If the password is encrypted, append the string '#encrypted'.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    PRS_USER

    PRS_USER specifies the database user.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    REPO_RESOURCE_INSERT_INTERVAL

    This parameter decides how often to insert resource data into repoDB.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    RESUME_WAIT_TIME

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    ROLLBACK_OBJECT_IDS

    If a transaction references any object ID listed in this parameter, skip the entire transaction.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    SAM_BACKUP_DIR

    SAM_BACKUP_DIR specifies the directory where the SAM files of ext process are backed up. It must be specified as an absolute path.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    SAM_BACKUP_SIZE

    SAM_BACKUP_SIZE specifies the maximum size of SAM backup files of ext process. If this limit is exceeded, the oldest SAM files in the directory are deleted.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    SAM_BIND_VALUE

    SAM_BIND_VALUE

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    SAM_DIR

    SAM_DIR specifies the directory where the sam files are stored. It must be specified as an absolute path.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    SAM_FILE_SIZE

    SAM_FILE_SIZE specifies the maximum SAM file size of ext process. If a SAM file exceeds this limit, it is moved to the backup directory and a new SAM file is created.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    SAM_LOG_PREFIX

    SAM_LOG_PREFIX specifies whether to include timestamp and thread information for each query in the SAM files, similar to how prosync logging works. If set to 'Y', this information is prepended to each row in the SAM files. If set to 'N', the timestamp and thread information is not included on each row.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    SQL_REDO_MODE

    The SQL_REDO_MODE parameter specifies whether to log the full DML/DDL statements into the SAM files. Y: The DML statements are logged row-by-row into the SAM files. (This is the default setting). N: The DML statements are not logged row-by-row into the SAM files.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    SRC_DB_IP

    SRC_DB_IP specifies the database IP Address.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    SRC_DB_NAME

    SRC_DB_NAME specifies the name(Alias) of the source database. For TIBERO, UPDB, or K-DB, use the value specified in the dsn file. For ORACLE, use the value specified in the tnsname file.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    SRC_DB_PORT

    SRC_DB_PORT specifies the database port.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    SRC_DB_TYPE

    SRC_DB_TYPE specifies the type of the source database to extract data from. Options are TIBERO, UPDB, KDB, or ORACLE.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    SRC_LOCAL_SID

    SRC_LOCAL_SID indicates specified instance name of the source database in RAC or TAC.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    STMT_SAM_TEMPLATE

    The STMT_SAM_TEMPLATE parameter sets the path to the user-defined template file to be used when logging statement (DML/DDL) content to the SAM file. It works when SQL_REDO_MODE is set to N. ProSync reads the template from the specified path and logs the DDL and DML content to the SAM file according to that template format.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    TDE_FOR_EXT

    TDE_FOR_EXT specifiese whether use data decryption from source database

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    TDE_FOR_TABLESPACE

    TDE_FOR_TABLESPACE specifiese whether use tablespace decryption from source database

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    TDE_HSM_LIB_FILE

    Absolute library path with the library file name. It is used for linking with an HSM device.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    TDE_HSM_PIN

    pin value for HSM. It is used for linking with an HSM device.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    TDE_HSM_USE_WRAPPING

    Option to use the PKCS #11 wrapping key option for linking an HSM device.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    TDE_USE_HSM

    Option to use Hardware Security Module (HSM) to save data encryption keys.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    TDE_WALLET_FILE

    TDE_WALLET_FILE specifies the wallet file name of source db including absolute path

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    TDE_WALLET_PWD

    TDE_WALLET_PWD specifies the password of wallet file for tde

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    TX_FILTER_KEY

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    TX_SAM_TEMPLATE

    The TX_SAM_TEMPLATE parameter sets the path to the user-defined template file to be used when outputting transactions to the SAM file. It works when SQL_REDO_MODE is set to N. ProSync reads the template from the specified path whenever a transaction encounters a commit, and logs the transaction content to the SAM file according to that template format.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    USE_LOGMNR

    USE_LOGMNR specifies whether to use oracle logminer or to use oracle log reader, when analyzing redo logs.

    hashtag
    Parameter Format

    Property
    Description

    1 - INT32_MAX

    0 - 3600

    32 - 1024

    10 - UINT64_MAX

    1 - 1000

    1 - 1024

    5 - 3600

    0 - 128G

    1M - 1G

    1 - 5

    0 - INT32_MAX

    0 - 128G

    1M - 16G

    1 - 5

    0 - 10000

    1 - 120

    0 - 9

    1 - UINT32_MAX

    0 - 86400

    60 - 3600

    1 - 120

    0 - 128G

    SAM_BIND_VALUE specifies whether to retain the values of the query in SAM files. If set to 'Y', the specific values of the query are retained. If set to 'N', every value in the query is replaced with '?'.

    1M - 16G

    Parameter type

    path

    Default Value

    ""

    Class

    Mandatory, Static

    Range

    Parameter type

    String

    Default Value

    "log-t%t-r%r-s%s.arc"

    Class

    Mandatory, Static

    Parameter type

    Integer

    Default Value

    120

    Class

    Optional, Static

    Parameter type

    path

    Default Value

    "/"

    Class

    Optional, Static

    Parameter type

    Integer

    Default Value

    0

    Class

    Optional, Static

    Parameter type

    Integer

    Default Value

    128

    Class

    Optional, Static

    Parameter type

    path

    Default Value

    "/"

    Class

    Optional, Static

    Parameter type

    path

    Default Value

    ""

    Class

    Optional, Static

    Parameter type

    String

    Default Value

    ""

    Class

    Optional, Static

    Parameter type

    Integer

    Default Value

    1000

    Class

    Optional, Static

    Parameter type

    Integer

    Default Value

    5

    Class

    Optional, Static

    Parameter type

    Boolean

    Default Value

    N

    Class

    Optional, Dynamic

    Parameter type

    Boolean

    Default Value

    N

    Class

    Optional, Static

    Parameter type

    String

    Default Value

    ""

    Class

    Optional, Static

    Parameter type

    Boolean

    Default Value

    N

    Class

    Optional, Static

    Parameter type

    Integer

    Default Value

    1

    Class

    Mandatory, Static

    Parameter type

    Boolean

    Default Value

    Y

    Class

    Optional, Static

    Parameter type

    Boolean

    Default Value

    N

    Class

    Optional, Dynamic

    Parameter type

    Integer

    Default Value

    5

    Class

    Optional, Static

    Parameter type

    path

    Default Value

    ""

    Class

    Mandatory, Static

    Parameter type

    Integer

    Default Value

    0

    Class

    Optional, Dynamic

    Parameter type

    path

    Default Value

    ""

    Class

    Mandatory, Static

    Parameter type

    Integer

    Default Value

    104857600

    Class

    Optional, Dynamic

    Parameter type

    Integer

    Default Value

    3

    Class

    Mandatory, Dynamic

    Parameter type

    Integer

    Default Value

    0

    Class

    Optional, Static

    Parameter type

    path

    Default Value

    "/"

    Class

    Optional, Static

    Parameter type

    Integer

    Default Value

    0

    Class

    Optional, Static

    Parameter type

    path

    Default Value

    "/"

    Class

    Optional, Static

    Parameter type

    Integer

    Default Value

    17179869184

    Class

    Optional, Static

    Parameter type

    Boolean

    Default Value

    N

    Class

    Optional, Static

    Parameter type

    Boolean

    Default Value

    N

    Class

    Optional, Static

    Parameter type

    Boolean

    Default Value

    N

    Class

    Optional, Static

    Parameter type

    Integer

    Default Value

    2

    Class

    Optional, Dynamic

    Parameter type

    Boolean

    Default Value

    Y

    Class

    Optional, Static

    Parameter type

    Boolean

    Default Value

    Y

    Class

    Optional, Static

    Parameter type

    Boolean

    Default Value

    N

    Class

    Optional, Static

    Parameter type

    Integer

    Default Value

    3

    Class

    Optional, Static

    Parameter type

    Integer

    Default Value

    3

    Class

    Optional, Static

    Parameter type

    String

    Default Value

    "bin"

    Class

    Optional, Static

    Parameter type

    Integer

    Default Value

    1

    Class

    Optional, Static

    Parameter type

    path

    Default Value

    "/"

    Class

    Optional, Static

    Parameter type

    path

    Default Value

    "/"

    Class

    Optional, Static

    Parameter type

    path

    Default Value

    ""

    Class

    Optional, Static

    Parameter type

    String

    Default Value

    ""

    Class

    Optional, Static

    Parameter type

    Integer

    Default Value

    1

    Class

    Optional, Static

    Parameter type

    Integer

    Default Value

    180

    Class

    Optional, Static

    Parameter type

    String

    Default Value

    "#encrypted"

    Class

    Mandatory, Static

    Parameter type

    String

    Default Value

    ""

    Class

    Mandatory, Static

    Parameter type

    Integer

    Default Value

    60

    Class

    Optional, Static

    Parameter type

    Integer

    Default Value

    3

    Class

    Optional, Static

    Parameter type

    desc

    Default Value

    "()"

    Class

    Optional, Static

    Parameter type

    path

    Default Value

    "/"

    Class

    Optional, Static

    Parameter type

    Integer

    Default Value

    0

    Class

    Optional, Dynamic

    Parameter type

    Boolean

    Default Value

    Y

    Class

    Optional, Dynamic

    Parameter type

    path

    Default Value

    "/"

    Class

    Optional, Static

    Parameter type

    Integer

    Default Value

    17179869184

    Class

    Optional, Dynamic

    Parameter type

    Boolean

    Default Value

    Y

    Class

    Optional, Dynamic

    Parameter type

    Boolean

    Default Value

    Y

    Class

    Optional, Static

    Parameter type

    String

    Default Value

    "localhost"

    Class

    Optional, Static

    Parameter type

    String

    Default Value

    ""

    Class

    Mandatory, Static

    Parameter type

    String

    Default Value

    "7600"

    Class

    Optional, Static

    Parameter type

    String

    Default Value

    "TIBERO"

    Class

    Mandatory, Static

    Parameter type

    String

    Default Value

    ""

    Class

    Optional, Static

    Parameter type

    path

    Default Value

    "/"

    Class

    Optional, Static

    Parameter type

    Boolean

    Default Value

    N

    Class

    Optional, Static

    Parameter type

    Boolean

    Default Value

    N

    Class

    Optional, Static

    Parameter type

    String

    Default Value

    ""

    Class

    Optional, Static

    Parameter type

    String

    Default Value

    ""

    Class

    Optional, Static

    Parameter type

    Boolean

    Default Value

    Y

    Class

    Optional, Static

    Parameter type

    Boolean

    Default Value

    N

    Class

    Optional, Static

    Parameter type

    String

    Default Value

    "/"

    Class

    Optional, Static

    Parameter type

    String

    Default Value

    "#encrypted"

    Class

    Optional, Static

    Parameter type

    desc

    Default Value

    "(FILTER DEFAULT)"

    Class

    Optional, Static

    Parameter type

    path

    Default Value

    "/"

    Class

    Optional, Static

    Parameter type

    Boolean

    Default Value

    N

    Class

    Optional, Static

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Apply Parameters

    hashtag
    APPLY_DML_ERR_REPORT_CNT

    Number of retries to apply dml before leaving a log to report file.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    APPLY_NUM

    APPLY_NUM specifies the number of the target database. It must be greater than or equal to 1. In 1:N topology, each apply process must be assigned a different number in sequential order (1, 2, 3...).

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    APPLY_REPORT_BACKUP_DIR

    APPLY_REPORT_BACKUP_DIR specifies the directory where the report files of ext process are backed up. It must be specified as an absolute path.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    APPLY_REPORT_BACKUP_SIZE

    APPLY_REPORT_BACKUP_SIZE specifies the maximum size of report backup files of ext process. If this limit is exceeded, the oldest report files in the directory are deleted.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    APPLY_REPORT_DIR

    APPLY_REPORT_DIR specifies the directory where the report files are stored. It must be specified as an absolute path.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    APPLY_REPORT_FILE_SIZE

    APPLY_REPORT_FILE_SIZE specifies the maximum report file size of ext process. If a report file exceeds this limit, it is moved to the backup directory and a new report file is created.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    APPLY_TO_DB

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    APPLY_TO_REPORT

    Determines whether to leave a log on the report file or not.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    APPLY_TO_SAM

    This parameter sets whether to log the statements that the APPLY process applies to the database into the SAM file. (Y/N)

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    BATCH_MEM_SIZE

    This parameter determines the maximum value of LCR data to be stored for array bind.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    CHUNK_TOTAL_SIZE

    Apply control thread stops receiving msg from ext when total chunk size of un-constructed exceeded.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    CLIENT_DRIVER

    CLIENT_DRIVER specifies a path to the client library used to access a database. An absolute path must be specified. For Tibero, set a path to the libtbclnt.so file. And for Oracle, enter a path to the libclntsh.so file.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    COL_SAM_TEMPLATE

    The COL_SAM_TEMPLATE parameter sets the path to the user-defined template file to be used when outputting column content for DML statements. It works when SQL_REDO_MODE is set to N. When logging DML statements, if column definitions are present in the COL_SAM_TEMPLATE, ProSync logs the column information to the SAM file according to that template format.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    CONN_MAX

    CONN_MAX specifies the max number of connections between processes.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    DDL

    DDL specifies DDL filtering options. For more information, refer to ProSync DDL RULE in Administrator's Guide.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    DISCARD_BACKUP_DIR

    DISCARD_BACKUP_DIR specifies the directory where the discard files of ext process are backed up. It must be specified as an absolute path.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    DISCARD_BACKUP_SIZE

    DISCARD_BACKUP_SIZE specifies the maximum size of discard backup files of ext process. If this limit is exceeded, the oldest discard files in the directory are deleted.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    DISCARD_DDL_BACKUP_DIR

    DISCARD_DDL_BACKUP_DIR specifies the directory where the discard files of ext process are backed up. It must be specified as an absolute path.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    DISCARD_DDL_BACKUP_SIZE

    DISCARD_DDL_BACKUP_SIZE specifies the maximum size of discard backup files of ext process. If this limit is exceeded, the oldest discard files in the directory are deleted.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    DISCARD_DDL_FILE_DIR

    DISCARD_DDL_FILE_DIR specifies the directory where the discard files are stored. It must be specified as an absolute path.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    DISCARD_DDL_FILE_SIZE

    DISCARD_DDL_FILE_SIZE specifies the maximum discard file size of apply process. If a discard file exceeds this limit, it is moved to the backup directory and a new discard file is created.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    DISCARD_DDL_FILE_YN

    Y to make a file of error DDL that discarded during sync.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    DISCARD_DDL_YN

    Toggle Discard DDL feature.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    DISCARD_EC

    List error codes to ignore during sync. (max 256 codes)

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    DISCARD_FILE_DIR

    DISCARD_FILE_DIR specifies the directory where the discard files are stored. It must be specified as an absolute path.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    DISCARD_FILE_SIZE

    DISCARD_FILE_SIZE specifies the maximum discard file size of ext process. If a discard file exceeds this limit, it is moved to the backup directory and a new discard file is created.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    DISCARD_FILE_YN

    Y to make a file of error codes that discarded during sync.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    DISCARD_YN

    Toggle Discard feature.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    DML_WAIT_TIMEOUT

    This parameter determines retry interval when DML fails

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    DSN_DIR

    DSN_DIR specifies the directory where the dsn file located. It must be specified as an absolute path.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    DSN_FILE

    DSN_FILE specifies name of dsn file.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    GROUP_NUM

    GROUP_NUM specifies the number of replay groups in multi-grouping mode.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    KEY_VIOLATION_RETRY_CNT

    The number of retries in a fault situation absence of primary key. Default value means infinite retries.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    LCT_UPDATE_INTERVAL

    This parameter decides how often to update the target meta tables PRS_COMMITTED_TX_LIST and PRS_LCT. The unit is in seconds.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    LEADING_PRS_USER

    a leading prosync user in history topology

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    LISTENER_PORT

    LISTENER_PORT specifies the port number used by each process. All processes on the same machine must use different ports.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    LLOB_APPLY_MODE

    LLOB_APPLY_MODE specifies how a LONG/LOB column is synchronized. If set to 'SKIP', the column is not synchronized; if set to 'SYNC', the column is synchronized during DML execution.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    LOG_BACKUP_DIR

    LOG_BACKUP_DIR specifies the directory where the ProSync log files are backed up. It must be specified as an absolute path.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    LOG_BACKUP_SIZE

    LOG_BACKUP_SIZE specifies the maximum size of all backup files in the process. If this limit is exceeded, the oldest log files in the directory are deleted.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    LOG_DIR

    LOG_DIR specifies the directory where the ProSync log files are stored. It must be specified as an absolute path.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    LOG_FILE_SIZE

    LOG_FILE_SIZE specifies the maximum log file size. If a log file exceeds this limit, it is moved to the backup directory and a new log file is created.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    LOG_LEVEL

    LOG_LEVEL specifies the log level of the process. A higher log-level produces more detailed logs.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    MAP

    MAP specifies the mapping information of the target table for synchronization. For more information, refer to ProSync Administrator's Guide.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    MAP_SKIP_UPD_WHERE

    MAP_SKIP_UPD_WHERE specifies where clause or the set clause when check skipping update dml. If set 'Y', prosync skip using where clause and otherwise, prosync skip using set clause.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    MEMORY_CTRL_RESUME_SIZE

    Apply control threads resumes the receiving of msg from ext when total size of un-committed but fully constructed tx is smaller than this parameter.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    MEMORY_CTRL_STOP_SIZE

    Apply control thread stops receiving msg from ext when total size of un-committed but fully constructed tx is larger than this parameter.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    MERGE_BLOCK_CNT

    BLOCK EXT STMT COUNT

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    MERGE_RESUME_CNT

    RESUME EXT STMT COUNT

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    OCI_DRIVER

    OCI_DRIVER specifies a path to the client library used to access a database. An absolute path must be specified. for Oracle, enter a path to the libclntsh.so file.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    ODBC_DRIVER

    ODBC_DRIVER specifies a path to the client library used to access a database. An absolute path must be specified. Set a path to the proper library file.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    PRS_PROC_AGENT_CONNECTION_TIMEOUT

    connection timeout from process to agent. if a process cannot connect to agent while this timeout, kill itself

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    PRS_PWD

    PRS_PWD specifies the database user password. If the password is encrypted, append the string '#encrypted'.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    PRS_USER

    PRS_USER specifies the database user.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    PR_MODE

    Parallel Replay object id mode

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    RECORD_HISTORY

    records history when DML occurred.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    REPLAY_THREAD_CNT

    Number of replay thread cnt when starting prosync.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    REPO_RESOURCE_INSERT_INTERVAL

    This parameter decides how often to insert resource data into repoDB.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    SAM_BACKUP_DIR

    SAM_BACKUP_DIR specifies the directory where the SAM files of ext process are backed up. It must be specified as an absolute path.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    SAM_BACKUP_SIZE

    SAM_BACKUP_SIZE specifies the maximum size of SAM backup files of ext process. If this limit is exceeded, the oldest SAM files in the directory are deleted.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    SAM_BIND_VALUE

    SAM_BIND_VALUE

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    SAM_DIR

    SAM_DIR specifies the directory where the sam files are stored. It must be specified as an absolute path.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    SAM_FILE_SIZE

    SAM_FILE_SIZE specifies the maximum SAM file size of ext process. If a SAM file exceeds this limit, it is moved to the backup directory and a new SAM file is created.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    SAM_LOG_PREFIX

    SAM_LOG_PREFIX specifies whether to include timestamp and thread information for each query in the SAM files, similar to how prosync logging works. If set to 'Y', this information is prepended to each row in the SAM files. If set to 'N', the timestamp and thread information is not included on each row.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    SQL_REDO_MODE

    The SQL_REDO_MODE parameter specifies whether to log the full DML/DDL statements into the SAM files. Y: The DML statements are logged row-by-row into the SAM files. (This is the default setting). N: The DML statements are not logged row-by-row into the SAM files.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    SRC_DB_CHARSET

    SRC_DB_CHARSET specifies the character set of the source database.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    SRC_DB_CNT

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    SRC_DB_NCHARSET

    SRC_DB_NCHARSET specifies the national character set of the source database.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    STMT_SAM_TEMPLATE

    The STMT_SAM_TEMPLATE parameter sets the path to the user-defined template file to be used when logging statement (DML/DDL) content to the SAM file. It works when SQL_REDO_MODE is set to N. ProSync reads the template from the specified path and logs the DDL and DML content to the SAM file according to that template format.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    TAR_DB_NAME

    TAR_DB_NAME specifies the name(Alias) of the target database. For TIBERO, UPDB, or K-DB, use the value specified in the dsn file. For ORACLE, use the value specified in the tnsname file.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    TAR_DB_TYPE

    TAR_DB_TYPE specifies the type of the target database to apply data to. Options are TIBERO, UPDB, KDB, or ORACLE.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    TDE_FOR_APPLY

    TDE_FOR_APPLY specifiese whether use data decryption from source database

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    TDE_WALLET_FILE

    TDE_WALLET_FILE specifies the wallet file name of source db including absolute path

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    TDE_WALLET_PWD

    TDE_WALLET_PWD specifies the password of wallet file for tde

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    TX_HASH_FILE_CNT

    TX_HASH_FINE_CNT determines how many tx_hash_files to keep in PRS_TX_DIR

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    TX_HASH_FILE_DIR

    TX_HASH_FILE_DIR specifies the directory where the ProSync tx hashes are saved. It must be specified as an absolute path.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    TX_HASH_FILE_MODE

    TX_HASH_FILE_MODE determines how to control tx_hash_files

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    TX_HASH_FILE_TOTAL_SIZE

    TX_HASH_FILE_TOTAL_SIZE determines max size of every tx_hash_files to keep in PRS_TX_DIR

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    TX_HASH_SIZE

    TX_HASH_SIZE specifies the maximum memory size that the apply process can use for transaction data. If this size is not sufficient, there will be frequent swapping between memory and disk which will affect performance.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    TX_SAM_TEMPLATE

    The TX_SAM_TEMPLATE parameter sets the path to the user-defined template file to be used when outputting transactions to the SAM file. It works when SQL_REDO_MODE is set to N. ProSync reads the template from the specified path whenever a transaction encounters a commit, and logs the transaction content to the SAM file according to that template format.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    UPDATE_LCT_WHEN_ADD_HIST

    UPDATE_LCT_WHEN_SWTICH_LOG determines whether to execute UPDATE_LCT or not when a replay thread inserts ADD_CONST_HIST information.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    USE_BATCH_MODE

    This parameter determines whether the replay thread use the array bind or not.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    USE_LOGMNR

    USE_LOGMNR specifies whether to use oracle logminer or to use oracle log reader, when analyzing redo logs.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    USE_ONLY_INSERT_BATCH

    use batch mode for insert only

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    USE_PK_FOR_WHERE

    USE_PK_FOR_WHERE specifiese whether use only PK columns when replay thread generate and bind the where clause of dml(update and delete) or not.

    hashtag
    Parameter Format

    Property
    Description

    hashtag
    VERIFY_TIMEOUT

    time interval to check whether child process is dead or not.

    hashtag
    Parameter Format

    Property
    Description

    hashtag

    1 - 1024

    0 - 128G

    1M - 1G

    1024 - UINT64_MAX

    1 - UINT64_MAX

    32 - 1024

    0 - 128G

    0 - 128G

    1M - 1G

    1M - 1G

    1 - 1048576

    1 - 20

    0 - UINT16_MAX

    1 - INT32_MAX

    1024 - 65535

    0 - 128G

    1M - 1G

    1 - 5

    1 - UINT64_MAX & MEMORY_CTRL_RESUME_SIZE < MEMORY_CTRL_STOP_SIZE

    1 - UINT64_MAX & MEMORY_CTRL_RESUME_SIZE < MEMORY_CTRL_STOP_SIZE

    1 - UINT32_MAX & MERGE_RESUME_CNT < MERGE_BLOCK_CNT

    1 - UINT32_MAX & MERGE_RESUME_CNT < MERGE_BLOCK_CNT

    0 - 86400

    1 - 20

    60 - 3600

    0 - 128G

    SAM_BIND_VALUE specifies whether to retain the values of the query in SAM files. If set to 'Y', the specific values of the query are retained. If set to 'N', every value in the query is replaced with '?'.

    1M - 16G

    "ASCII", "US7ASCII", "EUCKR", "KO16KSC5601", "MSWIN949","KO16MSWIN949", "UTF8", "AL32UTF8", "UTF16", "AL16UTF16", "SJIS", "JA16SJIS", "JA16SJISTILDE", "JA16EUC", "JA16EUCTILDE", "GBK", "ZHS16GBK", "VN8VN3", "WE8MSWIN1252", "ZHT16HKSCS", "CL8MSWIN1251", "WE8ISO8859P1", "EE8ISO8859P2", "WE8ISO8859P9", "WE8ISO8859P15", "CL8KOI8R", "CL8ISO8859P5", "RU8PC866", "TH8TISASCII", "EL8MSWIN1253", "EL8ISO8859P7", "AR8MSWIN1256", "AR8ISO8859P6"

    1 - 32

    0 - 32

    0 - 1000G

    1M - 32G

    1 - 3600

    Parameter type

    Integer

    Default Value

    20

    Class

    Optional, Static

    Range

    Parameter type

    Integer

    Default Value

    1

    Class

    Mandatory, Static

    Parameter type

    path

    Default Value

    "/"

    Class

    Optional, Static

    Parameter type

    Integer

    Default Value

    0

    Class

    Optional, Dynamic

    Parameter type

    path

    Default Value

    "/"

    Class

    Optional, Static

    Parameter type

    Integer

    Default Value

    104857600

    Class

    Optional, Dynamic

    Parameter type

    Boolean

    Default Value

    Y

    Class

    Optional, Static

    Parameter type

    Boolean

    Default Value

    Y

    Class

    Optional, Static

    Parameter type

    Boolean

    Default Value

    N

    Class

    Optional, Dynamic

    Parameter type

    Integer

    Default Value

    10485760

    Class

    Optional, Static

    Parameter type

    Integer

    Default Value

    1073741824

    Class

    Optional, Static

    Parameter type

    path

    Default Value

    ""

    Class

    Optional, Static

    Parameter type

    path

    Default Value

    "/"

    Class

    Optional, Static

    Parameter type

    Integer

    Default Value

    128

    Class

    Optional, Static

    Parameter type

    desc

    Default Value

    "(INCLUDE DEFAULT, TYPE=('ALTER TABLE','TRUNCATE TABLE'))"

    Class

    Mandatory, Static

    Parameter type

    path

    Default Value

    "/"

    Class

    Optional, Static

    Parameter type

    Integer

    Default Value

    0

    Class

    Optional, Dynamic

    Parameter type

    path

    Default Value

    "/"

    Class

    Optional, Static

    Parameter type

    Integer

    Default Value

    0

    Class

    Optional, Dynamic

    Parameter type

    path

    Default Value

    "/"

    Class

    Optional, Static

    Parameter type

    Integer

    Default Value

    104857600

    Class

    Optional, Dynamic

    Parameter type

    Boolean

    Default Value

    N

    Class

    Optional, Dynamic

    Parameter type

    Boolean

    Default Value

    N

    Class

    Optional, Static

    Parameter type

    desc

    Default Value

    "()"

    Class

    Optional, Static

    Parameter type

    path

    Default Value

    "/"

    Class

    Optional, Static

    Parameter type

    Integer

    Default Value

    104857600

    Class

    Optional, Dynamic

    Parameter type

    Boolean

    Default Value

    N

    Class

    Optional, Dynamic

    Parameter type

    Boolean

    Default Value

    N

    Class

    Optional, Static

    Parameter type

    Integer

    Default Value

    60

    Class

    Optional, Static

    Parameter type

    path

    Default Value

    ""

    Class

    Optional, Static

    Parameter type

    String

    Default Value

    ""

    Class

    Optional, Static

    Parameter type

    Integer

    Default Value

    1

    Class

    Optional, Static

    Parameter type

    Integer

    Default Value

    0

    Class

    Optional, Static

    Parameter type

    Integer

    Default Value

    60

    Class

    Optional, Static

    Parameter type

    String

    Default Value

    ""

    Class

    Optional, Static

    Parameter type

    Integer

    Default Value

    7600

    Class

    Optional, Static

    Parameter type

    String

    Default Value

    "SYNC"

    Class

    Optional, Static

    Parameter type

    path

    Default Value

    ""

    Class

    Mandatory, Static

    Parameter type

    Integer

    Default Value

    0

    Class

    Optional, Dynamic

    Parameter type

    path

    Default Value

    ""

    Class

    Mandatory, Static

    Parameter type

    Integer

    Default Value

    104857600

    Class

    Optional, Dynamic

    Parameter type

    Integer

    Default Value

    3

    Class

    Mandatory, Dynamic

    Parameter type

    desc

    Default Value

    "(TABLE DEFAULT)"

    Class

    Mandatory, Dynamic

    Parameter type

    Boolean

    Default Value

    Y

    Class

    Optional, Static

    Parameter type

    Integer

    Default Value

    1073741824

    Class

    Optional, Static

    Parameter type

    Integer

    Default Value

    2147483648

    Class

    Optional, Static

    Parameter type

    Integer

    Default Value

    1000

    Class

    Optional, Static

    Parameter type

    Integer

    Default Value

    100

    Class

    Optional, Static

    Parameter type

    path

    Default Value

    "/"

    Class

    Optional, Static

    Parameter type

    path

    Default Value

    "/"

    Class

    Optional, Static

    Parameter type

    Integer

    Default Value

    180

    Class

    Optional, Static

    Parameter type

    String

    Default Value

    "#encrypted"

    Class

    Mandatory, Static

    Parameter type

    String

    Default Value

    ""

    Class

    Mandatory, Static

    Parameter type

    String

    Default Value

    "OBJ"

    Class

    Optional, Static

    Parameter type

    Boolean

    Default Value

    N

    Class

    Optional, Static

    Parameter type

    Integer

    Default Value

    4

    Class

    Optional, Static

    Parameter type

    Integer

    Default Value

    60

    Class

    Optional, Static

    Parameter type

    path

    Default Value

    "/"

    Class

    Optional, Static

    Parameter type

    Integer

    Default Value

    0

    Class

    Optional, Dynamic

    Parameter type

    Boolean

    Default Value

    Y

    Class

    Optional, Dynamic

    Parameter type

    path

    Default Value

    "/"

    Class

    Optional, Static

    Parameter type

    Integer

    Default Value

    17179869184

    Class

    Optional, Dynamic

    Parameter type

    Boolean

    Default Value

    Y

    Class

    Optional, Dynamic

    Parameter type

    Boolean

    Default Value

    Y

    Class

    Optional, Static

    Parameter type

    String

    Default Value

    "MSWIN949"

    Class

    Optional, Static

    Parameter type

    Integer

    Default Value

    1

    Class

    Mandatory, Static

    Parameter type

    String

    Default Value

    "UTF16"

    Class

    Optional, Static

    Parameter type

    path

    Default Value

    "/"

    Class

    Optional, Static

    Parameter type

    String

    Default Value

    ""

    Class

    Mandatory, Static

    Parameter type

    String

    Default Value

    "TIBERO"

    Class

    Mandatory, Static

    Parameter type

    Boolean

    Default Value

    N

    Class

    Optional, Static

    Parameter type

    String

    Default Value

    "/"

    Class

    Optional, Static

    Parameter type

    String

    Default Value

    "#encrypted"

    Class

    Optional, Static

    Parameter type

    Integer

    Default Value

    0

    Class

    Optional, Static

    Parameter type

    path

    Default Value

    ""

    Class

    Optional, Static

    Parameter type

    String

    Default Value

    "CNT"

    Class

    Optional, Static

    Parameter type

    Integer

    Default Value

    0

    Class

    Optional, Static

    Parameter type

    Integer

    Default Value

    2147483648

    Class

    Optional, Dynamic

    Parameter type

    path

    Default Value

    "/"

    Class

    Optional, Static

    Parameter type

    Boolean

    Default Value

    Y

    Class

    Optional, Static

    Parameter type

    Boolean

    Default Value

    Y

    Class

    Optional, Static

    Parameter type

    Boolean

    Default Value

    N

    Class

    Optional, Static

    Parameter type

    Boolean

    Default Value

    Y

    Class

    Optional, Static

    Parameter type

    Boolean

    Default Value

    N

    Class

    Optional, Static

    Parameter type

    Integer

    Default Value

    1800

    Class

    Optional, Static

    0 - 100000

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range

    Range