์ฅ์ ์ํฉ์ ๋ํ ์กฐ์น๋ก์, ํ๋ก์ธ์ค๋ณ ์ฅ์ ์ํฉ๊ณผ ์ด์ ๋ํ ๋ด์ฉ์ ์๋ดํ๋ค.
Extract ํ๋ก์ธ์ค๋ Redo Log ํ์ผ์ ์ฝ์ด ๋ณ๊ฒฝ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๊ธฐ ๋๋ฌธ์, ๋์คํฌ ์ฝ๊ธฐ ์๋๊ฐ ์ฑ๋ฅ์ ์ํฅ์ ์ค ์ ์์ผ๋ฉฐ ๋ณ๊ฒฝ ๋ฐ์ดํฐ๋ Chunk ํํ๋ก Apply ํ๋ก์ธ์ค์ ์ ์กํ๊ธฐ ๋๋ฌธ์, ๋คํธ์ํฌ ์๋๊ฐ ์ํฅ์ ์ค ์ ์๋ค.
ProSync ํ๋ผ๋ฏธํฐ์ ๋ฐ๋ผ ์ฑ๋ฅ์ด ๋ณํํ ์ ์๋ค.
๋ก๊ทธ ๋ ๋ฒจ(LOG_LEVEL)์ด ๋๋ค๋ฉด, disk write๊ฐ ๋ง์์ง์ ๋ฐ๋ผ ์ฑ๋ฅ์ด ์ ํ๋ ์ ์๋ค.
๋ฐ์ดํฐ ์์ถ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ค๋ฉด, ๋ฐ์ดํฐ ์์ถ์ ์ํ ๋์์ด ์ถ๊ฐ๋จ์ ๋ฐ๋ผ ์ฑ๋ฅ์ด ์ ํ๋ ์ ์๋ค.
๋ฐ์ดํฐ ์ํธํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ค๋ฉด, ๋ฐ์ดํฐ ์ํธํ๋ฅผ ์ํ ๋์์ด ์ถ๊ฐ๋จ์ ๋ฐ๋ผ ์ฑ๋ฅ์ด ์ ํ๋ ์ ์๋ค.
ProSync๋ ์ ์ ํ ๋ฐ์ ์ฟผ๋ฆฌ ์์ฑ์ ์ํด ํ ์ด๋ธ์ DD image ๋ณ๊ฒฝ์ด ๋ฐ์ํ๋ ์์ ์ Trigger๋ฅผ ํตํด ๋ด๋ถ ํจํค์ง๋ฅผ ์ํํ์ฌ ๋ฉํ ํ ์ด๋ธ์ ์ ๋ฐ์ดํธํ๋ค.
๋ฉํ ํ ์ด๋ธ ์ ๋ฐ์ดํธ๋ ํ์ํ ์ ๋ณด๊ฐ ์๋ ์์คํ ํ ์ด๋ธ์ ์กฐํํ์ฌ ๋๊ธฐํ ํ Object๋ค์ ์ ๋ณด๋ฅผ ๋ฉํ ํ ์ด๋ธ์ insertํ๋ ๋ฐฉ์์ผ๋ก ์ค์น ์์ ์ PRS_USER์ ์ ์ ํ ๊ถํ์ด ๋ถ์ฌ๋์ง๋ง, ์ฌ์ฉ ์ค์ธ PRS_USER์๊ฒ์ ํ์ํ ๊ถํ์ ํ์ํ๋ค๋ฉด ํด๋น ๋์์ ์ํํ์ง ๋ชปํด ์ฅ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
ProSync๊ฐ ์ฌ์ฉํ๋ PRS_DDL_HIST์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋์ง ํ์ธํ ์ ์์ผ๋ฉฐ ํด๋น ํ ์ด๋ธ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ, PRS_USER์ ๊ถํ ๋ณ๊ฒฝ์ด ์๋์ง ํ์ธ์ด ํ์ํ๋ค.
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 ํ๋ผ๋ฏธํฐ๋ฅผ ํตํด ๋๊ธธ ์ ์๋ค.
_LR_SKIP_CORRUPTED_LCR
Log Reader์์ corrupted lcr์ด ์ถ์ถ๋์ด๋ ์ถ์ถ์ ์ ์งํ์ง ์๋๋ก ์ค์ ํ๋ค.
ProSync ์ด์ ์ค ์ฅ์ ๋ฐ์ ์, ๋ถ์์ ์ํด ํ์ ๋ฐ์ํ ํ๋ก์ธ์ค์ 5๋ ๋ฒจ ๋ก๊ทธ์ config๋ฅผ ์ฒจ๋ถํด์ผ ํ๋ฉฐ ์ฅ์ ์ ํ์ ๋ฐ๋ผ ๋ค์ ์ ๋ณด๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ์์ฒญํ ์ ์๋ค.
Extract
$PRS_HOME/config/[INST_ID]_ext[NODE_NUM].cfg
Apply
๋ค๋ฅธ ํ๋ก์ธ์ค์์ ์ ๋ฌํ ์ ๋ณด์ ์ค๋ฅ๊ฐ ์์ฌ๋๋ ๊ฒฝ์ฐ ์์ฒญํ ์ ์๋ค.
config ํ์ผ์ LOG_DIR ๊ฒฝ๋ก์ ์์นํ๋ค.
ํ์ ๋ฐ์ํ ํ๋ก์ธ์ค์ ๋์ผํ๊ฒ 5๋ ๋ฒจ ๋ก๊ทธ(LOG_LEVEL=5)๋ฅผ ์ฒจ๋ถํด์ผ ํ๋ค.
Log Reader ์ค๋์์ด ์์ฌ๋๋ ๊ฒฝ์ฐ ์์ฒญํ ์ ์๋ค. ์์ธํ ๋ถ์์ ์ํด, Extract ํ๋ก์ธ์ค์ ํ๋ผ๋ฏธํฐ๋ฅผ '''LR_TRACE_LVL=5''' ๋ก ์ค์ ํ ๋ค, ํ์ ์ฌํ์ ์์ฒญํ๋ค.
$PRS_HOME/var/[INST_ID]/lr[NODE_NUM]/ ๊ฒฝ๋ก์ ์์ฑ๋๋ til[NODE_NUM].log/oli[NODE_NUM].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 ํ๋ผ๋ฏธํฐ ์ค์ ์, ํด๋น ๊ฒฝ๋ก์ ์์ฑ๋๋ค.
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 ๋๊ธฐํ๋ฅผ ๊ณ์ํด์ ์ฌ์๋ํ๋ค.
$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
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 ํ๋ก์ธ์ค์์ ์ฌ์ฉํ๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ฆ๊ฐํ ์ ์๋ค.
์ด๋, ๋ฉ๋ชจ๋ฆฌ ์กฐ์ ์ฉ ํ๋ผ๋ฏธํฐ๋ฅผ ์ค์ ํ์ฌ ์ฌ์ฉํ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์กฐ์ ํ ์ ์๋ค.
Replay Thread ์์ ์๋ฃ๋์ง ์์ TX๋ค์ ์ด ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ๊ฐ MEMORY_CTRL_STOP_SIZE ํ๋ผ๋ฏธํฐ์ ๊ฐ์ ๋๋ ๊ฒฝ์ฐ extract ํ๋ก์ธ์ค์์ ๋ณด๋ด๋ chunk๋ฅผ ์์ ํ์ง ์๋๋ค.
์ดํ, Replay Thread ์์ ๋๊ธฐํ๋ฅผ ์ํํ์ฌ ์๋ฃ๋์ง ์์ TX๋ค์ ์ด ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ๊ฐMEMORY_CTRL_RESUME_SIZE ๊ฐ๋ณด๋ค ๋ฎ์์ง๋ ๊ฒฝ์ฐ ๋ค์ Extract ํ๋ก์ธ์ค์์ ๋ณด๋ด๋ chunk๋ฅผ ์์ ํ๋ค.
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๊ฐ ๋๋์ง ์๋ ๊ฒฝ์ฐ ๋์คํฌ ์ฌ์ฉ๋์ด ๊ณ์ํด์ ์ฆ๊ฐํ ์ ์๋ค.
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 ํ ์ด๋ธ์ ๋๊ธฐํํ ๊ฒฝ์ฐ, ๋ค์๊ณผ ๊ฐ์ ํ๋ฆ์ด ๋ฐ์ํ ์ ์๋ค.
Source DB์์ TEST.T1 ํ ์ด๋ธ์ INSERT ์ํ -> Trigger ์๋ -> TEST.T2์๋ ๋ฐ์ดํฐ ์ฝ์
๋๊ธฐํ ๊ณผ์ ์์ Target DB์ TEST.T1 INSERT ๋ฐ์ -> Target DB์ Trigger ์๋ -> TEST.T2์๋ ๋์ผํ ๋ฐ์ดํฐ ์ฝ์
๋ํ, Source DB์์ ์ถ์ถ๋ TEST.T2์ INSERT ๋ฌธ์ด Target DB์ ๋ฐ์๋๋ฉด์ ์ค๋ณต ์ฝ์ ๋ฐ์
์ด๋ก ์ธํด Target DB์ TEST.T2 ํ ์ด๋ธ์๋ ์ค๋ณต๋ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ ์ ์๋ค.
๋ฐ๋ผ์ ํ๋ก์ฑํฌ ๋๊ธฐํ ๋ก์ง ์ ์ ํฉ์ฑ์ด ํ์ด์ง ์ ์๊ธฐ ๋๋ฌธ์ 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๋ฅผ ๊ธฐ์ฌํ์ฌ ์ฐํ ํ ์ ์๋ค.
์ฃผ์
์ ์ฝ ์กฐ๊ฑด์ด ์ค์ ๋ ํ ์ด๋ธ ๋๊ธฐํ ์ ์ฃผ์ ์ฌํญ
Trigger๋ฟ๋ง ์๋๋ผ ON DELETE, ON UPDATE์ ๊ฐ์ ์ ์ฝ ์กฐ๊ฑด(Constraint) ๋ํ ๋์ผํ ์ด์ ๋ก Target DB์ ์ค์ ๋์ด์๋ ์ ๋๋ค.
์ด๋ฌํ ์ ์ฝ ์กฐ๊ฑด์ด ์กด์ฌํ ๊ฒฝ์ฐ, ๋๊ธฐํ ์ ๋ฐ์ดํฐ์ ์ฝ์ ยท์ญ์ ยท๊ฐฑ์ ์์ ์ด ์ค๋ณต ๋ฐ์๋์ด ๋ฐ์ดํฐ ์ ํฉ์ฑ์ด ๊นจ์ง ์ ์๋ค.
์ฃผ์
์ค๋ผํด ๋ด๋ถ ๋์์ด๋ฏ๋ก, ์ด๋ค ๊ตฌ๋ฌธ ์คํ ์ 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(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 ๋ฐ์