> For the complete documentation index, see [llms.txt](https://docs.tibero.com/prosync/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.tibero.com/prosync/releasenote/4.7.md).

# 4.7

ProSync 4.7 에서 기능 추가 및 개선된 사항에 대해 안내합니다.

> #### **Release Highlights**
>
> * Tibero Standby Cluster(TSC)를 소스로 하는 동기화 신규 지원
> * Source Oracle ASM 환경의 redo / archive log 추출 지원
> * Source Oracle TDE 데이터를 redo 로그에서 직접 복호화(테이블스페이스 암호화 신규 지원)
> * Source Oracle extended data type(32K 문자열) 동기화 지원
> * Source Tibero의 DDL 동기화 및 신규 테이블 자동 등록 지원 범위 확대
> * 중간 파일 자동 정리(Retention) 확대
> * 운영 중 변경한 동기화 대상의 추출 단계 반영

## 업그레이드 시 확인 사항

4.6 이하 버전에서 업그레이드하기 전에 다음 사항을 확인해야 합니다.

#### 메타 패치

설치 시 DB에 생성되는 객체(소스 DDL 트리거 · 패키지, 메타 테이블)와 DB 유저 권한에 포함된 변경은 바이너리 교체만으로 반영되지 않습니다. 기존 설치 환경에 4.7을 적용할 때는 패치 가이드에 따라 `prs_meta.sh`를 수행해야 합니다. dummy transaction 타임존 수정, Source Tibero 신규 테이블 자동 등록(설치 설정에 `AUTO_SYNC_ON_CREATE=Y`를 지정한 경우), `SYS.ENC$` 조회 권한이 이 절차로 반영됩니다.

#### Source Oracle 권한

4.7의 Extract는 기동 시 `SYS.ENC$`를 조회합니다. 4.6 이하에서 설치한 환경에는 이 조회 권한이 없어 Extract가 기동하지 못할 수 있으므로, `prs_meta.sh`를 수행하거나 `GRANT SELECT ON SYS.ENC$ TO <PRS_USER>;`를 부여해야 합니다.

#### Source Oracle TDE

암호화 컬럼이 있는 테이블을 동기화하는 경우, Apply 설정에 `TDE_FOR_APPLY=Y`와 TDE wallet(`TDE_WALLET_FILE`, `TDE_WALLET_PWD`)이 설정되어 있는지 확인해야 합니다. 설정되어 있지 않으면 해당 테이블의 메타데이터를 처리할 때 Apply가 중단됩니다. `USE_TDE=Y`로 설치하면 `TDE_FOR_EXT`, `TDE_FOR_APPLY`, `TDE_WALLET_PWD`는 설정되지만 `TDE_WALLET_FILE`에는 인스턴스 디렉터리(`$PRS_HOME/var/<인스턴스>/`)가 기록되므로, Extract와 Apply 설정 파일에서 Source DB의 wallet 파일(`ewallet.p12`) 절대 경로로 수정해야 합니다. 수정하지 않으면 Extract와 Apply가 기동하지 않습니다.

#### Source Oracle extended 컬럼

`MAX_STRING_SIZE=EXTENDED` 환경에서 선언 길이가 표준 최대 길이(VARCHAR2 / NVARCHAR2 4000바이트, RAW 2000바이트)를 넘는 컬럼이 있는 테이블은 Primary Key가 필요합니다. Primary Key가 없으면 Apply가 중단되므로, 업그레이드 전에 해당 테이블에 Primary Key를 추가하거나 동기화 대상에서 제외해야 합니다.

#### Source PostgreSQL 재설치

Source가 PostgreSQL인 환경은 바이너리 교체나 메타 패치(`prs_meta.sh`)로 4.7을 적용할 수 없으므로 재설치해야 합니다. 4.7에서 Source PostgreSQL 테이블 메타데이터의 컬럼 번호 기준이 다른 소스와 같도록 바뀌어, 4.6 이하에서 기록된 메타데이터를 그대로 사용하면, Primary Key · Foreign Key가 테이블의 첫 번째 컬럼에 있는 경우 등에는 Apply가 `DD CON column not found` 메시지와 함께 중단되고, 그 밖의 경우에는 중단 없이 컬럼 값이 한 칸씩 밀려 반영될 수 있습니다. 패치 가이드의 백업 · 메타 패치 절차(`prs_backup.sh`, `prs_meta.sh`)도 PostgreSQL을 지원하지 않습니다.

#### Source PostgreSQL

4.6에서는 ProSync가 처리할 수 없는 값(9999년을 넘는 날짜, 65532자리를 넘는 숫자 등)이 포함된 DML을 오류 로그만 남기고 건너뛰었으나, 4.7에서는 이 자동 건너뛰기가 제거되어 해당 DML의 반영을 계속 재시도하며, 그 트랜잭션 이후의 동기화가 진행되지 않습니다. 변환 실패로 판정된 DML을 종전과 같이 건너뛰려면 Apply에 `DISCARD_CAST_ERR=Y`를 설정해야 합니다.

#### IP\_VERSION

4.6 이하의 설치 스크립트는 `IP_VERSION`을 설정 파일에 주석으로만 기록합니다. IPv6 환경에서 `IP_VERSION=6`을 지정하는 등 직접 추가한 경우에는 Agent · Extract · Apply · LLOB 설정 파일과 `prs_adm.cfg`에서 해당 줄을 삭제해야 합니다. 남아 있으면 unknown parameter 오류로 해당 프로세스가 기동하지 않습니다.

#### \_LR\_USE\_AUTO\_DELETE, \_LR\_BACKUP\_FILE\_COUNT

lr 파일 자동 삭제를 이 히든 파라미터로 설정해 사용하던 경우 Extract 설정 파일에서 두 항목을 제거하고 `LR_FILE_DELETE_MODE=CNT`와 `LR_FILE_CNT`로 대체해야 합니다. 남아 있으면 unknown parameter 오류로 Extract가 기동하지 않습니다.

#### SRC\_DB\_CNT

허용범위는 1 - 20입니다. 21 이상으로 설정되어 있으면 Apply가 기동하지 않으므로 업그레이드 전에 확인해야 합니다.

#### 타겟 최소 권한 설치

`PRS_TARGET_MIN_PRIVILEGE=Y`로 설치하는 경우 DDL 동기화를 사용할 수 없습니다. DDL 동기화가 필요한 환경은 기본 설치 경로를 사용해야 합니다. 4.6 이하에서 이 옵션으로 설치한 환경의 기존 권한은 업그레이드로 회수되지 않습니다.

#### 정합성 검사

내장 Verify 프로세스와 `prs_adm`의 `VERIFY` 관련 명령이 제거되었습니다. 정합성 검사는 ProSyncManager를 사용해야 합니다.

## 신규 기능

#### Tibero Standby Cluster(TSC)를 소스로 하는 동기화를 지원합니다.

읽기 전용 standby에서 redo를 추출하고, 소스 측 쓰기 작업(메타데이터, dummy tx, logfile switch)은 primary로 라우팅합니다.

* 모든 redo thread의 `RECOVERED_TSN` 중 최솟값을 안전 추출 경계로 사용하여, standby에서 복구가 완료된 변경 내역만 추출합니다(단일 TSC · TAC-TSC 공통). standby 승격을 감지하면 현재 로그를 다시 열어 추출을 이어갑니다.
* Switchover 또는 failover로 소스로 설정한 standby가 primary로 승격되면 쓰기 및 메타데이터 접속 대상을 승격된 DB로 자동 전환합니다. 승격된 DB가 다시 standby로 전환되는 원복이나 반복 전환은 자동 추종 대상에 포함되지 않습니다.
* 설치 시 `USE_TSC` 파라미터로 TSC 동기화용 config를 자동 생성합니다.
* <a href="https://docs.tibero.com/prosync/4.7_manual/administration/extract/key-features/tsc-standby-synchronization" class="button secondary">더 알아보기</a>

#### Source Oracle ASM 환경의 redo / archive log 추출을 지원합니다.

ASM 인스턴스에 직접 접속해 diskgroup 경로(`+...`)의 redo / archive log를 읽습니다.

* ASM 전용 I/O worker 세션(`ASM_IO_WORKERS`, 기본 4, 최대 8)이 redo를 병렬로 읽고, 읽기와 redo 분석을 분리해 처리합니다.
* ASM 접속 비밀번호는 암호화되어 wallet에 저장됩니다.
* `ARCHIVE_LOG_DIR`에 아카이브 로그가 없거나 디렉터리에 접근할 수 없어도, ASM 접속 정보가 설정되어 있고 `V$ARCHIVED_LOG`에 ASM 경로가 있으면 ASM에서 읽어 추출을 계속합니다.
* <a href="https://docs.tibero.com/prosync/4.7_manual/administration/extract/key-features/source-oracle-asm" class="button secondary">더 알아보기</a>

#### Source Oracle의 TDE 암호화 데이터를 redo 로그에서 직접 복호화합니다.

TDE 동기화를 설정한 경우(설치 시 `USE_TDE=Y` — Extract의 `TDE_FOR_EXT`와 Apply의 `TDE_FOR_APPLY`가 함께 Y로 설정됨) Oracle 컬럼 TDE는 로그에 기록된 암호화 컬럼 값을 직접 복호화하도록 개선하여, 기존 소스 행 재조회에 따른 부하와 조회 시점 차이의 영향을 줄였습니다. 암호화 테이블스페이스(TTE)의 redo는 로그 리더에서 wallet의 키로 복호화합니다. LOB / NCLOB 및 extended 자료형 중 지연 조회가 필요한 값에는 기존 소스 DB 조회 방식과 관련 제약이 적용됩니다. 설치 후 Extract · Apply 설정 파일의 `TDE_WALLET_FILE`을 wallet 파일(`ewallet.p12`)의 절대 경로로 지정해야 합니다.

* 컬럼 암호화(TDE)에 더해 **테이블스페이스 암호화(TTE)** 지원이 추가되었습니다.
* AES128, AES192, AES256, 3DES168 알고리즘을 지원합니다.
* CDB/PDB 환경의 master key 매핑과 키 변경(rekey)을 지원합니다. 처리할 로그에 사용된 키가 포함된 wallet이 필요하며, 새 master key를 반영하려면 wallet을 갱신하고 관련 Extract / Apply 프로세스를 재기동해야 합니다. wallet에 해당 로그의 master key가 없으면 그 구간의 암호화 테이블스페이스 변경은 복호화되지 않아 타겟에 정상적으로 반영되지 않습니다.
* 암호화 테이블의 LOB / NCLOB 컬럼 동기화를 지원합니다.
* 컬럼 TDE의 테이블 키를 처리하지 못하면(wallet 미설정, `TDE_FOR_APPLY=N` 등) Apply가 중단되며, 해당 메타데이터는 처리 완료 상태로 전환되지 않습니다. 설정과 wallet을 바로잡고 재기동하면 해당 구간부터 다시 처리합니다.
* <a href="https://docs.tibero.com/prosync/4.7_manual/administration/extract/key-features/encryption-table-extraction" class="button secondary">더 알아보기</a>

#### Source Oracle의 extended data type 동기화를 지원합니다.

`MAX_STRING_SIZE=EXTENDED` 환경의 확장 컬럼(VARCHAR2 / NVARCHAR2 4000바이트 초과, RAW 2000바이트 초과)을 동기화합니다.

* DD 로드 시 컬럼 선언 길이로 **자동 감지**하므로 별도 파라미터 설정이 필요하지 않습니다.
* extended 컬럼을 가진 테이블만 lazy-fetch(llob) 대상으로 지정되므로, extended 컬럼이 없는 테이블의 동기화에는 영향이 없습니다.

{% hint style="warning" %}
**제약사항**

extended 컬럼을 가진 테이블은 lazy-fetch 대상이 되므로 Primary Key가 필요합니다. Primary Key가 없으면 Apply가 `Table <OWNER.TABLE> at source database has LONG/LOB columns but does not have a primary key column` 메시지와 함께 중단되므로(extended 컬럼도 이 메시지에서는 LONG/LOB으로 표기됩니다), Primary Key를 추가하거나 동기화 대상에서 제외해야 합니다. Apply 기동 시뿐 아니라 운영 중 테이블 추가나 DDL로 해당 테이블의 메타데이터를 처리할 때도 같습니다. extended 컬럼이 없는 테이블은 종전과 동일하게 Primary Key 없이도 동기화됩니다.

ALTER TABLE ... MODIFY로 기존 컬럼의 길이를 표준 최대 길이보다 크게 확장한 경우, 큰 값이 chained row 형태로 기록되어 동기화되지 않을 수 있습니다. 처리할 수 없는 chained row 변경을 감지하면 경고 로그를 남기고 해당 DML 변경 한 건을 건너뛰므로, 해당 변경은 타겟에 반영되지 않습니다. 테이블 생성 시점부터 extended로 선언된 컬럼은 기존 LLOB 처리 조건에 따라 동기화됩니다.
{% endhint %}

* <a href="https://docs.tibero.com/prosync/4.7_manual/installation/pre-installation/table-creation-registration#oracle" class="button secondary">더 알아보기</a>

#### 동기화 지원 데이터타입이 확대되었습니다.

Tibero → Oracle 동기화에서 다음 타입을 지원합니다.

* TIMESTAMP WITH TIME ZONE
* TIMESTAMP WITH LOCAL TIME ZONE
* BINARY\_FLOAT
* BINARY\_DOUBLE
* <a href="https://docs.tibero.com/prosync/4.7_manual/installation/pre-installation/table-creation-registration#undefined" class="button secondary">더 알아보기</a>

#### Source Tibero의 DDL 동기화 지원 범위가 확대되었습니다.

Source Tibero에서도 Source Oracle과 동일한 범위의 DDL을 동기화합니다. DATABASE LINK, PUBLIC DATABASE LINK도 추가로 지원합니다(타겟이 Tibero인 경우에 한함).

* <a href="https://docs.tibero.com/prosync/4.7_manual/administration/apply/key-features/mapping/ddl-rule#ddl" class="button secondary">더 알아보기</a>

#### 운영 중 변경한 동기화 대상이 추출 단계에도 반영됩니다.

Apply가 처리한 DD(테이블 메타데이터) 변경을 연결된 Extract로 전파하여, 추출 단계의 동기화 대상 목록을 재기동 없이 갱신합니다. Extract는 동기화 대상 테이블의 변경만 선별해 전송하므로 불필요한 전송량이 줄어듭니다.

{% hint style="info" %}
**사용 조건**

Extract의 `ENABLE_SYNC_TABLE_FILTER`와 Apply의 `ENABLE_DDL_METADATA_BROADCAST`를 모두 `Y`로 설정해야 동작하며, 기본값은 둘 다 `N`입니다. Source Oracle(`USE_LOGMNR=N`)에서 지원합니다.
{% endhint %}

*

#### Source Tibero에서도 신규 테이블 자동 동기화를 지원합니다.

기존에 Source Oracle에서만 동작하던 `AUTO_SYNC_ON_CREATE`를 Source Tibero에서도 사용할 수 있습니다. 설치 후 새로 생성된 테이블과 시퀀스가 자동으로 동기화 대상에 등록됩니다.

{% hint style="info" %}
**사전 조건**

Source Tibero에서 이 기능을 사용하려면 소스 DB에 `_DDL_AUTO_SUPPLOG_CTBL=TRUE`가 설정되어 있어야 합니다. `alter system set _DDL_AUTO_SUPPLOG_CTBL=TRUE;`로 바로 적용할 수 있으나 DB 재기동 후에는 유지되지 않으므로, TIP 파일에도 같은 값을 설정해야 합니다. 설치 시 `AUTO_SYNC_ON_CREATE=Y`이면 이 값을 확인하며, 설정되어 있지 않으면 안내 메시지와 함께 설치가 중단됩니다. 또한 `AUTO_SYNC_ON_CREATE=Y`로 설정하였더라도 소스 DB가 Oracle 또는 Tibero가 아니면 미지원 안내와 함께 설치가 중단됩니다.
{% endhint %}

* <a href="https://docs.tibero.com/prosync/4.7_manual/installation/pre-installation/table-creation-registration#undefined-6" class="button secondary">더 알아보기</a>

#### 소유자 와일드카드로 동기화 대상을 지정할 때 시스템 스키마를 자동으로 제외합니다.

동기화 대상 목록의 소유자에 와일드카드를 지정하면(`%.%` 등) 시스템 스키마와 ProSync 자체 객체를 자동으로 제외합니다(Source Oracle · Tibero). 기존에는 이들을 제외하지 않아 시스템 스키마와 ProSync 메타 테이블까지 동기화 대상으로 등록되었습니다.

* 휴지통 객체(`BIN$`), ProSync 유저 소유 객체와 ProSync 메타 테이블, AQ 큐 테이블(`AQ$_`), IOT overflow 테이블(`SYS_IOT_OVER_`)은 항상 제외됩니다.
* 소유자에 와일드카드를 사용한 경우에는 DB가 관리하는 시스템 스키마도 함께 제외됩니다(Oracle 12c 이상은 `ALL_USERS.ORACLE_MAINTAINED = 'Y'`인 스키마, Oracle 11g는 `SYS`, `SYSTEM`, `XDB`, `MDSYS` 등 정해진 Oracle 기본 · 옵션 스키마와 `APEX_030200` 같은 APEX 버전 스키마, Tibero는 `SYS`, `SYSCAT`, `SYSGIS`, `OUTLN`, `LBACSYS` 등).
* 소유자를 이름으로 명시하면 사용자가 의도한 스키마로 보고 시스템 스키마 제외를 적용하지 않습니다.
* <a href="https://docs.tibero.com/prosync/4.7_manual/installation/pre-installation/table-creation-registration#undefined-4" class="button secondary">더 알아보기</a>

#### 중간 파일(lr, txh)의 자동 정리 기능이 확대되었습니다.

* lr(tlr / olr) 파일: 히든 파라미터(`_LR_USE_AUTO_DELETE`, `_LR_BACKUP_FILE_COUNT`)로 제어하던 고정 개수 삭제가 `LR_FILE_DELETE_MODE` 기반 정리로 넓어져, **개수(CNT)**, **총용량(SIZE)**, **보관 기간(RETENTION)** 기준으로 정리할 수 있습니다. 두 히든 파라미터는 제거되었습니다(아래 「삭제 정보」 참고).
* txh(Apply tx checkpoint) 파일: 기존 개수 · 용량 기준에 더해 **RETENTION** 기반 삭제가 추가되었습니다.
* 보관 기간 정리는 `RETENTION_FILE_CLEANUP_INTERVAL`(기본 3600초) 간격으로 점검합니다. 실제 점검 시점은 프로세스 부하와 정리 작업 시간에 따라 늦어질 수 있습니다.
* 보관 일수(`LR_FILE_RETENTION_DAY`, `TX_HASH_FILE_RETENTION_DAY`)와 점검 주기(`RETENTION_FILE_CLEANUP_INTERVAL`)는 `ALTER`로 런타임 변경할 수 있으며, 삭제 모드(`LR_FILE_DELETE_MODE`, `TX_HASH_FILE_MODE`)는 재기동해야 반영됩니다.
* 정리 결과는 파일별이 아니라 정리 1회마다 요약 로그(삭제 건수, 적용 기준값)로 남습니다.

#### Source Tibero의 non-8KB DB\_BLOCK\_SIZE 환경에서 압축 테이블 동기화를 지원합니다.

소스 DB의 실제 `DB_BLOCK_SIZE`를 조회해 로그 리더에 전달하도록 변경되어, 8KB 이외의 블록 크기 환경에서도 압축 테이블이 정상 동기화됩니다. 기존에는 블록 크기를 8KB로 가정해 압축 테이블의 변경이 정상적으로 처리되지 않았습니다.

* <a href="https://docs.tibero.com/prosync/4.7_manual/administration/extract/key-features/compressed-table-extraction" class="button secondary">더 알아보기</a>

#### 변환 실패 데이터에 대한 Discard를 지원합니다.

`DISCARD_CAST_ERR=Y`이면 지원하지 않는 timestamp 지역 정보 등 데이터 변환 오류로 실패한 DML 문장을 건너뜁니다. 건너뛴 DML은 타겟에 반영되지 않습니다. 해당 내용을 discard 파일에 기록하려면 `DISCARD_FILE_YN=Y`도 설정해야 합니다.

* <a href="https://docs.tibero.com/prosync/4.7_manual/administration/apply/key-features/flow-control/conflict/discard#discard" class="button secondary">더 알아보기</a>

#### `IP_VERSION` 파라미터 없이 IP 버전을 자동으로 판단합니다.

설정된 주소의 형식을 보고 IPv4 / IPv6를 자동 판별하므로 프로토콜을 지정할 필요가 없습니다.

* non-blocking 접속 경로에도 IPv6 지원이 추가되었습니다.
* listen은 IPv6 듀얼스택으로 열어 IPv4 접속도 받으며, IPv6 listen이 실패하면 IPv4로 내려갑니다.

{% hint style="info" %}
설정 파일에 직접 추가한 `IP_VERSION`이 남아 있으면 제거해야 합니다. 아래 「삭제 정보」를 참고해야 합니다.
{% endhint %}

#### ProSyncManager 연동이 개선되었습니다.

* ProSyncManager로 인스턴스를 설치할 때 엔진에 install config(`install/psm_install_config/<인스턴스>_install.cfg`)를 남깁니다.

### 신규 파라미터

#### Install Parameter

<table><thead><tr><th width="310">Parameter Name</th><th>설명</th><th width="90">Default</th></tr></thead><tbody><tr><td>USE_TSC</td><td>Tibero Standby Cluster 소스 동기화 사용 여부입니다. Y로 설정하면 SRC_DB_NAME에는 읽기 전용 standby alias를, SRC_PRIMARY_DB_NAME에는 쓰기 가능한 primary alias를 지정합니다. Source Tibero에서만 사용할 수 있습니다.</td><td>N</td></tr><tr><td>SRC_PRIMARY_DB_NAME</td><td>TSC 동기화 시 사용할 쓰기 가능한 primary DB alias입니다. USE_TSC=Y일 때 필수이며 SRC_DB_NAME과 다른 값이어야 합니다.</td><td></td></tr><tr><td>SRC_PRIMARY_DB_ALIAS_<em>N</em></td><td>TAC-TSC 환경에서 인스턴스별 primary alias입니다. SRC_DB_CNT가 2 이상일 때 SRC_DB_ALIAS_<em>N</em>과 1:1로 대응하며, N은 0부터 SRC_DB_CNT-1까지 모두 지정해야 합니다. 지정하지 않으면 logfile switch와 dummy transaction을 SRC_PRIMARY_DB_NAME 한 곳에서 수행합니다.</td><td></td></tr><tr><td>ASM_DB_NAME</td><td>Source Oracle이 ASM을 사용하는 경우 접속할 ASM 인스턴스 alias입니다. ASM_USER, ASM_PWD와 함께 모두 지정해야 적용됩니다.</td><td></td></tr><tr><td>ASM_USER</td><td>ASM 인스턴스 접속 계정입니다. SYSASM 권한이 필요합니다.</td><td></td></tr><tr><td>ASM_PWD</td><td>ASM 인스턴스 접속 비밀번호입니다. 설치 시 암호화되어 wallet 파일로 저장됩니다.</td><td></td></tr></tbody></table>

#### Configuration Parameter

TSC 동기화를 위한 신규 파라미터가 추가되었습니다.

<table><thead><tr><th width="310">Parameter Name</th><th>설명</th><th width="95">Scope</th><th width="90">Default</th></tr></thead><tbody><tr><td>ENABLE_TSC_STANDBY</td><td>TSC standby 소스 모드를 활성화합니다. Extract는 SRC_DB_NAME에서 redo를 읽고 소스 측 쓰기는 SRC_PRIMARY_DB_NAME으로 보내며, LLOB은 standby 복구가 조회 시점에 도달한 뒤 조회합니다. Source Tibero에서만 사용할 수 있습니다.</td><td>ext, llob</td><td>N</td></tr><tr><td>SRC_PRIMARY_DB_NAME</td><td>ENABLE_TSC_STANDBY 활성화 시 사용할 쓰기 가능한 primary DB alias입니다.</td><td>ext, llob</td><td></td></tr><tr><td>SRC_PRIMARY_LOCAL_SID</td><td>해당 Extract의 dummy transaction과 logfile switch를 수행할 primary 인스턴스 alias입니다. 지정하지 않으면 SRC_PRIMARY_DB_NAME을 사용합니다.</td><td>ext</td><td></td></tr></tbody></table>

Source Oracle ASM 추출을 위한 신규 파라미터가 추가되었습니다.

<table><thead><tr><th width="310">Parameter Name</th><th>설명</th><th width="95">Scope</th><th width="90">Default</th></tr></thead><tbody><tr><td>ASM_DB_NAME</td><td>로그 리더가 사용할 Oracle ASM 인스턴스 alias입니다. ASM 경로(+...)의 redo / archive log 접근에 필요합니다.</td><td>ext</td><td></td></tr><tr><td>ASM_USER</td><td>로그 리더가 사용할 Oracle ASM 접속 계정입니다.</td><td>ext</td><td></td></tr><tr><td>ASM_PWD</td><td>Oracle ASM 접속 계정의 비밀번호입니다. 암호화되어 wallet에 저장되며 cfg에는 #encrypted로 표시됩니다.</td><td>ext</td><td></td></tr><tr><td>ASM_IO_WORKERS</td><td>ASM redo를 읽을 때 사용할 병렬 I/O worker 세션 수입니다. Extract 기동 시에만 적용됩니다. (허용범위: 1 - 8)</td><td>ext</td><td>4</td></tr></tbody></table>

중간 파일 자동 정리를 위한 신규 파라미터가 추가되었습니다.

<table><thead><tr><th width="310">Parameter Name</th><th>설명</th><th width="95">Scope</th><th width="90">Default</th></tr></thead><tbody><tr><td>LR_FILE_DELETE_MODE</td><td>lr 파일 삭제 기준을 지정합니다. (CNT / SIZE / RETENTION)</td><td>ext</td><td>CNT</td></tr><tr><td>LR_FILE_CNT</td><td>LR 디렉터리에 유지할 lr 파일 개수입니다. (허용범위: 0 - 2147483647, 0 = 무제한)</td><td>ext</td><td>0</td></tr><tr><td>LR_FILE_TOTAL_SIZE</td><td>LR 디렉터리에 유지할 lr 파일의 총 용량입니다. (허용범위: 0 - 1000G, 0 = 무제한)</td><td>ext</td><td>0</td></tr><tr><td>LR_FILE_RETENTION_DAY</td><td>lr 파일 보관 기간(일)입니다. (허용범위: 0 - 36500, 0 = 무제한)</td><td>ext</td><td>0</td></tr><tr><td>TX_HASH_FILE_RETENTION_DAY</td><td>tx hash(txh) 파일 보관 기간(일)입니다. (허용범위: 0 - 36500, 0 = 무제한)</td><td>apply</td><td>0</td></tr><tr><td>RETENTION_FILE_CLEANUP_INTERVAL</td><td>retention 기반 파일 정리를 수행하는 주기입니다. (허용범위: 60 - 86400) (단위: 초)</td><td>ext, apply</td><td>3600</td></tr></tbody></table>

위 파라미터 중 개수 · 용량 · 보관 기간을 지정하는 네 가지는 기본값이 0이며, 0은 해당 기준으로 파일을 삭제하지 않음을 의미합니다. 자동 정리를 사용하려면 삭제 모드와 해당 기준값을 함께 지정해야 합니다. 보관 기간 기준으로 lr 파일을 정리하려면 `LR_FILE_DELETE_MODE=RETENTION`과 `LR_FILE_RETENTION_DAY`를, txh 파일은 `TX_HASH_FILE_MODE=RETENTION`과 `TX_HASH_FILE_RETENTION_DAY`를 설정하고 보관 일수를 1 이상으로 지정해야 합니다. 기본 삭제 모드는 CNT이므로 보관 일수만 설정하면 기간 기준 정리가 실행되지 않습니다.

동적 동기화 대상 관리를 위한 신규 파라미터가 추가되었습니다.

<table><thead><tr><th width="310">Parameter Name</th><th>설명</th><th width="95">Scope</th><th width="90">Default</th></tr></thead><tbody><tr><td>ENABLE_SYNC_TABLE_FILTER</td><td>동기화 대상 테이블의 LCR만 Apply 프로세스로 전송할지 여부를 설정합니다. Source Oracle(USE_LOGMNR=N)에서만 동작하며, 운영 중 변경한 동기화 대상을 반영하려면 Apply의 ENABLE_DDL_METADATA_BROADCAST도 Y로 설정해야 합니다.</td><td>ext</td><td>N</td></tr><tr><td>ENABLE_DDL_METADATA_BROADCAST</td><td>Apply가 처리한 테이블 메타데이터(DD) 추가 · 변경 · 삭제 정보를 연결된 Extract로 전파할지 여부를 설정합니다.</td><td>apply</td><td>N</td></tr></tbody></table>

Discard 기능을 위한 신규 파라미터가 추가되었습니다.

<table><thead><tr><th width="310">Parameter Name</th><th>설명</th><th width="95">Scope</th><th width="90">Default</th></tr></thead><tbody><tr><td>DISCARD_CAST_ERR</td><td>지원하지 않는 데이터 변환으로 실패한 DML 문장을 건너뛸지 설정합니다. 건너뛴 DML은 타겟에 반영되지 않으며, discard 파일 기록에는 DISCARD_FILE_YN=Y가 필요합니다.</td><td>apply</td><td>N</td></tr></tbody></table>

### 변경된 파라미터

<table><thead><tr><th width="200">Parameter Name</th><th width="320">변경 내용</th><th>비고</th></tr></thead><tbody><tr><td>SRC_DB_CNT</td><td>허용범위 1 - 32 → <strong>1 - 20</strong></td><td>Apply가 소스 노드별 슬롯을 고정 개수로 잡고 있어 20을 넘길 수 없습니다. 21 이상을 설정하면 Apply가 기동에 실패합니다.</td></tr><tr><td>ARCHIVE_LOG_DIR</td><td>필수 → <strong>선택</strong></td><td>Source Oracle은 지정하지 않으면 V$ARCHIVED_LOG에 기록된 경로(ASM 포함)를 사용하므로 필수가 아닙니다. Source Tibero는 종전과 같이 지정해야 합니다.</td></tr><tr><td>TX_HASH_FILE_MODE</td><td>허용값 CNT / SIZE → CNT / SIZE / RETENTION</td><td>보관 기간 기준 정리에는 RETENTION을 선택하고 TX_HASH_FILE_RETENTION_DAY를 1 이상으로 설정해야 합니다. 기본값은 CNT입니다.</td></tr></tbody></table>

***

## **변경 사항**

### 주요 기능

* DD의 컬럼 배열을 로드 순서가 아닌 **물리 컬럼 번호(col\_no)** 기준으로 저장하도록 변경되었습니다. `DROP COLUMN` / `SET UNUSED`로 컬럼 번호에 공백이 생긴 테이블에서도 정확한 컬럼을 참조합니다.
* 충돌 해결(DCR) 규칙(`RESOLVE BY TARGET` 제외)이 설정된 테이블에 key 컬럼이 없을 때 Apply 프로세스를 종료하지 않고 동기화를 계속하도록 변경되었습니다.
  * 해당 테이블의 충돌 해결만 비활성화하고 경고 로그를 남기며, 다른 테이블의 동기화는 그대로 진행됩니다.
  * 충돌 해결이 처리했어야 할 DML은 건너뛰고, skip list 파일(`var/<인스턴스>/dml_err/<인스턴스>_dcr_skip_list.log`)에 건너뛴 SQL과 컬럼 값, 그리고 그대로 재적용할 수 있는 완성된 SQL을 기록합니다.
  * 이후 해당 테이블에 key가 추가되면 메타데이터 갱신 시점에 충돌 해결이 자동으로 다시 활성화됩니다.
* 메타 테이블 `PRS_OBJ_LIST.REGISTERED_TIME`의 타입이 메타 패치(`prs_meta.sh`) 경로에서도 신규 설치와 동일하게 `TIMESTAMP WITH TIME ZONE`으로 생성됩니다. 단, 이미 `TIMESTAMP(0)`으로 생성된 컬럼은 그대로 유지됩니다.
* Oracle redo record에 드물게 포함되는 BPS(16바이트 SCN 메타데이터) 필드를 인식해 건너뛰도록 파싱이 보완되었습니다.
* 설치 시 새로 생성하는 Extract · Apply · LLOB 설정 파일의 백업 로그 디렉터리(`LOG_BACKUP_DIR`) 기본값이 프로세스 종류별로 분리되어 `log/ext_backup`, `log/apply_backup`, `log/llob_backup`을 사용합니다(4.6은 `log/backup` 공용). 작성 중인 로그 디렉터리(`LOG_DIR`) 기본값과 Agent 로그 경로는 4.6과 동일하며, 기존 설정 파일을 그대로 쓰면 설정된 값이 유지됩니다.
* 백업 로그 파일 이름에 연도(2자리)와 마이크로초가 추가되었습니다(`<로그 파일명>.YYMMDD_HHMMSS.ffffff`). 프로세스 로그뿐 아니라 SAM 파일, DML 오류 리포트, discard 파일의 백업에도 같은 형식이 적용됩니다. 기존에는 같은 초에 백업이 겹치면 앞선 백업 파일을 덮어썼습니다. 백업 파일명을 해석하는 운영 스크립트가 있다면 새 형식을 반영해야 합니다.
* Oracle 11g 이상에서는 deprecated된 `COMMIT_WRITE` 대신 `COMMIT_WAIT`를 사용하도록 변경되었습니다. 버전 판별에 실패한 경우에는 기존 동작을 유지합니다.
* 설치 시 Oracle 버전 판별에 실패하면 잘못된 분기로 진행하지 않고 설치를 중단합니다.
* `ALTER MATERIALIZED VIEW`가 DDL 동기화 대상에 포함됩니다. 타겟이 Tibero인 경우에는 지원하지 않는 구문이므로 적용하지 않고 건너뜁니다.
* Source Oracle에서 Direct Path Insert로 적재된 chained row의 추출을 지원합니다.

### 오류 개선

#### Source Oracle 추출

* CREATE TYPE ... UNDER로 하위 타입을 생성할 때 해당 DDL이 동기화에서 누락되는 문제를 해결하였습니다.
* Extract가 redo / archive log 파일을 새로 열 때마다 내부 로그 버퍼를 해제하지 않아, 가동 시간이 길어질수록 Extract 프로세스의 메모리 사용량이 읽은 로그 파일 크기에 비례해 계속 증가하던 문제를 해결하였습니다.
* DDL 또는 Direct Path Insert가 포함된 트랜잭션을 처리할 때마다 Extract가 트랜잭션 처리용 메모리 일부를 반납하지 않아, 해당 트랜잭션 건수에 비례해 메모리가 남던 문제를 해결하였습니다.
* `EXCLUDE_USER`로 지정한 사용자의 DML이 제외되지 않고 그대로 동기화되던 문제를 해결하였습니다. 기존에는 DDL만 제외 대상으로 처리되어, 양방향 동기화 구성에서 반대 방향으로 적용한 변경이 되돌아올 수 있었습니다. LogMiner를 사용하지 않는 구성(`USE_LOGMNR=N`, 기본값)에 해당합니다.
  * 제외 판정에 사용하는 세션 사용자 정보를 세션 번호만으로 찾던 것도 함께 정정하였습니다. Oracle이 세션 번호를 재사용하면 그 번호를 쓰던 이전 세션의 사용자 이름이 그대로 붙었고, 세션 접속 정보가 남지 않은 트랜잭션에는 다른 트랜잭션의 사용자 이름이 잘못 연결되어 같은 테이블의 같은 변경이 로그마다 다른 사용자로 기록되기도 하였습니다. 이제 세션 번호와 시리얼 번호가 모두 일치할 때만 같은 세션으로 판단하며, 사용자를 확인할 수 없는 변경은 제외하지 않고 그대로 동기화합니다.
* 여러 블록에 나뉘어 저장된(row chaining) 행의 UPDATE를 추출할 때, chain 중간에 다른 레코드가 끼어 있으면 일부 컬럼 값을 잘못 조립하던 문제를 해결하였습니다.
* `EXT_TO_SAM=Y`로 Extract가 기록하는 SAM 파일에서, 멀티바이트 문자셋을 쓰는 Source Oracle의 CHAR · VARCHAR2 값이 DB 문자셋으로 변환되지 않아 깨지던 문제를 해결하였습니다.

#### Source Tibero 추출

* 필요한 아카이브 로그가 `V$ARCHIVE_DEST_FILES` 목록에서 빠지면 Extract가 추출을 이어가지 못하던 문제를 해결하였습니다. 이제 `ARCHIVE_LOG_DIR`이 로컬 파일 시스템 경로이고 그 경로에 해당 파일이 있으면 그 파일로 추출을 계속합니다(TAS 등 로컬 파일 시스템이 아닌 경로는 해당하지 않습니다). 목록 조회 중 아카이브가 추가 · 삭제되면 Extract가 비정상 종료되던 문제도 함께 해결하였습니다.

#### LOB / LONG 동기화

* 한 트랜잭션에서 여러 행을 INSERT할 때 일부 행의 LOB이 빈 값으로 남던 문제를 해결하였습니다(OLTP 압축 테이블, XMLTYPE 컬럼 parallel insert).
* 한 트랜잭션에서 LONG · LONG RAW 컬럼을 갱신한 행의 Primary Key 값을 바꾼 뒤 그 행을 DELETE하면, Apply가 이미 삭제된 행에 값을 쓰려다 실패해 트랜잭션을 무한히 재시도하며 동기화가 멈추던 문제를 해결하였습니다.
* LLOB 요청 중단 시 늦게 도착한 응답이 재접속된 새 연결로 전달되어 재연결이 반복되던 문제를 해결하였습니다.
* 타겟 Tibero 테이블의 LOB 컬럼이 압축 LOB인 경우, LOB 값을 동기화할 때 발생하던 `Unsupported use for compressed lob` 오류를 해결하였습니다.
* 타겟이 Oracle인 환경에서 LONG / LONG RAW 컬럼에 NOT NULL 제약이 있으면 동기화가 `ORA-01400`으로 실패하던 문제를 해결하였습니다. LONG 계열 값은 INSERT 시점에 자리표시자만 반영하고 실제 값은 후속 UPDATE로 채우는데, 이 자리표시자가 NULL로 처리되어 INSERT 단계에서 먼저 실패한 것이 원인입니다.
* Apply를 강제 종료한 뒤 Apply만 재기동하면 LOB / LONG 반영이 진행되다가 중단되는 문제를 해결하였습니다. 재접속 과정에서 정상 연결이 끊기거나 실패한 타겟 DB 세션의 행 잠금이 남지 않도록 개선하였습니다.

#### Apply

* Source Tibero의 XMLTYPE(OBJECT) 컬럼이 있는 테이블에 INSERT를 동기화할 때 Apply의 replay 스레드가 비정상 종료되고, 재기동 후에도 같은 오류가 반복되는 문제를 해결하였습니다. 같은 테이블의 DELETE가 `-2020`(Invalid SQL data type) 오류로 실패해 재시도를 반복하던 문제도 함께 해결하였습니다. XMLTYPE 컬럼은 등호로 비교할 수 없으므로 WHERE 절의 비교 대상에서 제외합니다.
* Source Oracle의 XMLTYPE 컬럼을 NULL로 UPDATE했을 때 타겟에 NULL이 아닌 빈 값이 반영되던 문제를 해결하였습니다. XMLTYPE은 내부적으로 CLOB으로 처리되어 값이 NULL이어도 빈 CLOB이 먼저 들어가고, 이후 LOB 전송 단계에서 NULL은 채워지지 않아 빈 CLOB이 최종 값으로 남았습니다.
* Source Oracle 환경에서 동기화 대상 테이블의 `OBJECT_ID` 값에 따라 Apply 내부의 객체 ID 매핑 정보가 손상되어, DML 동기화 중 construct 스레드가 비정상 종료되던 문제를 해결하였습니다.
* 재기동 시 Apply의 트랜잭션 체크포인트 파일(`var/<인스턴스>/tx/`)이 손상되어 있으면 construct 스레드만 비정상 종료되어, 프로세스는 실행 중인 상태이지만 동기화가 무기한 멈추던 문제를 해결하였습니다. 손상을 감지하면 해당 파일을 별도 이름으로 옮기고 오류 로그를 남긴 뒤, 타겟 DB의 `PRS_LCT`를 기준으로 유실 없이 동기화를 재개합니다. 자식 트랜잭션이 많은 트랜잭션의 체크포인트를 읽을 때 내부 버퍼를 넘어서던 문제도 함께 해결하였습니다.
* `MONITOR`로 Apply가 수행 중인 SQL을 조회할 때 Apply 프로세스가 비정상 종료되던 문제를 해결하였습니다. 조회하는 사이에 replay 스레드가 더 긴 SQL을 생성하면 내부 버퍼를 넘겨 쓰면서 프로세스가 종료되었습니다. 함께, 조회 결과에 생성 중이던 SQL이 잘리거나 직전 SQL 일부가 섞여 보이던 현상도 개선하였습니다.
* ProSync 호스트의 타임존 오프셋이 DB 서버보다 작은 환경(예: 호스트 UTC, DB 서버 KST)에서, 소스에 변경이 없는 유휴 구간의 dummy transaction이 `DUMMY_TX_INTERVAL` 주기가 아니라 두 타임존의 차이마다 한 번씩만 생성되어 타겟의 `PRS_LCT`가 오랫동안 진행하지 않던 문제를 해결하였습니다. Source Oracle과 Source Tibero에 모두 해당하며, 기존 설치 환경에는 메타 패치(`prs_meta.sh`)를 수행해야 반영됩니다.
  * 같은 원인으로 Oracle · Tibero 타겟의 `PRS_LCT` 시각 값이 DB 서버의 로컬 시각과 타임존 차이만큼 어긋나게 기록되던 문제도 함께 해결하였습니다. TSN 값은 정상이었고 시각 값만 어긋났습니다.
* `USE_ONLY_INSERT_BATCH=N`으로 DELETE도 배치 적용하는 환경에서, `MAP` 파라미터에 `RESOLVE BY TARGET`을 지정한 테이블의 여러 DELETE가 한 배치로 묶여 적용될 때 WHERE 절이 전체 컬럼이 아닌 key 컬럼만으로 만들어져 충돌 감지가 동작하지 않던 문제를 해결하였습니다. 타겟에서 값이 변경된 행도 그대로 삭제되었고, key가 없는 테이블에서는 비교 조건이 생성되지 않아 배치 적용이 실패하였습니다. 단건 적용 경로와 동일하게 전체 컬럼을 비교합니다.
* `USE_ONLY_INSERT_BATCH=N`으로 DELETE도 배치 적용하는 환경에서, 소스의 한 DELETE 문이 여러 행을 삭제해 다중 행 DELETE로 추출된 경우 이를 배치로 묶을 때 컬럼별 NULL 여부를 확인하지 않아 NULL이 섞인 행이 타겟에서 매칭되지 않던 문제를 해결하였습니다. 해당 배치는 `batch delete failed`로 실패해 트랜잭션이 롤백 후 재시도되었고, `MAP`에 충돌 해결 규칙을 지정한 테이블에서는 실패로 판정되지 않아 그 행이 타겟에 남을 수 있었습니다. UPDATE와 동일하게 NULL 패턴이 같은 문장끼리만 배치로 묶습니다.
* 충돌 해결(DCR)로 UPDATE를 INSERT로 전환해 재시도할 때 생성되는 SQL의 오류를 해결하였습니다.
  * 전환된 INSERT의 갱신 대상 컬럼에만 타겟에 맞는 변환 함수가 적용되지 않아, NCHAR · NVARCHAR 값이 이스케이프된 문자열 그대로 저장되거나(Source Oracle LogMiner 모드) BLOB · RAW 값이 올바르게 반영되지 않던 문제
  * 값을 나중에 채우는 LOB 컬럼의 초기값에 타겟이 지원하지 않는 함수가 사용되어 INSERT가 실패하던 문제(타겟이 PostgreSQL인 경우)
  * 갱신 대상 컬럼에 값을 나중에 채우는 LOB 컬럼이 포함되면 전환된 INSERT의 바인드 위치가 어긋나 INSERT가 실패하던 문제(타겟이 Oracle인 경우)
* 충돌 해결로 전환한 INSERT가 unique key 충돌 이외의 오류로 실패했음에도 성공으로 처리되어, 해당 변경이 타겟에 반영되지 않은 채 동기화가 계속 진행되고 재전송도 되지 않아 유실되던 문제를 해결하였습니다.
* `APPLY_TO_SAM=Y` 환경에서 한 트랜잭션에 DML이 2건 이상이면 SAM 파일에 첫 건만 기록되고 나머지가 누락되던 문제를 해결하였습니다. SAM 파일에 널 문자가 함께 기록되어, 스레드별 SAM 파일을 병합하는 과정에서 첫 줄 이후가 잘린 것이 원인으로, 트랜잭션당 DML이 1건이면 증상이 나타나지 않았습니다.
* `RECORD_HISTORY=Y` 환경에서 한 트랜잭션에 같은 테이블 INSERT가 2건 이상 묶여 배치로 적용되면 이력 테이블에 실제 건수보다 많은 행이 기록되고 첫 행이 중복 기록되던 문제를 해결하였습니다. 배치 UPDATE(`USE_ONLY_INSERT_BATCH=N`)의 이력 기록이 첫 행에서 멈춰 적용이 실패하던 문제와, 단건 UPDATE마다 이력 INSERT를 한 번 더 시도해 오류 로그와 이력 번호 시퀀스를 소모하던 문제도 함께 해결하였습니다.
* DISCARD 대상으로 등록하지 않은 오류까지 내용 없는 discard 로그로 기록되던 문제를 해결하였습니다.

#### DDL 동기화

* Oracle Object Table의 DDL에 포함된 OID 절로 Tibero 적용 시 `-7001 syntax error`가 발생하던 문제를 해결하였습니다.
* 멀티노드(Tibero TAC · Oracle RAC) 소스에서 여러 DDL이 한꺼번에 반영되거나 테이블을 DROP한 뒤 같은 이름으로 다시 생성한 경우, Extract가 Apply로 보내는 테이블 메타데이터에 같은 테이블 · 컬럼 정보가 중복되거나 DROP 이전 정보가 섞여 메타데이터가 어긋나던 문제를 해결하였습니다. 테이블별로 마지막 상태의 메타데이터만 전달합니다.
* Oracle → Tibero 시퀀스 동기화에서, 소스 redo에 기록된 시퀀스 변경 정보의 컬럼 구성에 따라 Apply가 대상 시퀀스의 소유자와 이름을 전달받지 못해 타겟 시퀀스 값이 갱신되지 않을 수 있던 문제를 해결하였습니다.

#### PostgreSQL

* 타겟이 PostgreSQL인 환경에서 INSERT가 타겟의 기존 행과 충돌(unique 제약 위반)해도 이를 충돌로 인식하지 못해, 설정한 충돌 해결(DCR) 규칙이 적용되지 않던 문제를 해결하였습니다.
* 타겟이 PostgreSQL인 환경에서 CLOB / BLOB 컬럼을 LARGEOBJECT로 매핑한 경우, 소스에서 해당 컬럼에 NULL을 INSERT하거나 NULL로 UPDATE하면 타겟에 NULL 대신 0바이트 Large Object가 만들어져 그 OID가 들어가던 문제를 해결하였습니다.

#### 공통

* `SHOW PARAMETER`로 Extract 또는 Apply의 파라미터를 조회할 때 `MAP`, `DDL`, `DISCARD_EC`(Apply)나 `FILTER`, `TX_FILTER_KEY`, `ROLLBACK_OBJECT_IDS`(Extract)처럼 목록을 값으로 갖는 파라미터의 설정값이 4000바이트를 넘으면 조회 대상 프로세스가 메모리 오류로 비정상 종료되던 문제를 해결하였습니다. ProSyncManager가 Agent를 통해 해당 프로세스의 파라미터를 조회하거나 기본값을 변경할 때 Agent가 같은 원인으로 비정상 종료될 수 있던 문제도 함께 해결하였습니다.
* 동기화 대상 테이블을 추가 · 제거하는 명령(`ALTER ... ADD / DELETE TABLE`)을 처리할 때마다 Extract가 소스 DB 접속을 끊고 재연결하여, 명령 수에 비례해 Extract의 메모리 사용량이 늘어나던 문제를 해결하였습니다(Source Oracle · Tibero). 이제 명령을 처리한 뒤에도 접속을 유지합니다.
* 제품 프로토콜이 아닌 메시지가 수신되어 연결을 거절할 때마다 프로세스 메모리가 회수되지 않고 조금씩 증가하던 문제를 해결하였습니다. 로그온 이전 단계에서 거절된 연결의 오류 정보가 회수되지 않고 계속 누적된 것이 원인으로, Agent · Apply · LLOB의 수신 포트로 포트 스캔이나 HTTP 요청 등 외부 트래픽이 반복 유입되는 환경에서 메모리 사용량이 크게 증가할 수 있었습니다. 거절한 연결의 오류를 로그에 남기고 해당 연결을 끊는 동작은 종전과 같습니다.

#### 설치 / 플랫폼

* `PRS_TARGET_MIN_PRIVILEGE=Y`로 설치해도 타겟 ProSync 유저에게 `CREATE / ALTER / DROP ANY` 계열 권한과 `COMMENT ANY TABLE`, `CONNECT` · `RESOURCE` 롤이 부여되어 타겟 DB 전역에 DDL을 수행할 수 있던 문제를 해결하였습니다. 이제 DML 동기화에 필요한 권한과 ProSync 내부 객체 생성을 위한 자기 스키마 범위의 `CREATE` 권한만 부여되므로, 타겟 ProSync 유저가 사용자 스키마의 객체를 생성하거나 변경할 수 없습니다.
  * 시퀀스 동기화에 필요한 `SELECT ANY SEQUENCE`, `ALTER ANY SEQUENCE`는 유지됩니다.
  * 타겟 DB가 Oracle 또는 Tibero인 경우에 해당합니다. 이 옵션으로 설치하면 DDL 동기화는 사용할 수 없으므로, DDL 동기화가 필요한 환경에서는 기본 설치 경로를 사용해야 합니다.
* 동기화 대상 목록(`prs_obj_group1.list`, `-l` 커스텀 목록) 처리에서 항목이 누락되거나 잘못 해석되어도 설치가 성공으로 끝나던 문제를 해결하였습니다. 파일 끝에 개행이 없으면 마지막 줄이 등록되지 않던 현상, 잘못된 형식의 항목이 오류 없이 처리되던 현상 등을 포함합니다. 이제 형식이 잘못된 항목이 있거나 등록된 대상이 없으면 설치를 중단합니다. `-l` 커스텀 목록에서 같은 객체를 가리키는 항목이 겹치면(예: `SCOTT.%`와 `SCOTT.EMP`) 중복 등록 오류로 설치가 중단되던 문제도 함께 해결하였습니다(Source Oracle · Tibero).
* PostgreSQL이 소스 또는 타겟인 구성의 설치에서, 설치 설정에 `DSN_DIR`을 지정하면 접속 정보 파일 준비 단계가 `NOT SET DB_TYPE`으로 중단되던 문제, 소스와 타겟의 DB 종류가 다를 때 한쪽의 접속 정보가 반대쪽 파일에 기록되던 문제, PostgreSQL 접속 확인 단계가 실제로 검사하지 않고 통과하던 문제를 해결하였습니다.
* 소스가 Oracle인 구성을 Solaris에 설치할 때 "Creating ProSync internal trigger" 단계에서 설치가 중단되던 문제를 해결하였습니다. 트리거 SQL 생성 스크립트의 정규식에 비ASCII 문자가 포함되어 SysV 계열 sed가 처리하지 못한 것이 원인입니다.
* 정상 설치인데도 설치 스크립트가 내부 헬퍼의 usage · 경고를 출력하거나, Solaris · AIX에서 설치 출력과 설치 로그의 시스템 확인 줄이 `-n Checking system type...`으로 출력되어 설치 실패로 오인될 수 있던 문제를 해결하였습니다. 동작에는 영향이 없던 출력입니다.
* `prs_adm`의 `STARTUP AGENT`로 Agent를 기동할 때, Agent가 초기화 단계에서 실패해도(Agent 설정 파일 오류, `USE_CM=Y`인데 `CM_SID` 환경 변수가 없는 경우 등) 기동 성공(`started`)으로 표시되던 문제를 해결하였습니다. 이제 초기화 결과를 최대 5초간 기다려, 실패하면 Agent가 보고한 오류와 함께 기동 실패를 표시합니다.
* `prs_adm`이 `prs_instance.map`에 등록된 Agent에 접속할 때 제한 시간이 없어, 원격 Agent 호스트가 응답하지 않으면 명령이 장시간 멈추던 문제를 해결하였습니다. 접속 제한 시간(5초, Agent 호스트를 `localhost` · `127.0.0.1` · `::1`로 등록한 경우 1초)을 두고, 접속하지 못한 Agent는 오류를 출력한 뒤 나머지 Agent로 진행합니다.
* `prs_meta.sh`를 Source Oracle에서 실행할 때 Oracle 버전을 확인하지 않아, 12c 이상에서 부여하는 권한(LOGMINING 등)이 누락되고 셸 오류 메시지가 출력되던 문제를 해결하였습니다.
* 타겟이 Oracle인 환경에서 `prs_meta.sh`가 타겟 DB의 `PRS_APPLY` 패키지를 다시 생성하지 않아, 메타 패치 후에도 이전 버전의 패키지가 남던 문제를 해결하였습니다. 이제 타겟이 Tibero인 경우와 같이 메타 패치 과정에서 `PRS_APPLY` 패키지를 다시 생성합니다.

### 편의성 개선

* 초기적재 보류 테이블에 DML 트랜잭션이 유보되어 병렬 적용 슬롯이 점유된 채 배분이 정지되는 상황을 진단할 수 있게 되었습니다.
  * 해당 상황에서 경고 로그를 출력합니다(반복 경고는 테이블당 30분 1회로 제한).
  * `TRACEDUMP DEPENDENCY`에 PR CONTEXT, FLOATING TX, BLOCKED TABLE 섹션이 추가되어 미할당 tx와 보류 테이블을 확인할 수 있습니다.
* Apply 로그의 트랜잭션 추적성이 개선되었습니다.
  * 소스에서 전체 롤백된 트랜잭션을 Apply가 폐기할 때 로그가 전혀 남지 않아 대용량 트랜잭션이 흔적 없이 사라진 것처럼 보이던 문제를 해결하여, xid · statement 수 · part file을 남깁니다.
  * 롤백 처리 로그 일부가 xid를 하위 32비트만 출력하던 문제를 해결하였습니다.
* Apply가 Extract 수신을 일시 중지 · 재개할 때 남기는 `Ext Block Flag` 로그가 경로에 따라 변경 전 값과 변경 후 값을 섞어 출력하던 문제를 해결하여, 같은 기준으로 비교할 수 있습니다.
* `ALLOCDUMP`가 ProSync 자체 할당자 상태에 더해 시스템 할당자 상태를 `PROSYNC_MALLOC_`로 시작하는 파일로 같은 위치에 함께 남깁니다. 파일 첫 줄에 VmRSS와 VmSize를 기록해 자체 할당자 몫과 그 밖의 메모리를 바로 대조할 수 있습니다. Linux에서만 동작하며 기존 출력은 그대로입니다.
* Tibero 접속(소스 · 타겟)에서 문장 실행 중 통신 오류가 발생했을 때, 실제 경과 시간과 무관하게 항상 `DML_WAIT_TIMEOUT` 초과로 기록하던 로그 문구를 정정하였습니다. 타임아웃 만료와 그 밖의 원인에 의한 연결 단절은 클라이언트에서 구분할 수 없으므로 두 가능성을 함께 안내하며, 재접속 · 재시도 동작은 종전과 동일합니다.
* `EXCLUDE_USER`에 여러 사용자를 따옴표로 묶어 지정할 때(`EXCLUDE_USER="USER1, USER2"`) 쉼표 뒤 공백 때문에 두 번째 이후 사용자가 제외되지 않던 문제를 해결하였습니다. 쉼표와 공백을 모두 구분자로 인식합니다. Source Tibero와, Source Oracle에서 LogMiner를 사용하지 않는 구성(`USE_LOGMNR=N`, 기본값)에 해당합니다. 따옴표 없이 지정할 때는 설정 파일이 공백 앞까지만 값으로 읽으므로 `USER1,USER2`처럼 공백 없이 지정해야 합니다.
* `TX_FILTER_KEY`의 EXCLUDE / SYNC는 개별 룰이 아니라 Extract 프로세스 전체의 모드이며, 키워드를 가진 첫 번째 룰이 모드를 결정합니다. 서로 다른 모드를 섞어 쓰거나, 모든 룰에 EXCLUDE / SYNC 키워드가 없어 기본값(SYNC)으로 동작하면 경고 로그를 남깁니다(판정 결과는 기존과 동일).

### 삭제 정보

#### Deleted Parameter

<table><thead><tr><th width="240">Parameter Name</th><th width="100">비고</th><th>대체</th></tr></thead><tbody><tr><td>IP_VERSION</td><td>Deleted</td><td>IP 버전 자동 판단</td></tr><tr><td>_LR_USE_AUTO_DELETE</td><td>Deleted</td><td>LR_FILE_DELETE_MODE(CNT / SIZE / RETENTION)와 해당 기준값 파라미터</td></tr><tr><td>_LR_BACKUP_FILE_COUNT</td><td>Deleted</td><td>LR_FILE_CNT(유지할 lr 파일 개수)</td></tr></tbody></table>

{% hint style="warning" %}
**업그레이드 시 주의**

제거된 파라미터가 설정 파일에 남아 있으면 해당 프로세스는 `unknown parameter` 오류로 기동하지 않습니다. 4.6 이하의 설치 스크립트는 `IP_VERSION`을 주석으로만 기록하므로 그대로 두어도 되지만, IPv6 환경에서 `IP_VERSION=6`을 지정하는 등 직접 추가한 경우에는 해당 줄을 먼저 삭제해야 합니다. `#`으로 주석 처리된 줄은 영향이 없습니다.

`_LR_USE_AUTO_DELETE`(기본값 N)와 `_LR_BACKUP_FILE_COUNT`(기본값 1024)는 4.6 이하가 생성한 설정 파일에는 포함되지 않는 히든 파라미터로, lr 파일 자동 삭제를 위해 Extract 설정 파일에 직접 추가한 경우에만 해당합니다. 두 항목을 삭제하고, 종전과 같이 개수 기준으로 정리하려면 `LR_FILE_DELETE_MODE=CNT`와 `LR_FILE_CNT`에 유지할 lr 파일 개수를 설정해야 합니다. 4.7의 기본값(`LR_FILE_CNT=0`)은 종전 기본값(`_LR_USE_AUTO_DELETE=N`)과 같이 lr 파일을 삭제하지 않습니다.
{% endhint %}

#### 제거된 기능

ProSync 4.7에서 제거된 기능입니다.

**정합성 검사(Verify) 기능이 ProSyncManager로 분리되었습니다.**

* 내장 Verify(VF) 프로세스가 제거되었습니다.
* `prs_adm`의 `VERIFY` 관련 명령이 제거되었습니다.
* `VF_GROUP_NUM`, `VF_SNAPSHOT_ERROR` 파라미터가 제거되었습니다.
* `VERIFY_TIMEOUT`은 기존 설정 파일이 그대로 읽히도록 남겨 두었으나 더 이상 동작하지 않습니다.
