> 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/administration/apply/key-features/history/sequential-access-method.md).

# Sequential Access Method (SAM)

ProSync는 동기화 과정 중에 전달하는 세그먼트를 파일에 순차적으로 기록할 수 있다.\
APPLY 프로세스에서 Target DB에 반영하는 STATEMENT 를 파일에 저장할 수 있는데, 이를 SAM 기능이라고 한다.

다음은 SAM 기능을 지원하는 데이터 타입이다.

<table><thead><tr><th width="116">구분</th><th>지원 타입</th></tr></thead><tbody><tr><td>Tibero</td><td>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</td></tr><tr><td>Oracle</td><td>NUMBER, CHAR, VARCHAR, DATE, TIME, TIMESTAMP, INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND, CLOB</td></tr><tr><td>PostgreSQL</td><td>SMALLINT, INTEGER, BIGINT, NUMERIC, DECIMAL, REAL, DOUBLE PRECISION, CHARACTER, CHARACTER VARYING, DATE, TIMESTAMP WITHOUT TIMEZONE</td></tr></tbody></table>

### SAM 기능에 사용되는 Parameters

\[*INST\_ID*]\_apply1.cfg 파일에 다음의 파라미터를 설정해야 한다.

```
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-16G)
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
```

### Parameters 설명

<table><thead><tr><th width="234">Parameter</th><th>설명</th></tr></thead><tbody><tr><td>APPLY_TO_SAM</td><td>APPLY 프로세스에서 DB로 반영하는 STATEMENT를 SAM 파일로 남길지 여부를 설정한다. (Y/N)</td></tr><tr><td>SAM_BIND_VALUE</td><td><p>SAM 파일에 남겨지는 Query 의 Value 값 저장 여부를 설정한다. (Y/N)</p><ul><li>Y : Value 값을 저장한다. (기본값)</li><li>N : Value 값을 '?' 로 치환한다.</li></ul></td></tr><tr><td>SAM_LOG_PREFIX</td><td><p>해당 Query가 수행된 시간과 스레드 데이터 정보를 SAM 파일 row의 시작 부분에 붙이는 기능이다. (Y|N)</p><ul><li>Y : 해당 정보를 row의 시작 부분에 첨부한다. (기본값)</li><li>N : 해당 정보를 남기지 않는다.</li></ul></td></tr><tr><td>SAM_DIR</td><td>프로세스의 SAM 파일이 저장되는 디렉터리 위치를 나타낸다.</td></tr><tr><td>SAM_FILE_SIZE</td><td><p>프로세스별 SAM 파일의 최대 크기를 설정한다.</p><p>SAM 파일의 크기가 SAM_FILE_SIZE를 넘으면 SAM_BACKUP_DIR로 옮긴 후 새로운 SAM 파일을 생성한다. (기본값: 16GB, 범위: 1MB ~ 16GB)</p></td></tr><tr><td>SAM_BACKUP_DIR</td><td>SAM 파일의 백업 파일이 저장되는 디렉터리 위치를 설정한다.</td></tr><tr><td>SAM_BACKUP_SIZE</td><td>SAM_BACKUP_SIZE는 SAM_BACKUP_DIR에 백업되는 SAM 파일들의 최대 크기를 설정한다. (기본값: 0 (제한없음), 범위: 0 ~ 128GB)</td></tr><tr><td>SQL_REDO_MODE</td><td><p>SQL_REDO_MODE 파라미터는 Sam File에 적히는 내용을 full dml/ddl로 적어주는 기능이다. (Y|N)</p><ul><li>Y : sam file에 row by row로 DML이 남게 된다. (기본값)</li><li>N : sam file에 row by row로 DML이 남지 않는다.</li></ul></td></tr><tr><td>TX_SAM_TEMPLATE</td><td><p>TX_SAM_TEMPLATE 파라미터는 트랜잭션을 Sam File에 출력할 때 사용할 user_defined_template 파일의 경로를 설정하는 파라미터이다. SQL_REDO_MODE가 N인 경우에 동작한다.</p><p>ProSync는 트랜잭션이 commit을 만날 때마다 본 파라미터 경로에 있는 템플릿을 읽어 해당 템플릿 형식대로 sam file에 트랜잭션 내용을 남긴다.</p></td></tr><tr><td>STMT_SAM_TEMPLATE</td><td><p>STMT_SAM_TEMPLATE 파라미터는 statement(dml/ddl) 내용을 Sam File에 남겨줄 때 사용할 user_defined_template 파일의 경로를 설정하는 파라미터이다. SQL_REDO_MODE가 N인 경우에 동작한다.</p><p>ProSync는 DDL과 DML 내용을 Sam File에 남겨줄 때 본 파라미터 경로에 있는 템플릿을 읽어 해당 템플릿 형식대로 sam file에 DDL, DML 내용을 남긴다.</p></td></tr><tr><td>COL_SAM_TEMPLATE</td><td><p>COL_SAM_TEMPLATE 파라미터는 DML을 출력할 때 컬럼 내용을 남길 때 사용할 user_defined_template 파일의 경로를 설정하는 파라미터이다. SQL_REDO_MODE가 N인 경우에 동작한다.</p><p>ProSync는 DML을 파일에 남겨줄 때 COL_SAM_TEMPLATE에 컬럼에 대한 정의가 되어 있다면 해당 템플릿 형식대로 sam file에 컬럼 정보를 남긴다.</p></td></tr></tbody></table>

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

SAM\_BIND\_VALUE 를 사용하여 SAM 파일에 Query의 value 값을 저장할 시, 동기화를 진행중인 table의 column 유형에 따라 SAM 파일의 과도한 용량 증가를 주의해야 한다.
{% endhint %}

### **SAM FILE TEMPLATE 설정**

본 절에서는 TX\_SAM\_TEMPLATE, STMT\_SAM\_TEMPLATE, COL\_SAM\_TEMPLATE 파라미터에서 사용할 템플릿을 설정하는 방법에 대해 서술한다.

템플릿 구성요소는 '% + 알파벳 하나(대소문자 구분)'으로 구성하며, 이렇게 구성된 표현값을 치환하여 Sam File에 출력한다.

#### TX\_SAM\_TEMPLATE

```
*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
}
```

<table><thead><tr><th width="150">항목</th><th width="91.3333740234375">표현값</th><th>의미</th></tr></thead><tbody><tr><td>xid</td><td>%X</td><td>트랜잭션의 xid</td></tr><tr><td>statement count</td><td>%C</td><td>트랜잭션의 statement(dml) 개수, ext sam에서는 출력하지 않는다.</td></tr><tr><td>commit tsn</td><td>%T</td><td>트랜잭션의 commit tsn</td></tr></tbody></table>

#### STMT\_SAM\_TEMPLATE, COL\_SAM\_TEMPLATE

```
*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
}        
```

#### STMT\_SAM\_TEMPLATE

<table><thead><tr><th width="150">항목</th><th width="94.6666259765625">표현값</th><th>설명</th></tr></thead><tbody><tr><td>op(string)</td><td>%O</td><td>dml : INSERT, UPDATE, DELETE, ddl : DDL</td></tr><tr><td>op code</td><td>%o</td><td>insert, update, delete, ddl에 대한 opcode</td></tr><tr><td>owner</td><td>%W</td><td>statement의 user name</td></tr><tr><td>name</td><td>%N</td><td>statement의 table name</td></tr><tr><td>sgmt id</td><td>%I</td><td>해당 object의 segment id</td></tr><tr><td>tsn</td><td>%T</td><td>statement가 실행된 tsn</td></tr><tr><td>wrap no</td><td>%R</td><td>statement의 wrap number</td></tr><tr><td>log seq</td><td>%L</td><td>statement가 기록된 log sequence number</td></tr><tr><td>set</td><td>%s</td><td>update 구문의 set 절에 대한 내용 (insert와 delete의 경우 empty string으로 치환)</td></tr><tr><td>where</td><td>%w</td><td>update, delete 구문의 where 절에 대한 내용 (insert의 경우 empty string으로 치환)</td></tr><tr><td>values</td><td>%v</td><td>insert 구문의 values 절에 대한 내용 (update, delete의 경우 empty string으로 치환)</td></tr><tr><td>ddl/dml string</td><td>%D</td><td>statement의 full dml/ddl string</td></tr></tbody></table>

#### COL\_SAM\_TEMPLATE

<table><thead><tr><th width="150">항목</th><th width="92.6666259765625">표현값</th><th width="509">설명</th></tr></thead><tbody><tr><td>column name</td><td>%N</td><td>column 이름</td></tr><tr><td>column value</td><td>%V</td><td>column 값</td></tr><tr><td>column count</td><td>%n</td><td>column count</td></tr></tbody></table>
