모든 페이지
1 / 7

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

공통 진단

프로세스 종류와 관계없이 공통으로 적용되는 crash/thread 진단 방법과 wallet 운영을 설명한다.

프로세스 Crash / Thread 장애

ProSync 프로세스의 signal 처리에는 일반적인 Unix 데몬과 다른 특성이 있다.

  • SIGSEGV, SIGBUS, SIGILL, SIGFPE 등의 fault가 발생하면 core 파일 대신 $PRS_HOME/var 하위의 prosync.out.<pid> 파일에 callstack이 기록된다.

  • Control Thread가 아닌 worker thread에서 crash가 발생하면 해당 thread만 종료될 수 있다. 따라서 프로세스 PID가 살아 있어도 필수 thread가 DEAD 상태일 수 있다.

  • SIGINT, SIGTERM, SIGHUP 신호는 무시된다. 지원되는 종료 방법은 Admin의 SHUTDOWN 명령이다.

프로세스가 비정상 동작하거나 응답하지 않는 경우 다음 순서로 점검한다.

  1. $PRS_HOME/var 하위에서 prosync.out.<pid> 파일을 찾아 callstack을 확인한다.

  2. STATUS <inst_id> 명령으로 모든 thread의 상태를 확인한다. 프로세스가 running이라도 개별 thread가 죽어 있을 수 있다.

  3. 필요 시 ALLOCDUMP, TRACEDUMP


설치 시 생성되는 cfg 파일에는 PRS_PWD=#encrypted와 같이 기록되는데, #encrypted는 암호화된 암호 문자열이 아니라 실제 암호를 wallet 파일에서 읽으라는 표시(sentinel)다.

암호가 저장되는 wallet 파일은 다음과 같다.

파일
용도

운영 시 다음 사항을 지켜야 한다.

  • 설정 파일(config)만 다른 노드로 복사해서는 프로세스를 기동할 수 없다. 노드 이관 시에는 wallet 파일을 함께 이관해야 한다.

  • wallet 파일은 백업 대상에 포함해야 하며, 파일 권한은 ProSync 운영 계정만 읽을 수 있도록 관리한다.

  • DB 비밀번호를 변경한 경우에는 wallet을 다시 생성해야 한다.

  • TDE를 사용하는 경우 .wallet

,
JCDUMP
등의 dump 명령으로 in-memory 상태를 수집한다. 명령 문법은
을 참고한다.
  • 종료 제어는 prs_adm의 SHUTDOWN 명령을 사용한다.

  • 일반 kill 신호(SIGINT/SIGTERM/SIGHUP)는 무시되므로, SHUTDOWN으로도 종료되지 않는 경우 최종 수단으로 SIGKILL(kill -9)을 사용한다.

  • 과 별도로
    .wallet_tde
    (및 HSM 사용 시
    .wallet_tde_hsm
    )가 필요하다.

    var/<instance>/.wallet

    일반 DB 접속 암호

    var/<instance>/.wallet_asm

    Oracle ASM 인스턴스 접속 암호 (ASM 구성 시 생성)

    var/<instance>/.wallet_tde

    진단 절차

    참고

    수집된 prosync.out.<pid> 파일과 dump 파일은 버그 리포트 시 함께 전달한다. 를 참고한다.

    Wallet 운영

    참고

    #encrypted sentinel과 생성되는 설정 파일의 예시는 의 '설치 결과 확인'을 참고한다.

    TDE wallet 암호

    var/<instance>/.wallet_tde_hsm

    HSM PIN

    명령어 목록
    Bug Report
    Instance 설치

    장애 대응 가이드

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

    Llob

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

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

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


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

    성능

    장애

    Apply

    성능

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

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


    장애

    반영 실패

    Source DB에서 추출한 변경 데이터에 대해 Target DB에 반영할 수 없는 경우, ProSync는 실패한 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를 수신한다.

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

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

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

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

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

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


    Apply의 복구 상태는 Target DB의 PRS_LCT(마지막 반영 TX 정보), PRS_COMMITTED_TX_LIST(commit 완료 TX 목록), 그리고 $PRS_HOME/var/<instance>/tx의 txh_*/txl_* 파일(미완료 TX)로 나누어 관리된다. 각 저장소의 역할은 Apply Process의 ''를 참고한다.

    Apply를 재기동하면 Ext와의 재연결 과정(handshake)에서 Apply에 저장된 이력 정보를 Ext에 전달하여 재추출 시작점을 결정한다. Ext는 그 지점부터 다시 추출하므로 일부 구간의 레코드가 재전송될 수 있으며, 이미 반영이 완료된 트랜잭션은 PRS_COMMITTED_TX_LIST를 통해 중복 반영 여부를 판정하여 건너뛴다.

    또한 반영 오류로 특정 DML이 계속 재시도되는 동안에는 해당 TX가 반영 완료로 기록되지 않으므로, 복구 기준점(PRS_LCT)도 그 이전 상태로 유지된다.

    log switch 시점에 아직 commit이 도달하지 않은 트랜잭션은 $PRS_HOME/var/<instance>/tx의 txh_*/txl_* 파일로 export되며, 재기동 시 import되어 이어서 처리된다.


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

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

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

    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 테이블에는 중복된 데이터가 저장될 수 있다.

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

    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를 기재하여 우회할 수 있다.

    복구와 Checkpoint

    CHUNK_TOTAL_SIZE

    TX_HASH_SIZE

    디스크 사용

    TX_HASH_FILE_CNT/TX_HASH_FILE_TOTAL_SIZE

    partfile

    재기동과 복구

    재기동 시 동작

    미완료 트랜잭션 복구

    주의

    • $PRS_HOME/var/<instance>/tx 디렉토리를 삭제하거나 유실하면 미완료 트랜잭션 정보를 복구할 수 없다.

    • Target DB를 재설치하거나 PRS_LCT 등 메타 테이블을 삭제하면 복구 기준점이 사라져 이어서 반영할 수 없으며, 초기 동기화 기준점부터 다시 구성해야 한다.

    주의사항

    Character Set 설정 주의사항

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

    참고

    예시

    • Source Database Character Set: UTF-8

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

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

    주의

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

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

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

    Oracle To Tibero 동기화 시 주의 사항

    주의

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

    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(4000)
    ) ROW STORE COMPRESS ADVANCED;
    
    SQL> INSERT INTO TEST.T1 VALUES (1, 1001, RPAD('C', 4000, 'C'));
    SQL> INSERT INTO TEST.T1 VALUES (2, 1002, RPAD('B', 4000, 'B'));
    SQL> COMMIT;
    
    SQL> ALTER TABLE TEST.T1 MOVE ONLINE NOCOMPRESS;
    -- Unique Constraints Violation 발생

    Bug Report

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

    프로세스
    config 파일 위치

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

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

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

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

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

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

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

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

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

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

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

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

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

    Extract

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

    Apply

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

    Llob

    $PRS_HOME/config/[INST_ID]_llob.cfg

    Agent

    $PRS_HOME/config/prs_agent_[AGENT_ID].cfg

    타 프로세스 로그

    TLI(OLI) 로그

    TLR(OLR) 로그

    Redo Log

    Agent 로그

    Tx Hash

    Extract

    성능

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

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

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

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

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


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

    DDL 메타데이터는 DML 변경 데이터와 별도의 경로로 전달된다. Source에서 DDL이 수행되면 설치 시 생성된 trigger(PRS_DDL_TRG, PostgreSQL은 event trigger)가 PRS_DD_META 패키지/함수를 호출하여 PRS_DDL_HIST 테이블에 기록하고, Extract가 PRS_DDL_HIST를 polling하여 DD version을 갱신한 뒤 Apply로 전달한다. 자세한 흐름은 제품 설계의 를 참고한다.

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

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

    다음 항목을 점검하면 DDL 메타데이터 경로의 장애를 진단할 수 있다.

    1. PRS_DDL_HIST에 오류 내용이 기록되어 있는지 확인한다.

    2. 최근 수행한 DDL이 PRS_DDL_HIST에 기록되고 있는지(기록 정체 여부)를 확인한다.

    3. 설치 시 생성된 trigger와 package(PRS_DDL_TRG, PRS_DD_META 등)가 유효한 상태인지 확인한다.

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

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

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

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

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

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

    파라미터
    설명

    PRS_USER의 권한이 회수되었는지 확인한다.

    _LR_SKIP_CORRUPTED_LCR

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

    DDL Metadata Flow
    이력조절

    장애

    패키지 수행 실패

    주의

    DDL 메타데이터가 PRS_DDL_HIST에 반영되지 않으면 Extract/Apply가 보유한 DD 정보와 실제 테이블 구조가 불일치하게 되어, 이후 동기화 오류로 이어질 수 있다.

    권한 없음

    Log Reader 오류

    진단 가이드

    ProSync 운영 중 문제가 발생하면 프로세스 로그, 로그 리더 트레이스, 덤프 파일 등 여러 곳의 진단 정보를 조합해 원인을 분석한다. 본 문서는 증상별로 어떤 진단 도구를 사용해야 하는지, 각 도구의 출력이 어디에 생성되고 어떻게 읽는지를 안내한다.

    증상별 진단 도구 선택

    증상 / 목적
    사용 도구
    출력 위치

    프로세스 오류 메시지, 동작 이상 확인

    프로세스 로그 (LOG_LEVEL)

    var/<인스턴스ID>/log/

    인스턴스의 모든 진단 정보는 $PRS_HOME/var/<인스턴스ID>/ 아래에 모인다. Agent 프로세스는 별도로 $PRS_HOME/var/agent/<Agent ID>/ 를 사용한다.

    로그 디렉터리는 각 프로세스 cfg 의 LOG_DIR 파라미터가 지정한다. 설치 시 기본값은 $PRS_HOME/var/<인스턴스ID>/log (Agent 는 $PRS_HOME/var/agent/<Agent ID>/log) 이다.

    프로세스
    로그 파일명

    프로세스 기동 시 로그 파일 앞부분에 OS 정보(uname -a)와 사용 중인 cfg 파일 전체 내용이 ProSync configurations 블록으로 기록된다. 문제 분석 시 실제 적용된 파라미터 값을 이 블록에서 먼저 확인한다.

    LOG_LEVEL 파라미터(1~5, 기본값 3)가 기록할 메시지의 상세 수준을 결정한다. 설정한 값 이하 레벨의 메시지만 기록된다.

    LOG_LEVEL
    기록되는 메시지
    표시 문자
    필드
    의미

    로그 파일이 LOG_FILE_SIZE(기본 100MB)를 넘으면 LOG_BACKUP_DIR 로 이동되고 새 파일이 열린다. 설치 시 기본 백업 디렉터리는 프로세스별로 분리된다 (Extract <LOG_DIR>/ext_backup, Apply <LOG_DIR>/apply_backup, Llob <LOG_DIR>/llob_backup, Agent <LOG_DIR>/backup). 백업 파일명은 원래 이름 뒤에 시각이 붙는다 (예: agent_trace.log.260721_143000.123456). 백업 파일들의 총 크기가 LOG_BACKUP_SIZE 를 넘으면 가장 오래된 파일부터 삭제되며, 기본값 0 은 삭제하지 않음(무제한 보관) 을 뜻하므로 디스크 용량 관리가 필요한 환경에서는 값을 지정한다.

    컬럼 값 깨짐을 분석할 때는 히든 파라미터 _PRS_FULL_HEX_DUMP=Y 를 cfg 파일에 직접 추가하고 (템플릿에 없는 파라미터다) 프로세스를 재기동한다. LOG_LEVEL=5 와 함께 사용하면 값 전체가 16바이트 단위 여러 줄로 출력되고, Apply 의 batch INSERT/UPDATE/DELETE 실행 직전에 바인드 값 전체 덤프(NEW COLS DUMP, OLD COLS DUMP 등)가 추가로 기록된다.

    LR_TRACE_LVL(1~5, 기본값 2) 이 로그 리더 트레이스의 상세 수준을 결정하며, 값이 높을수록 상세하다. 소스 DB 가 Oracle 또는 Tibero 인 Extract 에만 적용되고, PostgreSQL 소스에는 사용되지 않는다.

    트레이스 파일: $PRS_HOME/var/<인스턴스ID>/lr<N>/<인스턴스ID>_ext<N>_li.log

    위치는 LR_LOG_DIR, 크기·백업은 LR_LOG_FILE_SIZE / LR_LOG_BACKUP_DIR / LR_LOG_BACKUP_SIZE 파라미터로 제어한다. 트레이스 한 줄에는 공통 로그 형식 뒤에 트랜잭션 ID([xid])와 Redo 레코드 주소((0x<seq>.<blkno>.<offset>))가 포함되어 문제 레코드의 위치를 특정할 수 있다.

    트레이스 파일: $PRS_HOME/var/<인스턴스ID>/lr<N>/tli<N>.log

    재기동 없이 변경할 수 있다. 파싱 문제 분석 시 레벨을 올려 문제 구간을 재현한 뒤 기본값으로 되돌린다.

    prs_adm 에서 실행하는 진단 명령 요약이다. 명령어 기본 사용법은 을 참고한다.

    명령
    용도
    대상 프로세스
    출력

    Apply 가 느릴 때 어떤 replay 스레드가 어떤 SQL 에서 시간을 쓰고 있는지 확인한다.

    Applying... <경과시간>(ms) 인 스레드가 현재 SQL 을 적용 중인 것이다. Completed 스레드에도 Query 블록이 출력되는데, 이는 현재 실행 중이 아니라 마지막으로 실행한 SQL 이다. 특정 스레드의 경과시간이 계속 크다면 해당 SQL(대상 테이블의 인덱스 유무, lock 대기 등)을 점검한다. MONITOR 는 인스턴스의 1번 Apply 프로세스를 대상으로 한다.

    Apply 가 메모리에 들고 있는 상태를 파일로 남긴다. 소스·타겟 간 DD 불일치나 트랜잭션 대기 상태 분석에 사용한다.

    종류를 생략하면 전체를 덤프한다. 같은 이름의 기존 파일은 덮어쓴다.

    프로세스 내부의 스레드별 성능 카운터(호출 횟수·처리량·소요시간)를 스냅샷으로 남기고, 두 스냅샷의 차이를 리포트로 출력한다. "부하 구간에서 어느 스레드·어느 단계가 병목인가"를 확인하는 도구다.

    1

    부하 전 스냅샷

    var/<인스턴스ID>/jcdump/jcdump_<시각>_apply_before_load 파일이 생성된다. 라벨(마지막 인자)은 생략 가능하지만 붙여두면 COMPARE 때 파일을 찾기 쉽다.

    2

    부하 후 스냅샷

    분석하려는 구간이 지난 뒤 같은 명령을 라벨만 바꿔 실행한다.

    3

    프로세스의 메모리 할당 현황(할당자 계층별 사용량)을 덤프한다. 메모리 사용량이 계속 증가할 때 어느 모듈이 점유 중인지 확인하는 용도다.

    var/<인스턴스ID>/alloc/ 에 PROSYNC_DUMP_<inst>_Apply.<PID>.<시각> 파일이 생성된다. 접속 DB 가 Tibero 인 경우 DB 클라이언트 라이브러리 메모리를 담은 CLI_DUMP_* 파일이 추가로 생성된다.

    다음 두 가지로 확인한다.

    1. 콜스택 덤프 파일 존재 여부 — $PRS_HOME/var/<인스턴스ID>/prosync.out.<PID> (Agent 는 var/agent/<Agent ID>/prosync.out.<PID>). 이 파일은 크래시가 있었을 때만 생성된다.

    2. 프로세스 로그의 FATAL 메시지 — 크래시 시 다음 순서로 기록된다.

    STATUS <인스턴스ID> 명령으로도 프로세스 내 스레드별 상태를 확인할 수 있다.

    같은 프로세스에서 크래시가 반복되면 한 파일에 누적(append)된다. 함수명은 근사 매칭이므로 오프셋이 실제와 다를 수 있다. 버그 리포트 시 이 파일과 로그의 Signal ... caught 메시지를 함께 전달한다. 리포트 항목은 를 참고한다.

    ProSync 프로세스는 SIGTERM/SIGINT/SIGHUP 을 무시한다. 일반 kill 이나 Ctrl-C 로는 종료되지 않으며, 정상 종료 수단은 prs_adm 의 SHUTDOWN 명령이다 (불가피한 경우에만 kill -9 를 사용한다).

    개발 지원이 필요한 크래시 분석 시, 히든 파라미터 _SLEEP_ON_SIG=Y 를 cfg 에 추가하고 재기동하면 크래시 시그널을 받은 스레드가 종료되지 않고 대기 상태로 남아 gdb attach 가 가능하다.

    진단 관련 파라미터 대부분은 재기동 없이 변경할 수 있다.

    • 프로세스 타입을 생략하면 인스턴스의 모든 프로세스에 전송된다. 파라미터를 지원하지 않는 프로세스는 not supported. 로 응답하므로, 대상 프로세스를 명시하는 것을 권장한다.

    • 변경값은 메모리에만 반영된다. 프로세스를 재기동하면 cfg 파일 값으로 되돌아가므로, 영구 변경은 cfg 파일도 함께 수정한다.

    • 성공 시 Process Apply(num :'1') changed parameter('LOG_LEVEL' = '5'). 형태로 출력된다.

    런타임 변경이 가능한 파라미터는 프로세스별로 다음과 같이 제한되며, 목록에 없는 파라미터는 not supported. 오류가 반환된다.

    프로세스
    런타임 변경 가능 파라미터

    각 파라미터의 의미와 유효 범위는 를 참고한다.

    Llob

    <인스턴스ID>_llob_trace.log

    Admin

    adm_trace.log (기본 $PRS_HOME/var/admin/log)

    3 (기본)

    + INFO

    [I]

    4

    + TRACE

    [T]

    5

    + DEBUG

    [D]

    ④ 메시지

    로그 본문

    ⑤ 소스 위치

    FATAL/ERROR/WARN 메시지에만 붙는다. 버그 리포트 시 함께 전달한다

    Replay 스레드별 실행 중 SQL·경과시간

    Apply(1번)

    prs_adm 화면

    TRACE[DUMP] <inst_id> [종류]

    in-memory DD·트랜잭션 큐 덤프

    Apply

    var/<inst>/dump/

    JC[DUMP] <inst_id> [프로세스] [라벨]

    성능 통계 스냅샷

    Ext/Apply/Llob

    var/<inst>/jcdump/

    ALLOC[DUMP] <inst_id> [프로세스]

    메모리 할당 현황 덤프

    Ext/Apply/Llob

    var/<inst>/alloc/

    <inst>_merge_<PID>_<TID>.dump

    QUEUE

    병렬 replay 의 wait/replay 큐

    <inst>_queue_<PID>_<TID>.dump

    DEPENDENCY

    replay 스레드별 트랜잭션 의존성 표

    <inst>_txdep_<PID>_<TID>.dump

    차이 리포트 출력

    스레드별로 stat 이름(JC_*)·Count·Value·Time·Max 표가 출력된다. 파일 인자는 파일명의 일부만 입력해도 되며, 여러 개가 매칭되면 후보 목록에서 선택한다. 파일 하나만 주면 프로세스 기동 이후의 누적치를 출력한다.

    Redo Log 파싱 문제 (Extract 추출 오류)

    로그 리더 트레이스 (LR_TRACE_LVL)

    var/<인스턴스ID>/lr<N>/

    Apply 적용 지연, 오래 걸리는 SQL 확인

    MONITOR 명령

    prs_adm 화면

    프로세스·스레드 상태 확인

    STATUS 명령

    prs_adm 화면

    DD(테이블 메타데이터) 불일치, 트랜잭션 큐 상태

    TRACEDUMP 명령

    var/<인스턴스ID>/dump/

    구간별 성능 통계 (스레드별 처리량·소요시간)

    JCDUMP 명령

    var/<인스턴스ID>/jcdump/

    메모리 사용량 분석

    ALLOCDUMP 명령

    var/<인스턴스ID>/alloc/

    프로세스 크래시 (스레드 비정상 종료)

    콜스택 덤프 파일

    var/<인스턴스ID>/prosync.out.<PID>

    Agent

    agent_trace.log

    Extract

    <인스턴스ID>_ext<N>_trace.log

    Apply

    1

    FATAL + ERROR

    [F] [E]

    2

    + WARN

    ① 시각

    월-일T시:분:초.마이크로초 (연도는 기록되지 않음)

    ② 기록 주체

    스레드 종류 약어 + 스레드 번호. REA(read), CON(const), MER(merge), REP(replay), LLO(llob), CTH/MTH/WTH(control/monitor/worker), SAM, DMP(dump) 등

    ③ 레벨

    STATUS [inst_id]

    프로세스·스레드 상태 확인

    전체

    prs_adm 화면

    종류

    내용

    파일명 (var/<inst>/dump/)

    DD

    테이블 메타데이터 (const/replay 스레드용 2벌)

    <inst>_const_dd_<PID>_<TID>.dump, <inst>_replay_dd_<PID>_<TID>.dump

    MERGE

    Extract

    LOG_LEVEL, LOG_FILE_SIZE, LOG_BACKUP_SIZE, LR_TRACE_LVL, ENABLE_NETWORK_COMPRESS, EXT_TO_SAM, SAM_BIND_VALUE, SAM_LOG_PREFIX, SAM_FILE_SIZE, SAM_BACKUP_SIZE, LR_FILE_RETENTION_DAY, RETENTION_FILE_CLEANUP_INTERVAL

    Apply

    LOG_LEVEL, LOG_FILE_SIZE, LOG_BACKUP_SIZE, TX_HASH_SIZE, DDL, MAP, APPLY_TO_SAM, SAM_BIND_VALUE, SAM_LOG_PREFIX, SAM_FILE_SIZE, SAM_BACKUP_SIZE, APPLY_REPORT_FILE_SIZE, APPLY_REPORT_BACKUP_SIZE, DISCARD_FILE_YN, DISCARD_FILE_SIZE, DISCARD_BACKUP_SIZE, TX_HASH_FILE_RETENTION_DAY, RETENTION_FILE_CLEANUP_INTERVAL

    Llob

    명령어 목록
    Bug Report
    참고자료_파라미터

    런타임 디렉터리 구조

    Apply 의 동기화 체크포인트(TSN)는 디스크가 아니라 타겟 DB 의 PRS_LCT 테이블에 저장된다. 현재 체크포인트는 타겟 DB 에서 SELECT TSN FROM PRS_LCT 로 확인할 수 있으며, Apply 로그에는 UPDATE LCT SUCCESS (<이전값> -> <새값>) 형태로 전진 이력이 남는다. 재설치 시 이 테이블이 재생성되므로 동기화 기준점이 리셋된다는 점에 유의한다.

    프로세스 로그

    위치와 파일명

    로그 레벨 (LOG_LEVEL)

    LOG_LEVEL 은 재기동 없이 변경할 수 있다. 문제 재현 시에만 잠시 올렸다가 되돌리는 사용을 권장한다.

    변경값은 메모리에만 반영되므로 프로세스를 재기동하면 cfg 값으로 되돌아간다. 자세한 내용은 본 문서 하단의 '런타임 파라미터 변경' 절을 참고한다.

    로그 한 줄 읽는 법

    로그 파일 순환

    컬럼 값 전체 확인 (_PRS_FULL_HEX_DUMP)

    LOG_LEVEL=5 에서 출력되는 컬럼 값 hex dump 는 기본적으로 첫 16바이트 한 줄만 출력되며, 잘렸다는 표시가 없다. 값이 짧아 보여도 실제로는 뒷부분이 생략된 것일 수 있다.

    로그 리더 트레이스 (LR_TRACE_LVL)

    Redo Log 파싱 과정은 LOG_LEVEL 을 올려도 보이지 않는다. 로그 리더는 별도 파라미터 LR_TRACE_LVL 과 별도 트레이스 파일을 사용한다.

    lr<N>/ 디렉터리의 redo_data_*.olr 파일(Tibero 는 *.tlr)은 트레이스가 아니라 미커밋 트랜잭션 스냅샷이다. Extract 재기동 시 이 파일을 읽어 추출을 재개하므로 임의로 삭제하면 안 된다. 자동 삭제 방식은 LR_FILE_DELETE_MODE(SIZE|CNT|RETENTION, 기본값 CNT)가 결정하며, 선택된 모드에 해당하는 파라미터(LR_FILE_TOTAL_SIZE / LR_FILE_CNT / LR_FILE_RETENTION_DAY)만 적용된다. 해당 파라미터의 기본값 0 은 자동 삭제를 하지 않는다.

    Admin 진단 명령

    MONITOR — Apply 지연 분석

    TRACEDUMP — DD·트랜잭션 큐 덤프

    MERGE 는 소스 DB 가 2개 이상일 때만, QUEUE 는 병렬 replay 모드일 때만 내용이 기록된다. 해당 구성이 아니면 내용(큐 항목) 없이 빈 파일 또는 헤더만 있는 파일이 생성되는 것이 정상이다.

    JCDUMP — 구간 성능 통계

    스냅샷 원본 파일은 stat 번호와 16진수 카운터라 직접 읽기 어렵다 — 반드시 JCDUMP COMPARE 로 리포트를 생성한다. 또한 프로세스가 재기동되면 스냅샷 식별자가 바뀌어 재기동 전후의 파일은 비교할 수 없다 (id mismatch 오류).

    ALLOCDUMP — 메모리 사용 분석

    크래시 진단

    ProSync 는 크래시 시 OS core 파일을 만들지 않는다. 자체 시그널 핸들러가 콜스택을 파일로 남기고 문제가 발생한 스레드만 종료하므로 (단, control 스레드에서 크래시가 나면 프로세스 전체가 종료된다), 프로세스가 ps 에 살아 있어도 내부 스레드가 죽어 동기화가 멈춰 있을 수 있다.

    크래시 확인 방법

    콜스택 덤프 파일 (prosync.out)

    프로세스 종료와 시그널

    gdb 분석 (_SLEEP_ON_SIG)

    _SLEEP_ON_SIG=Y 상태에서 크래시가 나면 해당 스레드는 gdb 로 개입하기 전까지 무한 대기한다. SIGSEGV 등 일반 크래시에서는 대기가 콜스택 덤프보다 먼저라 개입 전까지 prosync.out 파일도 생성되지 않는다 (SIGABRT 는 덤프를 먼저 남긴 뒤 대기한다). 상시 운영 환경에는 설정하지 않는다.

    런타임 파라미터 변경 (ALTER ... SET)

    <인스턴스ID>_apply<N>_trace.log

    [W]

    F/E/W/I/T/D

    MON[ITOR] <inst_id>

    다중 소스 merge 큐의 대기 stmt

    LOG_LEVEL, LOG_FILE_SIZE, LOG_BACKUP_SIZE

    Admin> JCDUMP COMPARE <인스턴스ID> before_load after_load
    $PRS_HOME/var/<인스턴스ID>/
    ├── log/                  # 프로세스 로그 (ext/apply/llob)
    │   ├── ext_backup/       #   ├ 로그 순환 백업 (프로세스별 분리)
    │   ├── apply_backup/     #   │
    │   └── llob_backup/      #   ┘
    ├── lr<N>/                # Extract 로그 리더 작업 디렉터리 (N = Extract 번호)
    │   ├── *_li.log          #   ├ 로그 리더 트레이스 (Oracle 소스)
    │   ├── tli<N>.log        #   ├ 로그 리더 트레이스 (Tibero 소스)
    │   └── redo_data_*.olr   #   ┘ 미커밋 트랜잭션 스냅샷 (Tibero 는 *.tlr)
    ├── tx/                   # Apply 트랜잭션 체크포인트(txh_*.dat, txl_*.dat)·대형 tx 임시파일(part_*.dat)
    ├── dump/                 # TRACEDUMP 출력
    ├── jcdump/               # JCDUMP 출력
    ├── alloc/                # ALLOCDUMP 출력
    ├── path/                 # Admin 명령 수신용 FIFO (extd001, applyd001, llobd 형식)
    ├── prosync.out.<PID>     # 크래시 시 콜스택 덤프 (크래시가 없으면 존재하지 않음)
    └── .wallet               # DB 접속 비밀번호 지갑 파일 (TDE 사용 시 .wallet_tde 추가)
    [07-21T14:03:22.123456] [REP-12] [W] Failed to update Lowerbound Commit Tsn [prs_apply_replay.c:7912]
     └─ ①                    └─ ②     └─ ③ └─ ④                                  └─ ⑤
    Admin> ALTER <인스턴스ID> EXT SET LR_TRACE_LVL = '5'
    Admin> MONITOR <인스턴스ID>
    
    =========
    Thread #0  Applying... 1523(ms)
    =========
    
    Query:
    UPDATE "OWNER"."TABLE1" SET ...
    
    =========
    Thread #1  Completed
    =========
    
    Query:
    INSERT INTO "OWNER"."TABLE2" ...
    TRACE[DUMP] <inst_id> [DD | MER[GE] | QUE[UE] | DEP[ENDENCY]]
    Admin> JCDUMP <인스턴스ID> APPLY before_load
    Admin> JCDUMP <인스턴스ID> APPLY after_load
    Admin> ALLOCDUMP <인스턴스ID> APPLY
    [F] Signal 11 (SIGSEGV) caught (PID = 12345): si_addr = 0x...
    [F] callstack dumped to /prosync/var/tib2tib/prosync.out.12345
    [F] replay thread terminated abnormally.
    *** 2026/07/21 14:03:22.123 ***
        [00] 0x004a1b2c:0x7f... = prs_replay_bind_value + 0x01a4
        [01] 0x004a0f00:0x7f... = ??????
        [02] 0x00401234:0x7f... = start_thread + 0x00d5
    Admin> SHUTDOWN <인스턴스ID> [EXT|APPLY|LLOB] [ABORT]
    ALTER <inst_id> [EXT[RACT] | APP[LY] | LLOB] SET <파라미터> = <값>
    Admin> ALTER <인스턴스ID> APPLY SET LOG_LEVEL = '5'