> 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/troubleshooting/apply.md).

# Apply

## 성능

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

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

###

***

## 장애

### 반영 실패

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

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

### 메모리 과점유

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

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

#### 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를 수신한다.

#### MERGE\_BLOCK\_CNT/MERGE\_RESUME\_CNT

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

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

#### CHUNK\_TOTAL\_SIZE

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

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

#### TX\_HASH\_SIZE

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

### 디스크 사용

#### TX\_HASH\_FILE\_CNT/TX\_HASH\_FILE\_TOTAL\_SIZE

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

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

#### partfile

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

###

***

## 주의사항

### Character Set 설정 주의사항

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

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

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

{% hint style="info" %}
**참고**

**예시**&#x20;

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

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

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

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

```sql
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;
/
```

위와 같은 환경에서 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가 존재해서는 안 된다.

{% hint style="warning" %}
**주의**

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

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

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

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

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

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

```sql
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 발생
```

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

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

{% hint style="warning" %}
**주의**

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

###


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.tibero.com/prosync/troubleshooting/apply.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
