All pages
1 of 17

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

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

[INST_ID]_apply1.cfg ํŒŒ์ผ์— ๋‹ค์Œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.

Parameter
์„ค๋ช…

๋ณธ ์ ˆ์—์„œ๋Š” TX_SAM_TEMPLATE, STMT_SAM_TEMPLATE, COL_SAM_TEMPLATE ํŒŒ๋ผ๋ฏธํ„ฐ์—์„œ ์‚ฌ์šฉํ•  ํ…œํ”Œ๋ฆฟ์„ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„œ์ˆ ํ•œ๋‹ค.

ํ…œํ”Œ๋ฆฟ ๊ตฌ์„ฑ์š”์†Œ๋Š” '% + ์•ŒํŒŒ๋ฒณ ํ•˜๋‚˜(๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„)"์œผ๋กœ ๊ตฌ์„ฑํ•˜๋ฉฐ, ์ด๋ ‡๊ฒŒ ๊ตฌ์„ฑ๋œ ํ‘œํ˜„๊ฐ’์„ ์น˜ํ™˜ํ•˜์—ฌ Sam File์— ์ถœ๋ ฅํ•œ๋‹ค.

ํ•ญ๋ชฉ
ํ‘œํ˜„๊ฐ’
์˜๋ฏธ

ํ•ญ๋ชฉ
ํ‘œํ˜„๊ฐ’
์„ค๋ช…

ํ•ญ๋ชฉ
ํ‘œํ˜„๊ฐ’
์„ค๋ช…

Oracle

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=[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

APPLY_TO_SAM

APPLY ํ”„๋กœ์„ธ์Šค์—์„œ DB๋กœ ๋ฐ˜์˜ํ•˜๋Š” STATEMENT๋ฅผ SAM ํŒŒ์ผ๋กœ ๋‚จ๊ธธ์ง€ ์—ฌ๋ถ€๋ฅผ ์„ค์ •ํ•œ๋‹ค. (Y/N)

SAM_BIND_VALUE

SAM ํŒŒ์ผ์— ๋‚จ๊ฒจ์ง€๋Š” Query ์˜ Value ๊ฐ’ ์ €์žฅ ์—ฌ๋ถ€๋ฅผ ์„ค์ •ํ•œ๋‹ค. (Y/N)

  • Y : Value ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค. (๊ธฐ๋ณธ๊ฐ’)

  • N : Value ๊ฐ’์„ '?' ๋กœ ์น˜ํ™˜ํ•œ๋‹ค.

SAM_LOG_PREFIX

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

xid

%X

ํŠธ๋žœ์žญ์…˜์˜ xid

statement count

%C

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

op(string)

%O

dml : INSERT, UPDATE, DELETE, ddl : DDL

op code

%o

column name

%N

column ์ด๋ฆ„

column value

%V

SAM ๊ธฐ๋Šฅ์— ์‚ฌ์šฉ๋˜๋Š” Parameters

Parameters ์„ค๋ช…

์ฃผ์˜

SAM_BIND_VALUE ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ SAM ํŒŒ์ผ์— Query์˜ value ๊ฐ’์„ ์ €์žฅํ•  ์‹œ, ๋™๊ธฐํ™”๋ฅผ ์ง„ํ–‰์ค‘์ธ table์˜ column ์œ ํ˜•์— ๋”ฐ๋ผ SAM ํŒŒ์ผ์˜ ๊ณผ๋„ํ•œ ์šฉ๋Ÿ‰ ์ฆ๊ฐ€๋ฅผ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

SAM FILE TEMPLATE ์„ค์ •

TX_SAM_TEMPLATE

STMT_SAM_TEMPLATE, COL_SAM_TEMPLATE

STMT_SAM_TEMPLATE

COL_SAM_TEMPLATE

ํ•ด๋‹น Query๊ฐ€ ์ˆ˜ํ–‰๋œ ์‹œ๊ฐ„๊ณผ ์Šค๋ ˆ๋“œ ๋ฐ์ดํ„ฐ ์ •๋ณด๋ฅผ SAM ํŒŒ์ผ row์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์— ๋ถ™์ด๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. (Y|N)

  • Y : ํ•ด๋‹น ์ •๋ณด๋ฅผ row์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์— ์ฒจ๋ถ€ํ•œ๋‹ค. (๊ธฐ๋ณธ๊ฐ’)

  • N : ํ•ด๋‹น ์ •๋ณด๋ฅผ ๋‚จ๊ธฐ์ง€ ์•Š๋Š”๋‹ค.

SAM_DIR

ํ”„๋กœ์„ธ์Šค์˜ SAM ํŒŒ์ผ์ด ์ €์žฅ๋˜๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

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์— ์ปฌ๋Ÿผ ์ •๋ณด๋ฅผ ๋‚จ๊ธด๋‹ค.

ํŠธ๋žœ์žญ์…˜์˜ statement(dml) ๊ฐœ์ˆ˜, ext sam์—์„œ๋Š” ์ถœ๋ ฅํ•˜์ง€ ์•Š๋Š”๋‹ค.

commit tsn

%T

ํŠธ๋žœ์žญ์…˜์˜ commit tsn

insert, update, delete, ddl์— ๋Œ€ํ•œ opcode

owner

%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

column ๊ฐ’

column count

%n

column count

Mapping

๋ณธ ์žฅ์—์„œ๋Š” Map ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ†ตํ•ด ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” Resolution Rule (DCR)๊ณผ Schema Mapping์„ ์œ„ํ•œ DDL ์„ค์ •์— ๋Œ€ํ•ด ์•Œ์•„๋ณธ๋‹ค. Mapping์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ…Œ์ด๋ธ”๋ช…, ์ปฌ๋Ÿผ๋ช…์— ๋Œ€ํ•œ Mapping์„ ์ง€์›ํ•œ๋‹ค.

Performance

ProSync๋Š” Apply ํ”„๋กœ์„ธ์Šค ์ง€์—ฐ ์‹œ ๋ชจ๋“  ๊ณณ์— ์ง€์—ฐ์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค. ์ด ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์„ ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋‹จ๋“ค์ด ์กด์žฌํ•œ๋‹ค. ๋ณธ ์žฅ์—์„  Performance ์ธก๋ฉด์—์„œ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” Configuration๋“ค์— ๋Œ€ํ•ด ์•Œ์•„๋ณธ๋‹ค.

Conflict

๋ฐ์ดํ„ฐ ์ถฉ๋Œ ๋ฐœ์ƒ ์‹œ, ์ฒ˜๋ฆฌ๋ฐฉ์•ˆ์— ๋Œ€ํ•ด ํ™•์ธํ•œ๋‹ค.

Data Conflict Rule (DCR)

MAP Rule์—์„œ ์†Œ๊ฐœํ•œ Data Conflict Rule์˜ ์‹œ๋‚˜๋ฆฌ์˜ค๋“ค์„ ์ •๋ฆฌํ•œ๋‹ค. ์˜ต์…˜์„ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํ•ด๋‹น ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

DCR์˜ ์ œ์•ฝ์‚ฌํ•ญ

Data Conflict๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด Row๋ฅผ ํŠน์ •ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ProSync์—์„œ๋Š” ์ด์— ๋Œ€ํ•œ ๊ธฐ์ค€์„ Primary key๋กœ ๋‘๊ณ  ์žˆ๋‹ค. Primary key ๋กœ ์ธํ•ด ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ, Source Database, Target Database, Column Min(Max) ๊ธฐ์ค€์œผ๋กœ ๋ฐ์ดํ„ฐ Conflict์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.

Prosync๋Š” where์ ˆ์— lob column์€ ํ™•์ธํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ๋น„๊ต ์‹œ ํ•ด๋‹น column์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ค๋ฅด๋”๋ผ๋„ ๋‹ค๋ฅธ column ๊ฐ’์ด ๋™์ผํ•˜๋‹ค๋ฉด ์„ฑ๊ณต์ ์œผ๋กœ dml์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

DCR - MIN/MAX ์„ค์ • ํ›„ ๋™์ผํ•œ ๊ฐ’์œผ๋กœ dml ์ˆ˜ํ–‰ ์‹œ, ๋น„๊ต ๋กœ์ง์—์„œ ์ถฉ๋Œ์„ ์œ ๋ฐœํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์–‘์ธก ๋…ธ๋“œ์—์„œ ์ •์ƒ dml์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์‹œ๋‚˜๋ฆฌ์˜ค

Resolve By Source

1. Insert

Insert๋ฌธ์—์„œ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•œ๋‹ค๋Š” ๊ฒƒ์€, ์ด๋ฏธ ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์กด์žฌํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ Source Database ๊ธฐ์ค€์œผ๋กœ ๋งž์ถฐ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

Insert๋ฌธ์„ Update๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ Conflict ์„ ํ•ด์†Œํ•ด์ค€๋‹ค.

2. Update

Update์—์„œ์˜ ๋ฐ์ดํ„ฐ ์ถฉ๋Œ์€ ์›ํ•˜๋Š” Row๊ฐ€ ์—†๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

Update๋ฌธ์„ Insert๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ Conflict ์„ ํ•ด์†Œํ•ด์ค€๋‹ค.

3. Delete

Delete์—์„œ์˜ ๋ฐ์ดํ„ฐ ์ถฉ๋Œ ๋˜ํ•œ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Row๊ฐ€ ์—†๋‹ค๋Š” ์˜๋ฏธ๊ฐ€ ๋œ๋‹ค.

Delete์— ๋Œ€ํ•œ ์ถ”๊ฐ€์ ์ธ ์ฒ˜๋ฆฌ๊ฐ€ ์—†์ด ๋„˜์–ด๊ฐ€๋ฉด ๋œ๋‹ค.

Resolve By Target

1. Insert

Insert๋ฌธ์˜ ์ถฉ๋Œ์€ ์ด๋ฏธ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š”๋ฐ, Target Database ๊ธฐ์ค€์œผ๋กœ ๋งž์ถฐ์•ผ ํ•˜๋ฏ€๋กœ, ๋ณ„๋„์˜ ์ž‘์—… ์—†์ด ํ•ด๋‹น ์ฒ˜๋ฆฌ๋ฅผ ๊ฑด๋„ˆ๋›ด๋‹ค.

2. Update

Row๊ฐ€ ์—†๋Š” ์ƒํ™ฉ์ด ๋งž๋‹ค๊ณ  ํŒ๋‹จํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„์˜ ์ž‘์—… ์—†์ด ํ•ด๋‹น ์ฒ˜๋ฆฌ๋ฅผ ๊ฑด๋„ˆ๋›ด๋‹ค.

Row๊ฐ€ ์—†๋Š” ์ƒํ™ฉ์ด ๋งž๋‹ค๊ณ  ํŒ๋‹จํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„์˜ ์ž‘์—… ์—†์ด ํ•ด๋‹น ์ฒ˜๋ฆฌ๋ฅผ ๊ฑด๋„ˆ๋›ด๋‹ค.

์œ„ ๋‘ ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์กฐํ•ฉ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ƒํ™ฉ์— ๋”ฐ๋ผ Source ๊ธฐ์ค€ ๋˜๋Š” Target ๊ธฐ์ค€์— ๋งž์ถฐ ์ˆ˜ํ–‰ํ•˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๋‹ค. ๊ธฐ์ค€์ด ๋˜๋Š” ๊ฒƒ์ด Database ๋‹จ์œ„๊ฐ€ ์•„๋‹Œ Column ๋‚ด ๋ฐ์ดํ„ฐ์˜ ๋Œ€์†Œ ๋น„๊ต๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค๋Š” ์ ์ด ๋‹ค๋ฅด๊ณ , ์ด์— ๋”ฐ๋ผ ์ถฉ๋Œ ์ฒ˜๋ฆฌ ๋™์ž‘์€ ์œ„์˜ Source / Target๊ณผ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•œ๋‹ค.

Batch Execution

Batch Execution์€ RDBMS ์ƒ์—์„œ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” Batch ๊ด€๋ จ API๋ผ๊ณ  ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์šฉ์ดํ•˜๋‹ค. DML ๊ฐ๊ฐ์„ ๋ชจ๋‘ ์ฟผ๋ฆฌ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ „๋‹ฌํ•˜๊ธฐ๋ณด๋‹จ, ๊ฐ™์€ ํ˜•ํƒœ์˜ ์ฟผ๋ฆฌ๋ผ๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ Batch๋‹จ์œ„๋กœ ๋ชจ์•„์„œ ์„œ๋ฒ„์—์„œ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด Insert ์™€ ๊ฐ™์€ DML์ด ์—ฐ์†ํ•ด์„œ ๋“ค์–ด์˜ฌ ๋•Œ, Target Database ์˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์†๋„๋ฅผ ์ฆ๊ฐ€ ์‹œํ‚ค๊ณ  ๋™๊ธฐํ™” ์†๋„๋ฅผ ๋Œ์–ด ์˜ฌ๋ ค์ค„ ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ œ์•ฝ์‚ฌํ•ญ๋„ ์กด์žฌํ•˜๋Š” ๊ธฐ๋Šฅ์œผ๋กœ, ์•„๋ž˜์™€ ๊ฐ™์€ ๋‘๊ฐ€์ง€ ๊ด€์ ์—์„œ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๊ฐ™์€ ํ˜•ํƒœ์˜ ์ฟผ๋ฆฌ

  • Batch๋กœ ๋ชจ์•˜์„ ๋•Œ์˜ ํ•œ๊ณ„

ProSync๋Š” ํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ DML์ด ์—ฐ์†ํ•ด์„œ ๋“ค์–ด์˜ฌ ๋•Œ ์ด ์ˆœ์„œ๋ฅผ ์ž„์˜๋Œ€๋กœ ๋ฐ”๊พธ์ง€ ์•Š๋Š”๋‹ค. ์ž…๋ ฅ๋˜๋Š” ๋ชจ๋“  ์ฟผ๋ฆฌ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์ ์šฉํ•ด์•ผ ์ •ํ•ฉ์„ฑ์ด ๊นจ์ง€์ง€ ์•Š๋Š”๋‹ค๋Š” ๋Œ€์ „์ œ ๋•Œ๋ฌธ์— ์ด์™€ ๊ฐ™์ด ์ฒ˜๋ฆฌ๊ฐ€ ๋œ๋‹ค.

Flow Control

ProSync์˜ Flow Control์„ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ๋“ค์„ ์ •๋ฆฌํ•œ ๋ฌธ์„œ์ด๋‹ค. ๋ฐ์ดํ„ฐ๊ฐ€ ๋™๊ธฐํ™”๋˜๋Š” ์ผ๋ จ์˜ ๊ณผ์ •์ด ์•ˆ์ •์ ์œผ๋กœ ์šด์˜๋˜๊ธฐ ์œ„ํ•ด์„  ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์†๋„๊ฐ€ ๊ด€๊ฑด์ด๋‹ค.

์ฒ˜๋ฆฌ๊ฐ€ ๋„ˆ๋ฌด ๋А๋ฆฌ๋‹ค๋ฉด ๋™๊ธฐํ™” ๋กœ์ง ์ƒ ๋ฐ์ดํ„ฐ๋Š” ๊ณ„์†ํ•ด์„œ ์Œ“์ด๊ฒŒ ๋œ๋‹ค. ์Œ“์ธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ„์†ํ•ด์„œ ๋ฉ”๋ชจ๋ฆฌ์— ์ ์žฌํ•˜๋ฉด ๋‹น์—ฐํžˆ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž„๊ณ„๊ฐ’์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์ผ๋กœ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์ผ์‹œ์ ์œผ๋กœ ์ง€์—ฐ์‹œํ‚ค๋Š” ๋™์ž‘์ด ์ˆ˜ํ–‰๋œ๋‹ค.

๋˜ํ•œ ์ฒ˜๋ฆฌ ์†๋„๋ฅผ ์˜ฌ๋ฆฌ๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ๋“ค๋„ ์กด์žฌํ•œ๋‹ค. ์ฒ˜๋ฆฌ ์†๋„๊ฐ€ ๋น ๋ฅด๋ฉด ๊ทธ๋งŒํผ ์ถ”์ถœํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์‹ค์‹œ๊ฐ„์„ฑ์ด ๋†’๊ฒŒ ๋ฐ˜์˜์ด ๋œ๋‹ค๋Š” ์˜๋ฏธ์ด๋ฏ€๋กœ, ์ด ๋ถ€๋ถ„์„ ๊ณ ๋ คํ•˜์—ฌ ํ™˜๊ฒฝ ์„ค์ •์„ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ์ •ํ•ฉ์„ฑ์„ ์œ„ํ•ด ๊ธฐ๋ณธ์ ์œผ๋กœ ๋™๊ธฐํ™”๊ฐ€ ๋ฉˆ์ถ”๊ฒŒ ๋˜์–ด์žˆ๋Š”๋ฐ, ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ๋”์ด์ƒ ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์—†์–ด์„œ ์˜๊ตฌ์ ์ธ ์ง€์—ฐ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ์ด๋ฅผ ์ž๋™์œผ๋กœ ์ƒ๋žตํ•˜๊ฑฐ๋‚˜ Rule์— ๋งž์ถฐ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ๋„ ์•Œ์•„๋ณธ๋‹ค.

3. Delete

Resolve By Min/Max

์ฃผ์˜

Data Conflict Rule(DCR) ๊ด€๋ จ

Data Conflict Rule(DCR) ์˜ต์…˜์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ USE_PK_FOR_WHERE ์˜ต์…˜์€ ๋ฌด์‹œ๋œ๋‹ค. ๋™๊ธฐํ™”์˜ ๋…ผ๋ฆฌ ๊ตฌ์กฐ์ƒ Conflict๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด ์šฐ์„ ์ด๊ธฐ ๋•Œ๋ฌธ์— ProSync์—์„  ๋‘ ์˜ต์…˜ ๊ฐ„์— ์ด์™€ ๊ฐ™์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋‘”๋‹ค.

History

ProSync์—๋Š” DML ์ด๋ ฅ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ๋“ค์ด ์žˆ๋‹ค. configํŒŒ์ผ์—์„œ ๋กœ๊ทธ ๋ ˆ๋ฒจ์„ 5๋ ˆ๋ฒจ๋กœ ๋†’์ด๋ฉด, ๋ฐ˜์˜ํ•˜๊ณ  ์žˆ๋Š” SQL๊ณผ Bindํ•  Value๋“ค์ด byte array ํ˜•ํƒœ๋กœ ๋‚จ๊ฒŒ ๋œ๋‹ค. ๋‹ค๋งŒ ๋กœ๊ทธ ๋ ˆ๋ฒจ์„ ๋ฐ˜๋“œ์‹œ ๋†’์—ฌ์•ผ ํ•œ๋‹ค๋Š” ์ ๊ณผ, bind value๋“ค์ด ๋ณ„๋„๋กœ ๋‚จ์œผ๋ฏ€๋กœ ์‹ค์ œ SQL๋กœ ๋ฐ”๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

๋ณธ ์žฅ์—์„œ๋Š” ์œ„์™€ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” SAM(Sequential Access Method) ํŒŒ์ผ ๊ธฐ๋Šฅ๊ณผ DML ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ์˜ report ํŒŒ์ผ, DML ์ด๋ ฅ ํ™•์ธ ๊ธฐ๋Šฅ ๋“ฑ์— ๋Œ€ํ•˜์—ฌ ๊ธฐ์ˆ ํ•œ๋‹ค.

๋ฌธ์ œ๋Š” ์ด๋ ‡๊ฒŒ ๋˜๋ฉด Insert * 3, Update*3, Delete* 3์˜ ์ˆœ์„œ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์˜ฌ ๋•Œ์™€ (Insert, Update, Delete) * 3์˜ ์ˆœ์„œ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์˜ฌ ๋•Œ Batch Execution ์ž…์žฅ์—์„œ ํฐ ์ฐจ์ด๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

์œ ์‚ฌํ•œ ์ฟผ๋ฆฌ๊ฐ€ ์—ฐ์†ํ•ด์„œ ๋“ค์–ด์˜จ๋‹ค๋ฉด ProSync๋Š” ์ด๋ฅผ Batch๋กœ ๋ฌถ์–ด์„œ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜๊ฐ€ ์žˆ์ง€๋งŒ, ์ฟผ๋ฆฌ๋“ค์˜ ํ˜•ํƒœ๊ฐ€ ์—ฐ์†์ ์ด์ง€ ์•Š๊ฒŒ ๋“ค์–ด์˜จ๋‹ค๋ฉด Batch๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜๊ฐ€ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ๋‘ ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋™์ผํ•˜๋”๋ผ๋„ ํ•˜๋‚˜๋Š” Batch ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” Batch ์ฒ˜๋ฆฌ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

ํŠธ๋žœ์žญ์…˜ ๋‚ด์— ๊ฐ™์€ ํ˜•ํƒœ์˜ ์ฟผ๋ฆฌ๋“ค์ด ์—ฐ์†ํ•ด์„œ ๋“ค์–ด์˜จ๋‹ค๊ณ  ๊ฐ€์ •์„ ํ•˜์—ฌ๋„ ์„ฑ๋Šฅ ํ–ฅ์ƒ์ด ๋ฏธ๋น„ํ•œ ๊ฒฝ์šฐ๋„ ์กด์žฌํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Insert์˜ ๊ฒฝ์šฐ Batch ๋™์ž‘์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๋‚˜ ํฌ๊ธฐ ๋“ฑ์„ Target Database์— ๋ฏธ๋ฆฌ ์•Œ๋ ค์ค€๋‹ค๋ฉด Database๋Š” ์ด์— ๋งž๋Š” ํ”Œ๋žœ์„ ์„ธ์›Œ์„œ ์ตœ์ ํ™” ํ•˜์—ฌ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•˜์ง€๋งŒ Delete๋‚˜ Update ์ฒ˜๋Ÿผ ๊ฐ row ๋ณ„๋กœ Where Clause์— ์˜ํ•ด ๋”ฐ๋กœ ํƒ์ƒ‰์„ ํ•ด์•ผ ํ•˜๋Š” ํ˜•ํƒœ๋กœ ๋“ค์–ด์˜จ๋‹ค๋ฉด ์•„๋ฌด๋ฆฌ ๋ชจ์•„ ๋ณด๋‚ด๋„ ์„œ๋ฒ„ ์ž…์žฅ์—์„  ํ•˜๋‚˜์”ฉ ์ฒ˜๋ฆฌํ•˜๋‚˜, ๋ชจ์•„์„œ ๋“ค์–ด์˜จ๊ฑธ ํ•˜๋‚˜์”ฉ ์ฒ˜๋ฆฌํ•˜๋‚˜ ํฐ ์ฐจ์ด๊ฐ€ ์—†๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ProSync๋Š” ํŠน๋ณ„ํ•œ ์„ค์ •์ด ์—†๋‹ค๋ฉด Insert์— ๋Œ€ํ•œ Batch๋งŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๊ธฐ๋ณธ ๋™์ž‘์ด๋‹ค. ํ•˜์ง€๋งŒ Database ๋ณ„๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Batch ์‚ฌ์šฉ ์—ฌ๋ถ€๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ชจ๋‘ ๊ด€๋ฆฌ๊ฐ€ ๋œ๋‹ค.

Parameter ๋ณ„ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

  • USE_BATCH_MODE ๊ธฐ๋ณธ ๊ฐ’์€ Y ๋กœ, Batch๋Š” ํ•ญ์ƒ ๋™์ž‘ํ•˜๋„๋ก ๋˜์–ด์žˆ๋‹ค.

  • BATCH_MEM_SIZE ๊ธฐ๋ณธ ๊ฐ’์€ 10MB๋กœ ์„œ๋ฒ„์— ๋ณด๋‚ผ ๋•Œ ์ตœ๋Œ€ 10MB์˜ ๋ฐ์ดํ„ฐ๊นŒ์ง€๋งŒ ์Œ“๊ณ  ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ์š”์ฒญํ•œ๋‹ค.

  • USE_ONLY_INSERT_BATCH Insert ๋งŒ Batch ๋กœ ์ฒ˜๋ฆฌํ•  ๊ฒƒ ์ธ์ง€์— ๋Œ€ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๊ธฐ๋ณธ ๊ฐ’์€ Y ์ด๋‹ค.

๊ฐ™์€ ํ˜•ํƒœ์˜ ์ฟผ๋ฆฌ

Batch๋กœ ๋ชจ์•˜์„ ๋•Œ์˜ ํ•œ๊ณ„

Parameter ๊ด€๋ จ

Parallel Execution (Parallel Replay)

์ปค๋ฐ‹์ด ์š”์ฒญ ํŠธ๋žœ์žญ์…˜์€ ๋ฐ˜์˜์„ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ๋ฐ˜์˜์„ ํ•˜๊ณ , ๋ฐ˜์˜์„ ํ•  ์ˆ˜ ์—†์œผ๋ฉด ํ์—์„œ ๋Œ€๊ธฐํ•˜๊ฒŒ ๋œ๋‹ค. ๋ฐ˜์˜ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋Š” ๋ฐ˜์˜ํ•˜๊ณ ์ž ํ•˜๋Š” ํŠธ๋žœ์žญ์…˜๊ณผ ๋ฐ˜์˜ ์ค‘์ธ ํŠธ๋žœ์žญ์…˜ ๊ฐ„์˜ ์˜์กด์„ฑ ์ฒดํฌ๋ฅผ ํ†ตํ•ด ์„œ๋กœ ๋…๋ฆฝ์ ์ผ ๊ฒฝ์šฐ ๋ฐ˜์˜์ด ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•œ๋‹ค.

์˜์กด์„ฑ ์ฒดํฌ๋Š” Table๊ณผ Row ๋‹จ์œ„ ๋ชจ๋‘ ํ™•์ธ์„ ํ•œ๋‹ค. ํŠธ๋žœ์žญ์…˜์€ ๋ ˆ์ฝ”๋“œ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ณ , ๋ ˆ์ฝ”๋“œ์—๋Š” ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ ‘๊ทผํ•˜๋Š” Row๊ฐ€ ์ •ํ•ด์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜๊ณผ ์˜์กด ๊ด€๊ณ„์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•œ๋‹ค.

์˜์กด์„ฑ ํ™•์ธ ๋™์ž‘์€ RedBlack Tree(RBT)์™€ Linked List๋กœ ๊ด€๋ฆฌ๊ฐ€ ๋˜๊ณ  ์žˆ๋‹ค. Table ๋‹จ์œ„๋กœ RBT๋ฅผ ํ™•์ธํ•˜๊ณ , Table์ด ํ™•์ธ๋˜๋ฉด, ํ•ด๋‹น Table ๋…ธ๋“œ ๋‚ด์˜ RBT์—์„œ Row๋ฅผ ํ™•์ธํ•œ๋‹ค. ์ด ์œ„์น˜์—” Linked List๊ฐ€ ์กด์žฌํ•˜๋ฉฐ, ํŠธ๋žœ์žญ์…˜์€ ํ•ด๋‹น List์— ์˜์กด์„ฑ ๊ฐ์ฒด(TX Dependency )๋ฅผ ๋‹ฌ์•„ ๋†“๋Š”๋‹ค.

์ด ๋™์ž‘์„ ํ†ตํ•ด ํŠธ๋žœ์žญ์…˜์ด ์ ‘๊ทผํ•˜๋Š” ๋ชจ๋“  Row์— ๋Œ€ํ•œ Linked List์— TX Dependency๊ฐ€ ๋“ฑ๋ก์ด ๋œ๋‹ค. ๋ฐ˜์˜ ์ค‘์ธ ํŠธ๋žœ์žญ์…˜์ด๋‚˜ ๋ฐ˜์˜ ๋Œ€๊ธฐ ์ค‘์ธ ํŠธ๋žœ์žญ์…˜ ๋ชจ๋‘ ์ด ๊ตฌ์กฐ ์•ˆ์—์„œ ๊ด€๋ฆฌ๋œ๋‹ค.

๋ฐ˜์˜ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋Š” ํŠธ๋žœ์žญ์…˜์˜ ๋ชจ๋“  TX Dependency๊ฐ€ Linked List์˜ front์— ์กด์žฌํ•˜๋Š” ์ง€์˜ ์—ฌ๋ถ€๋กœ ํ™•์ธํ•œ๋‹ค. ํ•˜๋‚˜๋ผ๋„ front์— ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋ฐ˜์˜์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ณ , ์•ž์„œ ๋ฐ˜์˜ ์ค‘์ธ ํŠธ๋žœ์žญ์…˜์˜ ์™„๋ฃŒ๋ฅผ ๋Œ€๊ธฐํ•˜๊ฒŒ ๋œ๋‹ค.

๊ทธ๋ฆผ 1. ๋ฐ˜์˜์ด ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ

๋ฐ˜์˜์ด ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ๋Š” ์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๋ชจ๋“  ์˜์กด์„ฑ ์ฒดํฌ๋ฅผ ํ–ˆ์„ ๋•Œ Linked List ์ƒ์— TX Dependency ๊ฐ€ ๊ฐ€์žฅ ์•ž์„  ๊ฒฝ์šฐ์ด๋‹ค.

๊ทธ๋ฆผ 2. ๋ฐ˜์˜์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ

๋งŒ์•ฝ ์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด xid: 111์ธ ํŠธ๋žœ์žญ์…˜์ด ์•„์ง ๋ฐ˜์˜์ด ๋๋‚˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๋Œ€๊ธฐํ•˜๊ฒŒ ๋œ๋‹ค. ๋ฐ˜์˜์ด ์™„๋ฃŒ๋œ ํŠธ๋žœ์žญ์…˜์€ ์œ„ Linked list์—์„œ ์ œ๊ฑฐ๊ฐ€ ๋˜๊ณ , xid: 112๊ฐ€ ๋ฐ˜์˜ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋˜๋ฉด ๋ฐ˜์˜ ์ž‘์—…์„ ์ง„ํ–‰ํ•œ๋‹ค.

๊ด€๋ จ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” REPLAY_THREAD_CNT ๋กœ, ํ•ด๋‹น ๊ฐ’์ด ์˜ฌ๋ผ๊ฐ€๋ฉด ๋ณ‘๋ ฌ ์„ธ์…˜์˜ ์ˆ˜๊ฐ€ ๋งŽ์•„์ง„๋‹ค. ํ•˜์ง€๋งŒ ์œ„ ๋กœ์ง์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ๊ฒฐ๊ตญ RBT ๋‚ด์—์„œ Table, Row๋‹จ์œ„๋กœ TX Dependency๊ฐ€ ์ž˜ ํ’€๋ ค์•ผ ๋ณ‘๋ ฌ ๋ฐ˜์˜์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด๋กœ ์ธํ•ด ์ˆซ์ž๋ฅผ ์˜ฌ๋ฆฐ๋‹ค๊ณ  ๋ฐ˜๋“œ์‹œ ์˜ฌ๋ฆฐ ์ˆซ์ž๋งŒํผ ์ •๋น„๋ก€ํ•˜๊ฒŒ ์ฆ๊ฐ€ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๋„ ๋ฐœ์ƒํ•œ๋‹ค.

DML History

APPLY ํ”„๋กœ์„ธ์Šค์—์„œ DML ๋ฐ˜์˜ ์‹œ MAP ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ง€์ •ํ•œ History ํ…Œ์ด๋ธ”์— ๋ฐ˜์˜๋œ history ๋ฅผ ๋‚จ๊ธฐ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ธฐ์กด ProSync ๋™๊ธฐํ™”๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ์ธ์Šคํ„ด์Šค ์ด์™ธ์— DML History ๊ธฐ๋Šฅ ์ž‘๋™์„ ์œ„ํ•œ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ถ”๊ฐ€๋กœ ํ•˜๋‚˜ ๋” ํ•„์š”ํ•˜๋‹ค.

์ฐธ๊ณ 

๋‹ค์Œ์˜ ํƒ€์ž…๋“ค์— ๋Œ€ํ•ด์„  ์ด ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค.

์•„๋ž˜์˜ ํƒ€์ž…์ด ์žˆ๋Š” ํ…Œ์ด๋ธ”์˜ ๊ฒฝ์šฐ์—๋Š” ์ปฌ๋Ÿผ์˜ ๊ฐ’์ด NULL๋กœ ๊ธฐ๋ก๋œ๋‹ค.

  • LONG

APPLY ํ”„๋กœ์„ธ์Šค์˜ config ํŒŒ์ผ์ธ [inst_id]_apply1.cfg ํŒŒ์ผ์— ๋‹ค์Œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.

Parameter
์„ค๋ช…

RECORD_HISTORY

์ถ”๊ฐ€์ ์œผ๋กœ ๋™๊ธฐํ™” ๋Œ€์ƒ ํ…Œ์ด๋ธ”์— ์ถ”๊ฐ€์ ์ธ column๋“ค์ด ํ•„์š”ํ•˜๋‹ค.

column
์„ค๋ช…

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์ด ๋‚จ์ง€ ์•Š๋Š”๋‹ค.

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๋งŒ ์‚ฌ์šฉํ• ์ง€์— ๋Œ€ํ•œ ์—ฌ๋ถ€๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค.

Parameter ๊ด€๋ จ

USE_PK_FOR_WHERE ์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Primary key๊ฐ€ ์žˆ๋Š” ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ Update๋‚˜ Delete ์‹œ์— Where Clause์—๋Š” Primary key๋งŒ ์ž…๋ ฅํ•˜๊ฒŒ๋œ๋‹ค.

์ฃผ์˜

Data Conflict Rule(DCR) ๊ด€๋ จ

์˜ต์…˜์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ USE_PK_FOR_WHERE ์˜ต์…˜์€ ๋ฌด์‹œ๋œ๋‹ค. ๋™๊ธฐํ™”์˜ ๋…ผ๋ฆฌ ๊ตฌ์กฐ์ƒ Conflict๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด ์šฐ์„ ์ด๊ธฐ ๋•Œ๋ฌธ์— ProSync์—์„  ๋‘ ์˜ต์…˜ ๊ฐ„์— ์ด์™€ ๊ฐ™์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋‘”๋‹ค.

MAP Rule

ํ…Œ์ด๋ธ”, ์ปฌ๋Ÿผ ๋งคํ•‘ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ

ํ…Œ์ด๋ธ”, ์ปฌ๋Ÿผ ๋งคํ•‘ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” $PRS_HOME/config ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ Apply config file์ธ '[INST_ID]_apply1.cfg'๋ฅผ ์„ค์ •ํ•œ๋‹ค.

๋‹ค์Œ์€ ์„ค์ •ํ•ด์•ผ ํ•  ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋Œ€ํ•œ ์„ค๋ช…์ด๋‹ค.

๊ธฐ๋ณธ MAP ํŒŒ๋ผ๋ฏธํ„ฐ์— Source DB์˜ ํŠน์ • ํ…Œ์ด๋ธ”์„ Target DB์˜ ํŠน์ • ํ…Œ์ด๋ธ”๋กœ ๋™๊ธฐํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๊ทœ์น™์„ ์„ค์ •ํ•œ๋‹ค.

์ธ์ž
์„ค๋ช…

APPLY_DML_ERR_REPORT_CNT

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)

์ฐธ๊ณ 

๋‹ค์Œ์˜ ํƒ€์ž…๋“ค์— ๋Œ€ํ•ด์„  ์ด ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค.

์•„๋ž˜์˜ ํƒ€์ž…์ด ์žˆ๋Š” ํ…Œ์ด๋ธ”์˜ ๊ฒฝ์šฐ์—๋Š” ์ปฌ๋Ÿผ์˜ ๊ฐ’์ด NULL๋กœ ๊ธฐ๋ก๋œ๋‹ค.

  • NCHAR

  • NVARCHAR

  • LONG

  • BLOB

  • CLOB

Data Conflict Rule (DCR)

IUD_TIME

TIMESTAMP ์ด๋ฉฐ, DML ์ด ์ˆ˜ํ–‰ ๋˜์–ด history ๊ฐ€ ๋‚จ์€ ์‹œ๊ฐ„์„ ๋œปํ•œ๋‹ค.

BLOB
  • CLOB

  • ํ•ด๋‹น ์ธ์Šคํ„ด์Šค์—์„œ 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๊ฐ€ ๋‚จ๋Š”๋‹ค.

    SYNC OPTION

    TABLE : ๋™๊ธฐํ™” ํ•  ํ…Œ์ด๋ธ”์„ ์ง€์ •ํ•˜๋Š” ๊ฒฝ์šฐ ์„ค์ •ํ•œ๋‹ค. OBJECT : ๋™๊ธฐํ™” ๋Œ€์ƒ์ด ์•„๋‹Œ ์˜ค๋ธŒ์ ํŠธ์˜ DDL ๋งคํ•‘์„ ์ง€์ •ํ•˜๋Š” ๊ฒฝ์šฐ ์„ค์ •ํ•œ๋‹ค. EXCLUDE : ๋™๊ธฐํ™”๋ฅผ ์ œ์™ธํ•  ํ…Œ์ด๋ธ”์„ ์ง€์ •ํ•˜๋Š” ๊ฒฝ์šฐ ์„ค์ •ํ•œ๋‹ค.

    SOURCE_USER

    ๋™๊ธฐํ™” ํ•  Source DB ํ…Œ์ด๋ธ”์˜ ์‚ฌ์šฉ์ž ์ด๋ฆ„์„ ์„ค์ •ํ•œ๋‹ค.

    SOURCE_TABLE

    ๋™๊ธฐํ™” ํ•  Source DB ํ…Œ์ด๋ธ”์˜ ํ…Œ์ด๋ธ” ์ด๋ฆ„์„ ์„ค์ •ํ•œ๋‹ค.

    SOURCE_COLUMNS

    ๋™๊ธฐํ™” ํ•  Source DB ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ๋“ค์„ ์„ค์ •ํ•œ๋‹ค. (Column1, Column2, Column3)๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

    COLUMN FILTERING OPTION

    ๋‹ค์Œ์€ MAP ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ด์šฉํ•ด์„œ ๋™๊ธฐํ™” ๋Œ€์ƒ ๋ฐ˜์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์˜ˆ์ œ์ด๋‹ค.

    ๋‹ค์Œ์€ Source DB์˜ PROSYNC1 ์‚ฌ์šฉ์ž์˜ T1 ํ…Œ์ด๋ธ”์„ Target DB์˜ PROSYNC2 ์‚ฌ์šฉ์ž์˜ T2 ํ…Œ์ด๋ธ”๋กœ ๋™๊ธฐํ™”ํ•˜๋Š” ์˜ˆ์ œ์ด๋‹ค.

    ๋‹ค์Œ์€ Source DB์˜ PROSYNC1 ์‚ฌ์šฉ์ž์˜ T1 ํ…Œ์ด๋ธ”์— ์ปฌ๋Ÿผ C1, C2, C3๊ฐ€ ์žˆ๊ณ , ์ด์ค‘ C1์™€ C2 ์ปฌ๋Ÿผ๋งŒ Target DB์˜ PROSYNC2 ์‚ฌ์šฉ์ž์˜ T2 ํ…Œ์ด๋ธ”์˜ C1, C2 ์ปฌ๋Ÿผ๊ณผ ๋™๊ธฐํ™”ํ•˜๋Š” ์˜ˆ์ œ์ด๋‹ค.

    ๋‹ค์Œ์€ Source DB์˜ PROSYNC1 ์‚ฌ์šฉ์ž์˜ T1 ํ…Œ์ด๋ธ”์— ์ปฌ๋Ÿผ C1, C2, C3๊ฐ€ ์žˆ๊ณ , ์ด์ค‘ C1์™€ C2 ์ปฌ๋Ÿผ๋งŒ Target DB์˜ PROSYNC2 ์‚ฌ์šฉ์ž์˜ T2 ํ…Œ์ด๋ธ”์˜ D1, D2 ์ปฌ๋Ÿผ๊ณผ ๋™๊ธฐํ™”ํ•˜๋Š” ์˜ˆ์ œ์ด๋‹ค.


    ๋™๊ธฐํ™” ํ…Œ์ด๋ธ” ์‚ฌ์šฉ์—ฌ๋ถ€๋ฅผ ์„ค์ •ํ•œ๋‹ค.

    ๋™๊ธฐํ™” ํ…Œ์ด๋ธ”์„ ์ง€์ •ํ•˜๋Š” ๊ฒฝ์šฐ SYNC OPTION์— TABLE์„ ์„ค์ •ํ•œ๋‹ค.

    ๋™๊ธฐํ™” ๋Œ€์ƒ์ด ์•„๋‹Œ ์˜ค๋ธŒ์ ํŠธ์˜ 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์„ ๋™๊ธฐํ™”ํ•œ๋‹ค.

    ๋™๊ธฐํ™”๋ฅผ ์ œ์™ธํ•  ํ…Œ์ด๋ธ”์„ ์ง€์ •ํ•˜๋Š” ๊ฒฝ์šฐ SYNC OPTION์— EXCLUDE๋ฅผ ์„ค์ •ํ•œ๋‹ค.

    Source DB์˜ PROSYNC ์‚ฌ์šฉ์ž์˜ SKIP ํ…Œ์ด๋ธ”์„ ์ œ์™ธํ•˜๊ณ  ๋™๊ธฐํ™” ํ•  ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด '[INST_ID]_apply1.cfg'์˜ MAP ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์„ค์ •ํ•œ๋‹ค.


    COLUMN FILTERING OPTION์„ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๋ถ€ ์ปฌ๋Ÿผ์— ๋Œ€ํ•œ ๋™๊ธฐํ™”๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋งŒ Constraint๊ฐ€ ๊ฑธ๋ ค์žˆ๋Š” ์ปฌ๋Ÿผ์— ๋Œ€ํ•ด์„œ๋Š” ํ•ด๋‹น ์˜ต์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

    ๋‹ค์Œ๊ณผ ๊ฐ™์ด COLUMN FILTERING OPTION์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

    Source DB์˜ PROSYNC1 ์‚ฌ์šฉ์ž์˜ T1 ํ…Œ์ด๋ธ”์— ์ปฌ๋Ÿผ C1, C2, C3๊ฐ€ ์žˆ๊ณ , ์ด์ค‘ C1 ์ปฌ๋Ÿผ๋งŒ ์ œ์™ธํ•˜๊ณ  Target DB์˜ PROSYNC2 ์‚ฌ์šฉ์ž์˜ T2 ํ…Œ์ด๋ธ”์˜ C2, C3 ์ปฌ๋Ÿผ๊ณผ ๋™๊ธฐํ™”ํ•  ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด '[INST_ID]_apply1.cfg'์˜ MAP ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์„ค์ •ํ•œ๋‹ค.


    ๋™๊ธฐํ™” ์‹œ ์ถฉ๋Œ ์ƒํ™ฉ์—์„œ Source DB์— ์ •ํ•ฉ์„ฑ ๊ธฐ์ค€์„ ๋งž์ถœ ์ง€, Target DB์— ์ •ํ•ฉ์„ฑ ๊ธฐ์ค€์„ ๋งž์ถœ ์ง€, ์•„๋‹ˆ๋ฉด ํŠน์ • ์ปฌ๋Ÿผ์˜ Min ํ˜น์€ Max ๊ฐ’ ๊ธฐ์ค€์œผ๋กœ ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ์„ ๋งž์ถœ ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์˜ต์…˜์ด๋‹ค. ํ•„์ˆ˜ ์˜ต์…˜์€ ์•„๋‹ˆ๋ฉฐ ์ฃผ๋กœ ์–‘๋ฐฉํ–ฅ ๋™๊ธฐํ™”์— ์‚ฌ์šฉ๋œ๋‹ค.

    ์ •ํ•ด์ง„ Rule์— ๋”ฐ๋ผ DML ๋“ค์ด ๋ณ€๊ฒฝ๋˜๊ฑฐ๋‚˜ ์ƒ๋žต ๋œ๋‹ค.

    ๋‹ค์Œ์€ RESOLVE OPTION์— ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” RESOLVE_RULE์˜ ์ข…๋ฅ˜์ด๋‹ค.

    RESOLVE_RULE
    ์„ค๋ช…

    SOURCE

    Source ํ…Œ์ด๋ธ”์˜ Row๋ฅผ ์šฐ์„ ์œผ๋กœ ํ•œ๋‹ค.

    TARGET

    Target ํ…Œ์ด๋ธ”์˜ Row๋ฅผ ์šฐ์„ ์œผ๋กœ ํ•œ๋‹ค.

    MAX(COLUMN_NAME)

    MAX์™€ MIN RESOLVE_RULE์˜ ๊ฒฝ์šฐ์—๋Š” ๋ฐ˜๋“œ์‹œ DEFAULT OPTION์„ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค. ์ปฌ๋Ÿผ ๊ฐ’์ด null์ธ ๊ฒฝ์šฐ์— ์„ค์ •ํ•œ DEFAULT ๊ฐ’์œผ๋กœ ๋น„๊ตํ•œ๋‹ค. ๋‹จ, ๋™๊ธฐํ™”๋Š” ์„ค์ •ํ•œ DEFAULT ๊ฐ’์ด ์•„๋‹ˆ๋ผ ์‹ค์ œ ์ปฌ๋Ÿผ ๊ฐ’์œผ๋กœ ์ˆ˜ํ–‰ํ•œ๋‹ค.

    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์œผ๋กœ ๋น„๊ตํ•  ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•œ๋‹ค.


    SKIP OPTION์—๋Š” ๋™๊ธฐํ™”ํ•˜์ง€ ์•Š๊ธธ ์›ํ•˜๋Š” row๋“ค์„ ํŠน์ •ํ•˜๊ธฐ ์œ„ํ•œ ์กฐ๊ฑด์„ ์„ค์ •ํ•œ๋‹ค.

    Database
    Supported Column Types

    TIBERO

    CHAR, VARCHAR, NUMBER, TIME, DATE, TIMESTAMP

    ORACLE

    CHAR, VARCHAR, NUMBER

    POSTGRESQL

    CHAR, VARCHAR

    EQUAL (=), NOT_EQUAL (!=)

    NUMBER, TIME, DATE, TIMESTAMP

    EQUAL (=), NOT_EQUAL (!=), INEQUALITY (<, <=, >, >=)

    SKIP OPTION์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•œ๋‹ค. SKIP_CONDITION์ด True์ธ Row๋“ค์€ ๋™๊ธฐํ™”ํ•˜์ง€ ์•Š๋Š”๋‹ค.

    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 ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์„ค์ •ํ•œ๋‹ค.

    MAP=([SYNC OPTION] SOURCE_USER.SOURCE_TABLE [SOURCE_COLUMNS]
         [COLUMN FILTERING OPTION],
         [TARGET_DATABASE.]TARGET_USER.TARGET_TABLE [TARGET_COLUMNS]
         [RESOLVE OPTION] [SKIP OPTION]))
    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"))

    ์ฃผ์˜

    ๋‹ค์Œ ํ‚ค์›Œ๋“œ๋Š” MAP Rule ์˜ ์˜ˆ์•ฝ์–ด์ด๋ฏ€๋กœ table ๋“ฑ ๋Œ€์ƒ์„ ๋ช…์‹œํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉ ๋ถˆ๊ฐ€ํ•˜๋‹ค.

    "ALL" "BY" "DEFAULT" "EXCEPT FOR" "EXCLUDE" "FILTER" "INCLUDE" "MAX" "MIN" "RESOLVE" "SOURCE" "SKIP" "SYNC" "TABLE" "TARGET" "TYPE" "OBJECT" "INSERT" "DELETE" "UPDATE"

    ๋™๊ธฐํ™” ๋Œ€์ƒ ๋ฐ˜์˜ ๊ธฐ๋Šฅ ์‚ฌ์šฉ

    ์„œ๋กœ ๋‹ค๋ฅธ ์˜ค๋„ˆ / ๋‹ค๋ฅธ ์ด๋ฆ„์„ ๊ฐ€์ง„ ํ…Œ์ด๋ธ” ๋™๊ธฐํ™”

    ํ…Œ์ด๋ธ”์˜ ํŠน์ • ์ปฌ๋Ÿผ๋“ค๋งŒ ๋™๊ธฐํ™”

    ํ…Œ์ด๋ธ”๊ฐ„ ์ปฌ๋Ÿผ ์ด๋ฆ„์„ ๋‹ค๋ฅด๊ฒŒ ๋™๊ธฐํ™”

    SYNC OPTION

    TABLE

    OBJECT

    ์ฃผ์˜

    DB ๋ฒ„์ „, ๋น„ํ‘œ์ค€ ์ฟผ๋ฆฌ ๋“ฑ์œผ๋กœ ์ธํ•ด DDL์˜ OBJECT์˜ ์ธ์‹์ด ๋ถˆ๊ฐ€๋Šฅํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ MAP ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ DDL ๋งคํ•‘์„ ํ•  ๋•Œ TABLE๊ณผ OBJECT์— schema๋ฅผ ๋ช…์‹œํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.

    ๋˜ํ•œ, ๋™๊ธฐํ™” ํ…Œ์ด๋ธ” T1์— ๋Œ€ํ•ด DROP TABLE T1 ์‹คํ–‰ ํ›„ CREATE TABLE T1๋ฅผ ์‹คํ–‰ํ•  ๋•Œ T1์€ OBJECT๋กœ์จ ๋งคํ•‘๋  ๊ฒƒ์ด๊ณ , ์ƒ์„ฑ๋  ์ปฌ๋Ÿผ์€ ๋™๊ธฐํ™” ํ…Œ์ด๋ธ” ์ปฌ๋Ÿผ MAP ํŒŒ๋ผ๋ฏธํ„ฐ์— ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.

    EXCLUDE

    ์˜ˆ์ œ

    COLUMN FILTERING OPTION

    ์˜ˆ์ œ

    RESOLVE OPTION (Data Conflict Rule, DCR)

    ์ฐธ๊ณ 

    ๋ณด๋‹ค ์ƒ์„ธํ•œ ์‚ฌํ•ญ์€ ์„ ์ฐธ๊ณ ํ•œ๋‹ค.

    RESOLVE_RULE

    ์˜ˆ์ œ

    ์ฐธ๊ณ 

    RESOLVE OPTION์ด ์ •์ƒ ์ž‘๋™ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์„ค์ •ํ•  Source์™€ Target ํ…Œ์ด๋ธ”์— primary key๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

    MIN, MAX ๋ฃฐ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋น„๊ต ๋Œ€์ƒ ์ปฌ๋Ÿผ์— NULL์ด ๋“ค์–ด๊ฐ€๋Š” ๊ฒฝ์šฐ์— ๋Œ€๋น„ ์‚ฌ์šฉ๋  DEFAULT OPTION์„ ๋ฐ˜๋“œ์‹œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

    SKIP OPTION

    ์ง€์› ์ปฌ๋Ÿผ ํƒ€์ž…

    ์ง€์› ๋น„๊ต ์กฐ๊ฑด

    ์˜ˆ์ œ

    ์ฐธ๊ณ 

    SKIP RULE๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ UPDATE์˜ ๊ฒฝ์šฐ์—์„œ๋Š” SET ์ ˆ์— ์žˆ๋Š” ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ skip์„ ํ•  ๊ฒƒ์ธ์ง€, ์•„๋‹ˆ๋ฉด WHERE ์ ˆ์˜ ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ skip์„ ํ•  ๊ฒƒ์ธ์ง€ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

    Apply Process Parameter ์ค‘์—์„œ MAP_SKIP_UPD_WHERE์˜ ๊ฐ’์ด N ์ผ ๋•Œ ๋จผ์ € SET ์ ˆ์— ๊ธฐ์ค€ ์ปฌ๋Ÿผ์ด ์žˆ๋Š”์ง€ ํ™•์ธ ํ›„ ์žˆ์œผ๋ฉด SET ์ ˆ์˜ ๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ, ์—†์œผ๋ฉด WHERE ์ ˆ์— ์žˆ๋Š” ๊ธฐ์ค€ ์ปฌ๋Ÿผ์˜ ๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ skipํ•œ๋‹ค. ํ•ด๋‹น ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ Y์ธ ๊ฒฝ์šฐ์—๋Š” ๋ฌด์กฐ๊ฑด WHERE์— ์žˆ๋Š” ๊ธฐ์ค€ ์ปฌ๋Ÿผ์˜ ๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ Skipํ•œ๋‹ค.

    SKIP OPTION์€ ๋‹จ๋ฐฉํ–ฅ ๋™๊ธฐํ™”์—์„œ๋งŒ ์ง€์›ํ•œ๋‹ค. ์–‘๋ฐฉํ–ฅ์˜ ๊ฒฝ์šฐ ์ •ํ•ฉ์„ฑ ๋ฌธ์ œ๋กœ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.

    ์ฐธ๊ณ 

    ์˜์กด์„ฑ ํŒ๋‹จ ๊ธฐ์ค€

    ๊ทธ๋ฆผ์„ ๋ณด๋ฉด ํ™•์ธ์ด ๊ฐ€๋Šฅํ•˜๋“ฏ์ด, Row ๋‹จ์œ„์˜ ๋น„๊ต๊ฐ€ ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค. ์˜ค๋ผํด๊ณผ ํ‹ฐ๋ฒ ๋กœ์™€ ๊ฐ™์€ RDBMS ์—๋Š” ROWID๋ผ๋Š” Row๋ณ„ ๊ณ ์œ  ์‹๋ณ„์ž๊ฐ€ ์กด์žฌํ•œ๋‹ค.

    ROWID๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์š”์†Œ๋Š” ๋ฐ์ดํ„ฐ ํŒŒ์ผ ๋ฒˆํ˜ธ, ๋ฐ์ดํ„ฐ ํŒŒ์ผ ๋‚ด ๋ธ”๋ฝ ๋ฒˆํ˜ธ, ๋ธ”๋ฝ ๋‚ด Row๋ฐ์ดํ„ฐ ์œ„์น˜๋กœ ๊ตฌ์„ฑ์ด ๋˜๊ณ  ์ด ๋ฐ์ดํ„ฐ๋Š” Row์˜ ๊ณ ์œ  ID๊ฐ€ ๋œ๋‹ค. ProSync๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด ๋ฐ์ดํ„ฐ๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ์„ ํ™•์ธํ•œ๋‹ค.

    ๋˜ํ•œ Primary key, Foreign key ๊ด€๊ณ„์— ์žˆ๋Š” ๋‘ Row๋ฐ์ดํ„ฐ์˜ ๊ฒฝ์šฐ ์‹œ๊ฐ„ ์ˆœ์„œ๋ฅผ ๋ฐ˜๋“œ์‹œ ๋งž์ถฐ์ฃผ์–ด์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๊ฒฝ์šฐ๋„ ์œ„ Row์— ๋Œ€ํ•œ RedBlack Tree์™€๋Š” ๋ณ„๊ฐœ์˜ Tree๋กœ์จ ๊ด€๋ฆฌ๊ฐ€ ๋œ๋‹ค.

    Memory Control

    ProSync์˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„๋„๋ฅผ ์ƒ์„ธํžˆ ์ดํ•ดํ•˜๊ณ , ์ด๋ฅผ ํ†ตํ•ด Memory ์‚ฌ์šฉ๋Ÿ‰ ์กฐ์ ˆ๋ฐฉ์‹์„ ์•ˆ๋‚ดํ•œ๋‹ค.

    ๋ฐ์ดํ„ฐ๊ฐ€ ์ฒ˜์Œ ์ƒ์„ฑ๋˜๋Š” ์œ„์น˜๋Š” 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๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ฒจ์ค€๋‹ค.

    Wait Queue์— ์Œ“์ธ ๋ฐ์ดํ„ฐ๋Š” ํŠธ๋žœ์žญ์…˜๋“ค์ด ์ปค๋ฐ‹๋œ ์ˆœ์„œ์— ๋งž๊ฒŒ Target Database๋กœ ๋ฐ˜์˜์ด ๋œ๋‹ค. ์ด ๋•Œ ๋ฐ˜์˜ ์ค‘์ธ ํŠธ๋žœ์žญ์…˜๊ณผ ๋ฐ˜์˜ ๋Œ€๊ธฐ ์ค‘์ธ ํŠธ๋žœ์žญ์…˜์ด ์žˆ์„ ํ…๋ฐ, ์ด๋“ค๊ฐ„์˜ ์˜์กด์„ฑ ๊ฒ€์‚ฌ๋ฅผ ํ†ตํ•˜์—ฌ ์‹œ๊ฐ„ ์ˆœ์„œ์— ๋งž๊ณ , ์˜์กด์„ฑ์ด ์—†๋Š” ํŠธ๋žœ์žญ์…˜๋“ค์€ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌํ•˜์—ฌ ์„ฑ๋Šฅ์„ ๋†’์ธ๋‹ค.

    TX_HASH ์— ๋ฐ์ดํ„ฐ๊ฐ€ ๊ณ„์† ์Œ“์ธ๋‹ค๋ฉด Out of Memory ๋ฅผ ํ”ผํ•  ์ˆ˜๊ฐ€ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ํŠน์ • ์ž„๊ณ„์น˜๋ฅผ ๋„˜์–ด๊ฐˆ ๊ฒฝ์šฐ Part File์ด๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋œ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์—ฌ ์ด ์œ„์น˜๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฎ๊ฒจ์ค€๋‹ค.

    ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฎ๊ธฐ๋Š” ๊ธฐ์ค€์€ ํ˜„์žฌ TX_HASH

    ๋™๊ธฐํ™”ํ•˜์ง€ ์•Š์„ Source DB ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ๋“ค์„ ์„ค์ •ํ•œ๋‹ค.

    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์„ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.

    MIN(COLUMN_NAME)

    ํ•ด๋‹น ์ปฌ๋Ÿผ์˜ ๊ฐ’์ด ๋” ์ž‘์€ Row๋ฅผ ์šฐ์„ ์œผ๋กœ ํ•œ๋‹ค.

    ๋ฐ˜๋“œ์‹œ DEFAULT OPTION์„ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.

    CHAR, VARCHAR, NUMBER

    Flow Control
    ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋“ค ์ค‘ ๊ฐ€์žฅ ์šฉ๋Ÿ‰์ด ํฐ ํŠธ๋žœ์žญ์…˜ ๊ธฐ์ค€์œผ๋กœ ํŒŒ์ผ๋กœ ๋‚ด๋ ค๊ฐ€๊ฒŒ ๋˜๋ฉฐ, ๋‚ด๋ ค๊ฐ„ ํŒŒ์ผ์€ ์‹ค์ œ ๋ฐ˜์˜์ด ๋˜๋Š” ์‹œ์ ๊นŒ์ง„ ๊ณ„์† Disk์— ๋‚จ๊ฒŒ ๋œ๋‹ค

    ์ด์— ๋Œ€ํ•œ ๊ธฐ์ค€์ด ๋˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ TX_HASH_SIZE ํŒŒ๋ผ๋ฏธํ„ฐ์ด๋‹ค. TX_HASH_SIZE๋ผ๋Š” ์ž„๊ณ„์น˜๋ณด๋‹ค ๋” ๋งŽ์ด ๋ฐ์ดํ„ฐ๊ฐ€ ์Œ“์ด๊ฒŒ ๋  ๊ฒฝ์šฐ ์•„๋ž˜์™€ ๊ฐ™์€ ๋™์ž‘์ด ์ˆ˜ํ–‰๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

    ๊ทธ๋ฆผ 2. TX_HASH ํฌ๊ธฐ๊ฐ€ TX_HASH_SIZE ํŒŒ๋ผ๋ฏธํ„ฐ๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ

    Part File์€ ๋ฐ˜์˜์ด ์™„๋ฃŒ๋˜๋ฉด ์ œ๊ฑฐ๊ฐ€ ๋˜๋ฉฐ, ๋ฐ˜์˜์ด ๋˜๊ธฐ ์ „๊นŒ์ง„ Disk์— ๋‚จ๋Š”๋‹ค. ์‹ค์ œ ํŠธ๋žœ์žญ์…˜ ๋ฐ˜์˜ ์‹œ์ ์—๋„ Part File๋กœ ๋‚ด๋ ค๊ฐ„ DML ๋ฐ์ดํ„ฐ๋“ค์ด ์‹œ๊ฐ„ ์ƒ ๋” ์•ž์„œ๊ธฐ ๋•Œ๋ฌธ์—, ํŒŒ์ผ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋จผ์ € ๋ฐ˜์˜ํ•œ ํ›„ ๋ฉ”๋ชจ๋ฆฌ์— ๋‚จ์€ ํŠธ๋žœ์žญ์…˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜์˜ํ•œ๋‹ค.

    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

    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 ๋ณ„๋กœ ์—ฐ๊ฒฐ์ด ๋”ฐ๋กœ ์กด์žฌํ•˜๋ฏ€๋กœ ์ด์™€ ๊ฐ™์ด ๋ณ„๋„๋กœ ๊ด€๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค.

    ProSync Data Flow

    Case 1. TX_HASH ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์ง€๋‚˜์น˜๊ฒŒ ๋งŽ์ด ์Œ“์ด๋Š” ๊ฒฝ์šฐ

    ๊ทธ๋ฆผ 1. ProSync DataFlow

    Case 2. Wait Queue์— ๋ฐ์ดํ„ฐ๊ฐ€ ์ง€๋‚˜์น˜๊ฒŒ ๋งŽ์ด ์Œ“์ด๋Š” ๊ฒฝ์šฐ

    ์ฃผ์˜

    Wait Queue ๊ด€๋ จ

    Replay ์ชฝ์—์„  ๋งŽ์€ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋ฐ˜๋“œ์‹œ Wait Queue๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ฉฐ, ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ Queue๋‚˜ Tree ๋“ฑ์ด ์‚ฌ์šฉ๋˜๋Š”๋ฐ, ์—ฌ๊ธฐ์„  ์„ค๋ช…์„ ์œ„ํ•ด ๋ชจ๋‘ Wait Queue๋กœ ์ถ”์ƒํ™”ํ•˜์—ฌ ์„ค๋ช…ํ•œ๋‹ค.

    Source DB๊ฐ€ Cluster์ธ ๊ฒฝ์šฐ์˜ ๊ณ ๋ ค์‚ฌํ•ญ

    Discard

    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
    ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„
    ์„ค๋ช…

    DISCARD_YN


    DDL๋„ DML๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Target DB์— ๋ฐ˜์˜ ์ค‘ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ์—๋Š” ProSync๊ฐ€ ํ•ด๋‹น DDL์— ๋Œ€ํ•œ ๋ฐ˜์˜์„ ์„ฑ๊ณตํ•  ๋•Œ ๊นŒ์ง€ ์žฌ์‹œ๋„ํ•˜๊ฒŒ ๋œ๋‹ค.

    ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ์žฌ์‹œ๋„ํ•˜๋Š” ๋Œ€์‹  ํ•ด๋‹น DDL์— ๋Œ€ํ•œ ๋ฐ˜์˜์„ ์ƒ๋žตํ•˜๊ณ  ์ดํ›„์˜ ๋™๊ธฐํ™”๋ฅผ ์ง„ํ–‰ํ•˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

    ๋˜ํ•œ DISCARD ๊ธฐ๋Šฅ์ด ๋ฐœ์ƒํ•œ ์ด๋ ฅ์„ ๊ธฐ๋กํ•˜๋Š” Discard file ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

    ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„  config ํŒŒ์ผ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ Parameter๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.

    ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„
    ์„ค๋ช…

    Key Features

    ๋ณธ ์žฅ์—์„œ๋Š” Apply ํ”„๋กœ์„ธ์Šค์˜ ์ฃผ์š” ๊ธฐ๋Šฅ๋“ค์„ ์„ค๋ช…ํ•œ๋‹ค. Apply ํ”„๋กœ์„ธ์Šค ์šด์˜์„ ์œ„ํ•œ ํ•ต์‹ฌ์ ์ธ ์š”์†Œ๋“ค๋กœ์„œ ์›ํ™œํ•œ ์šด์˜์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

    DDL_DISCARD_FILE_SIZE

    discard ํŒŒ์ผ์˜ ์ตœ๋Œ€ ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ.

    • ์œ ํ˜•: int32

    • ๋ฒ”์œ„: 1M - 1G

    • ๊ธฐ๋ณธ๊ฐ’: 100M

    DDL_DISCARD_BACKUP_DIR

    discard ํŒŒ์ผ์˜ ํฌ๊ธฐ๊ฐ€ ์„ค์ •ํ•œ ์ตœ๋Œ€ ํฌ๊ธฐ๋ฅผ ์ดˆ๊ณผํ•˜๊ฒŒ ๋˜๋ฉด ์ƒ์„ฑํ•˜๋Š” ๋ฐฑ์—…ํŒŒ์ผ์˜ ์œ„์น˜๋ฅผ ์ง€์ •ํ•˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ.

    • ์œ ํ˜•: ๋””๋ ‰ํ† ๋ฆฌ

    • ๋ฒ”์œ„: -

    • ๊ธฐ๋ณธ๊ฐ’: "/"

    DDL_DISCARD_BACKUP_SIZE

    backup ๋””๋ ‰ํ† ๋ฆฌ์˜ ์ตœ๋Œ€ ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ.

    • ์œ ํ˜•: uint64

    • ๋ฒ”์œ„: 0 - 128G

    • ๊ธฐ๋ณธ๊ฐ’: 0

    ๋™๊ธฐํ™” ์ค‘ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ์— ์Šคํ‚ตํ•  ์ง€์— ์—ฌ๋ถ€๋ฅผ ์„ค์ •ํ•œ๋‹ค. 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

    DISCARD_BACKUP_DIR

    discard ํŒŒ์ผ์˜ ํฌ๊ธฐ๊ฐ€ ์„ค์ •ํ•œ ์ตœ๋Œ€ ํฌ๊ธฐ๋ฅผ ์ดˆ๊ณผํ•˜๊ฒŒ ๋˜๋ฉด ์ƒ์„ฑํ•˜๋Š” ๋ฐฑ์—…ํŒŒ์ผ์˜ ์œ„์น˜๋ฅผ ์ง€์ •ํ•˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ.

    • ์œ ํ˜•: ๋””๋ ‰ํ† ๋ฆฌ

    • ๋ฒ”์œ„: -

    • ๊ธฐ๋ณธ๊ฐ’: DISCARD_FILE_DIR/backup

    DISCARD_BACKUP_SIZE

    backup ๋””๋ ‰ํ† ๋ฆฌ์˜ ์ตœ๋Œ€ ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ.

    • ์œ ํ˜•: uint64, dynamic

    • ๋ฒ”์œ„: 0 - 128G

    • ๊ธฐ๋ณธ๊ฐ’: 0(๋ฌด์ œํ•œ)

    DDL_DISCARD_YN

    ๋™๊ธฐํ™” ์ค‘ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ์— ์Šคํ‚ตํ•  ์ง€์— ์—ฌ๋ถ€๋ฅผ ์„ค์ •ํ•œ๋‹ค.

    • ์œ ํ˜•: Y/N

    • ๋ฒ”์œ„: Y/N

    • ๊ธฐ๋ณธ๊ฐ’: N

    DDL_DISCARD_FILE_YN

    DISCARD ๋™์ž‘์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ํ•ด๋‹น ๋‚ด์šฉ์„ discard ํŒŒ์ผ์— ๋‚จ๊ธฐ๋Š” ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™” ํ•˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ์ด๋‹ค.

    • ์œ ํ˜•: Y/N

    • ๋ฒ”์œ„: Y/N

    • ๊ธฐ๋ณธ๊ฐ’: N

    DDL_DISCARD_FILE_DIR

    ์ฃผ์˜

    • DISCARD ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•˜๋ฉด batch apply ๊ธฐ๋Šฅ์ด ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

    • DML์„ ๋ฐ˜์˜ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ์— ๋Œ€ํ•ด์„œ ๋งŒ DISCARD ๊ธฐ๋Šฅ์„ ์ง€์›ํ•œ๋‹ค.

    • (12032)Deadlock detected. ์—๋Ÿฌ๋Š” DISCARD ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.

    • SAM_BIND_VALUE=Y ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, discard log์— ์‹คํŒจํ•œ query์˜ value ๊ฐ’์ด ํ•จ๊ป˜ ์ €์žฅ๋œ๋‹ค.

    DDL DISCARD

    ์ฃผ์˜

    ๋‹จ, TABLE ๊ด€๋ จ DDL์€ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ์‹คํŒจํ•˜๋Š” ๊ฒฝ์šฐ ์ƒ๋žตํ•  ์ˆ˜ ์—†๋‹ค.

    discard file์˜ ์ €์žฅ ์œ„์น˜๋ฅผ ์ง€์ •ํ•˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ.

    • ์œ ํ˜•: ๋””๋ ‰ํ† ๋ฆฌ

    • ๋ฒ”์œ„: -

    • ๊ธฐ๋ณธ๊ฐ’: "/"

    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 ์ข…๋ฅ˜๋ฅผ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.

    ํ•ญ๋ชฉ
    ์„ค๋ช…

    ALL ๋˜๋Š” DEFAULT ์ค‘ ํ•˜๋‚˜๋ฅผ ๋ช…์‹œํ•˜๊ฑฐ๋‚˜, DB์˜ ์˜ค๋ธŒ์ ํŠธ ์ด๋ฆ„์„ ์ง์ ‘ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.

    • ALL: ๋ชจ๋“  ์Šคํ‚ค๋งˆ, ํ…Œ์ด๋ธ”์— ๋Œ€ํ•ด ์ ์šฉ๋œ๋‹ค.

    • DEFAULT: ๋ชจ๋“  ๋™๊ธฐํ™” ๋Œ€์ƒ ํ…Œ์ด๋ธ”์— ๋Œ€ํ•ด ์ ์šฉ๋œ๋‹ค.

    • ์˜ค๋ธŒ์ ํŠธ ์ด๋ฆ„์„ ์ง์ ‘ ๋ช…์‹œ: ๋Œ€์ƒ์— ๋Œ€ํ•ด ์ ์šฉ๋œ๋‹ค.

    TYPE

    TYPE์€ ํ•˜๋‚˜ ์ด์ƒ์˜ DDL OPERATION๊ณผ DDL OBJECT ์Œ์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ์ง€์ •๋˜์–ด ์žˆ์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, Wildcard๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.

    [DDL OPERATION]

    Rule์— ์ ์šฉํ•  DDL ์ข…๋ฅ˜๋ฅผ ๋ช…์‹œํ•œ๋‹ค.

    [DDL OBJECT]

    Rule์— ์ ์šฉํ•  DDL ์ข…๋ฅ˜์— ๋Œ€ํ•œ ๋Œ€์ƒ์„ ๋ช…์‹œํ•œ๋‹ค.

    ๋‹ค์Œ์€ Source DB์— ๋”ฐ๋ผ ์„ค์ • ๊ฐ€๋Šฅํ•œ [DDL OPERATION]๊ณผ [DDL OBJECT]์˜ ์กฐํ•ฉ์ด๋‹ค.

    DDL OPERATION
    DDL OBJECT

    CREATE

    ALTER

    DROP

    COMMENT ON

    TABLE

    INDEX

    TRIGGER

    SEQUENCE

    VIEW

    FUNCTION

    PACKAGE

    PACKAGE BODY

    PROCEDURE

    SYNONYM

    PUBLIC SYNONYM

    TRUNCATE

    TABLE

    DDL OPERATION
    DDL OBJECT

    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 ๋™๊ธฐํ™” ์ œ์•ฝ์‚ฌํ•ญ ์ฐธ์กฐ)

    ALTER

    TABLE

    INDEX

    TRIGGER

    SEQUENCE

    VIEW

    MVIEW

    FUNCTION

    PACKAGE

    PACKAGE BODY

    PROCEDURE SYNONYM

    PUBLIC SYNONYM TABLESPACE DIRECTORY MLOG

    ROLE (โš  Password ํฌํ•จ DDL ๋™๊ธฐํ™” ์ œ์•ฝ์‚ฌํ•ญ ์ฐธ์กฐ) TYPE TYPEBODY

    DROP

    ๋‹ค์Œ์€ ๋ชจ๋“  ์Šคํ‚ค๋งˆ์— ๋Œ€ํ•ด์„œ ๋ชจ๋“  ์ข…๋ฅ˜์˜ 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์„ ๋™๊ธฐํ™”ํ•˜์ง€ ์•Š๋Š”๋‹ค.

    • DDL ๋ฌธ์žฅ ํฌ๊ธฐ ๋™๊ธฐํ™” ํ•  DDL ๋ฌธ์žฅ์˜ ๊ฐ ์š”์†Œ๋Š” 128๊ธ€์ž๋ฅผ ๋„˜์„ ์ˆ˜ ์—†๋‹ค.

    • ์„ค์ • ์ „ ํ™•์ธ DDL ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๋Œ€์ƒ๊ณผ, ๋™๊ธฐํ™” ํ•  DDL ์ข…๋ฅ˜๊ฐ€ ์ •ํ™•ํ•œ์ง€ Wildcard๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ํ™•์ธํ•˜๊ณ  ์„ค์ •ํ•œ๋‹ค. ๋‹ค๋ฅธ DB๋‚˜ ๋Œ€์ƒ์—๊ฒŒ ๋จผ์ € ์ ์šฉํ•ด๋ณด๊ณ  ์„ค์ •ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.

    • CREATE TABLE ์ดํ›„ ๋™๊ธฐํ™” CREATE TABLE์— ๋Œ€ํ•œ DDL ๋™๊ธฐํ™” ํ›„ ์ƒ์„ฑ๋œ ํ…Œ์ด๋ธ”์„ DML ๋™๊ธฐํ™” ํ•˜๋ ค๋ฉด ์ˆ˜๋™์œผ๋กœ ๋™๊ธฐํ™” ๋Œ€์ƒ ์ถ”๊ฐ€๋ฅผ ํ•ด์•ผํ•œ๋‹ค. ๋ฐ˜๋ฉด DDL์€ Rule์— ์˜ํ•ด ์ƒ์„ฑ๋œ ์งํ›„๋ถ€ํ„ฐ ๋™๊ธฐํ™” ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ฃผ์˜ํ•œ๋‹ค.

    • 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 ๋™๊ธฐํ™”๋ฅผ ์ง€์›ํ•œ๋‹ค.

    DDL=([SET] [RANGE], TYPE=('[DDL OPERATION] [DDL OBJECT]', ...))

    [SET]

    INCLUDE ๋˜๋Š” EXCLUDE๋ฅผ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.

    • INCLUDE: ๊ธฐ์ˆ ๋œ ๊ทœ์น™์— ๋Œ€ํ•ด ๋™๊ธฐํ™”ํ•œ๋‹ค.

    • EXCLUDE: ๊ธฐ์ˆ ๋œ ๊ทœ์น™์— ๋Œ€ํ•ด ๋™๊ธฐํ™”ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์–ด๋– ํ•œ INCLUDE๋ณด๋‹ค EXCLUDE๋ฅผ ์šฐ์„ ์‹œํ•œ๋‹ค.

    ์‚ฌ์šฉ๋ฒ•

    [RANGE]

    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')
    )

    ์ฐธ๊ณ 

    [RANGE]์˜ ์˜ค๋ธŒ์ ํŠธ ์ด๋ฆ„์ด๋‚˜ [DDL OPERATION], [DDL OBJECT]์— %๋ฅผ ๋ช…์‹œ์— ํฌํ•จ์‹œ์ผœ wildcard๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

    Source DB๊ฐ€ Oracle์ธ ๊ฒฝ์šฐ [DDL OPERATION]๊ณผ [DDL OBJECT]์— '%'๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

    Source DB๊ฐ€ Tibero์ธ ๊ฒฝ์šฐ

    Source DB๊ฐ€ Oracle์ธ ๊ฒฝ์šฐ

    ์˜ˆ์ œ

    DDL ๋™๊ธฐํ™” ์„ค์ • ์‹œ ์œ ์˜์‚ฌํ•ญ

    ์ฃผ์˜ DDL=(INCLUDE ALL, TYPE=('%'))์„ค์ • ์‹œ, Source DB์˜ ๋ชจ๋“  ์Šคํ‚ค๋งˆ์—์„œ ์ˆ˜ํ–‰๋˜๋Š” ๋ชจ๋“  ํƒ€์ž…์˜ DDL์ด ๋™๊ธฐํ™”๋œ๋‹ค. ๋™๊ธฐํ™” ๋Œ€์ƒ ์—ฌ๋ถ€์™€ ๊ด€๊ณ„์—†์ด ๋ชจ๋“  DDL์ด ์ ์šฉ๋˜๋ฏ€๋กœ ์‚ฌ์šฉ ์‹œ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ์ถ”๊ฐ€์ ์œผ๋กœ INCLUDE ALL๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒฝ์šฐ ์„ค์น˜๋  Instance ๋Š” ๋‹จ์ผ Instance ๋กœ ๊ตฌ์„ฑ๋˜์–ด์•ผ ํ•œ๋‹ค.

    LIBRARY TYPE TYPEBODY

    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

    -

    TRUNCATE

    TABLE

    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)
    );