현상
Prosync 4.4.0에서 NO_DCR_TABLE_SKIP_ERROR=Y 파라미터를 설정했음에도 불구하고, 관련 에러가 정상적으로 skip되지 않는 현상이 발생합니다.
원인
DISCARD_YN 파라미터가 신규 생성된 후, 기존의 NO_DCR_TABLE_SKIP_ERROR 파라미터와 기능이 유사하여 NO_DCR_TABLE_SKIP_ERROR 파라미터는 Prosync 4.3.4 이후 버전에서 제외되었습니다.
해결
기존 NO_DCR_TABLE_SKIP_ERROR 파라미터를 사용하고 싶다면, NO_DCR_TABLE_SKIP_ERROR 대신 DISCARD_YN 파라미터를 사용해야 합니다.
DISCARD_YN 관련 파라미터 가이드
파라미터 | 기능 |
DISCARD_YN | - discard 기능을 끄고 켜는 파라미터
- default 값은 N |
DISCARD_EC | - discard 할 에러코드를 기입하는 파라미터
- default 값은 없으며, no data found 에러의 경우 에러코드 2를 사용
ex) DISCARD_EC=(2 10007 8026) [최대 256개] |
DISCARD_FILE_YN | - discard 가 발생했을 때 해당 내용을 discard 파일에 남기는 기능을 끄고 켜는 파라미터
- default 값은 N |
DISCARD_FILE_SIZE | - discard 파일의 최대 크기를 기입하는 파라미터
- default 값은 100M |
DISCARD_FILE_DIR | - discard 파일의 저장 위치를 기입하는 파라미터
- default 값은 LOG_DIR 파라미터와 동일하게 설정됨 |
DISCARD_BACKUP_DIR | - discard 파일의 크기가 초과되어 backup 되는 위치를 기입하는 파라미터
- default 값은 DISCARD_FILE_DIR/backup 경로로 설정 |
DISCARD_BACKUP_SIZE | - backup 디렉토리의 크기를 기입하는 파라미터
- default 값은 0 [무제한] |
파라미터 사용 예시
1. 데이터가 다른 테이블에 대해 DML 수행
NO DATA FOUND 에러를 유발하기 위해, Source 에만 존재하는 데이터를 삭제합니다.
Source 에는 c1=2인 row가 존재하지만, Target 에는 c1=2인 데이터가 없기 때문에, 동기화 과정에서 Target Prosync 측에서 "데이터를 찾을 수 없음(NO DATA FOUND)" 에러가 발생하게 됩니다.
Source
SQL> select * from t1;
C1 C2 C3
---------- -------------------- -----------------
3 test test
1 테스트 하하
2 test test
SQL> delete from t1 where c1=2;
1 행이 삭제되었습니다.
SQL> commit;
커밋이 완료되었습니다.
SQL> select * from t1;
C1 C2 C3
---------- -------------------- --------------------
3 test test
1 테스트 하하
SQL
복사
Target
SQL> select * from t1;
C1 C2 C3
---------- --------------- --------------
1 테스트 하하
3 test test
SQL>
SQL>
SQL>
SQL>
SQL> select * from t1;
C1 C2 C3
---------- --------------- --------------
1 테스트 하하
3 test test
SQL
복사
2. Apply 로그에서 에러 로그 확인
Target 에 존재하지 않는 데이터를 삭제한 후, Apply 로그에서 "NO DATA FOUND" 에러가 발생한 것을 확인할 수 있습니다.
[05-01T21:35:03.802986] [REP-04] [T] replay delete (obj_id:238123, col_cnt:3)
[05-01T21:35:03.803025] [REP-04] [T] execute delete (DELETE FROM "TIBERO"."T1" WHERE "C1" = :"C1" AND "C2" = :"C2" AND "C3" = :"C3" AND ROWNUM = 1)
[05-01T21:35:03.803034] [REP-04] [D] prepare SQL (DELETE FROM "TIBERO"."T1" WHERE "C1" = :"C1" AND "C2" = :"C2" AND "C3" = :"C3" AND ROWNUM = 1)
[05-01T21:35:03.803063] [REP-04] [D] natparam #1 (type:NUMBER, len:3)
[05-01T21:35:03.803071] [REP-04] [D] 0000: 02 c1 82 ...
[05-01T21:35:03.803085] [REP-04] [D] natparam #2 (type:VARCHAR, len:4)
[05-01T21:35:03.803091] [REP-04] [D] 0000: 74 65 73 74 test
[05-01T21:35:03.803099] [REP-04] [D] natparam #3 (type:VARCHAR, len:4)
[05-01T21:35:03.803105] [REP-04] [D] 0000: 74 65 73 74 test
[05-01T21:35:03.803690] [REP-04] [T] no data found
[05-01T21:35:03.803699] [REP-04] [E] DELETE: no data found [prs_apply_replay.c:3575]
[05-01T21:35:03.803706] [REP-04] [T] send ipc (type:PRS_IPC_ERROR_LOG, tid:0, key:0 src_id:-1)
[05-01T21:35:03.803713] [REP-04] [E] Replay delete failed.(xid: 3940649673949184, stmt: DELETE FROM "TIBERO"."T1" WHERE "C1" = :"C1" AND "C2" = :"C2" AND "C3" = :"C3" AND ROWNUM = 1) [prs_apply_replay.c:3608]
SQL
복사
3. Apply 설정에 DISCARD 관련 파라미터 추가 후 Prosync 재기동
Skip하려는 에러 코드를 DISCARD_EC 파라미터에 설정한 후, Prosync를 재기동하여 수행합니다.
################################################################################
#
# ProSync (Apply) Initialization Parameters
#
################################################################################
LOG_LEVEL=5
PRS_USER=US_PROSYNC_G2I
PRS_PWD=#encrypted
APPLY_NUM=1
TAR_DB_TYPE=TIBERO
TAR_DB_NAME=tibero7_2
SRC_DB_CNT=1
#MAP=(TABLE DEFAULT)
#DDL=(INCLUDE DEFAULT, TYPE=('ALTER TABLE','TRUNCATE TABLE'))
MAP=(TABLE DEFAULT
#TABLE TIBERO.PKY,TIBERO.PKY RESOLVE BY SOURCE
#TABLE TIBERO.T3,TIBERO.T3 RESOLVE BY SOURC
)
DDL=(EXCLUDE ALL, TYPE=('ALTER TABLE','TRUNCATE TABLE'))
LOG_DIR=/idiska/pub1/jsh/7.2.2/0423/prosync4/var/US_PROSYNC_G2I/log
LOG_BACKUP_DIR=/idiska/pub1/jsh/7.2.2/0423/prosync4/var/US_PROSYNC_G2I/log/backup
LOG_BACKUP_SIZE=5G
USE_PK_FOR_WHERE=Y
DISCARD_YN=Y
DISCARD_EC=(2)
DISCARD_FILE_YN=Y
SQL
복사
[05-01T21:48:11.637779] [REP-04] [T] replay delete (obj_id:238123, col_cnt:3)
[05-01T21:48:11.637811] [REP-04] [T] execute delete (DELETE FROM "TIBERO"."T1" WHERE "C1" = :"C1" AND "C2" = :"C2" AND "C3" = :"C3" AND ROWNUM = 1)
[05-01T21:48:11.637814] [REP-04] [D] prepare SQL (DELETE FROM "TIBERO"."T1" WHERE "C1" = :"C1" AND "C2" = :"C2" AND "C3" = :"C3" AND ROWNUM = 1)
[05-01T21:48:11.637822] [REP-04] [D] natparam #1 (type:NUMBER, len:3)
[05-01T21:48:11.637826] [REP-04] [D] 0000: 02 c1 82 ...
[05-01T21:48:11.637840] [REP-04] [D] natparam #2 (type:VARCHAR, len:4)
[05-01T21:48:11.637843] [REP-04] [D] 0000: 74 65 73 74 test
[05-01T21:48:11.637847] [REP-04] [D] natparam #3 (type:VARCHAR, len:4)
[05-01T21:48:11.637849] [REP-04] [D] 0000: 74 65 73 74 test
[05-01T21:48:11.638213] [REP-04] [T] no data found
[05-01T21:48:11.638222] [REP-04] [E] DELETE: no data found [prs_apply_replay.c:3575]
[05-01T21:48:11.638229] [REP-04] [T] send ipc (type:PRS_IPC_ERROR_LOG, tid:0, key:0 src_id:-1)
[05-01T21:48:11.638235] [REP-04] [E] Replay delete failed.(xid: 3940649673949184, stmt: DELETE FROM "TIBERO"."T1" WHERE "C1" = :"C1" AND "C2" = :"C2" AND "C3" = :"C3" AND ROWNUM = 1) [prs_apply_replay.c:3608]
[05-01T21:48:11.638240] [REP-04] [T] send ipc (type:PRS_IPC_ERROR_LOG, tid:0, key:0 src_id:-1)
[05-01T21:48:11.638266] [CTH-00] [T] event occurred (fd:16, type:1, idx:0)
[05-01T21:48:11.638269] [REP-04] [E] unable to get error code (rc:100) [prs_apply_replay.c:3622]
[05-01T21:48:11.638284] [REP-04] [E] Error discarded : no data found [prs_apply_replay.c:3641]
SQL
복사
4. Apply 로그 확인
Apply 로그에서 Error discarded 메시지를 확인합니다.
이 메시지는 에러가 발생한 DML을 Skip 처리했다는 의미입니다.
[05-01T21:48:11.637779] [REP-04] [T] replay delete (obj_id:238123, col_cnt:3)
[05-01T21:48:11.637811] [REP-04] [T] execute delete (DELETE FROM "TIBERO"."T1" WHERE "C1" = :"C1" AND "C2" = :"C2" AND "C3" = :"C3" AND ROWNUM = 1)
[05-01T21:48:11.637814] [REP-04] [D] prepare SQL (DELETE FROM "TIBERO"."T1" WHERE "C1" = :"C1" AND "C2" = :"C2" AND "C3" = :"C3" AND ROWNUM = 1)
[05-01T21:48:11.637822] [REP-04] [D] natparam #1 (type:NUMBER, len:3)
[05-01T21:48:11.637826] [REP-04] [D] 0000: 02 c1 82 ...
[05-01T21:48:11.637840] [REP-04] [D] natparam #2 (type:VARCHAR, len:4)
[05-01T21:48:11.637843] [REP-04] [D] 0000: 74 65 73 74 test
[05-01T21:48:11.637847] [REP-04] [D] natparam #3 (type:VARCHAR, len:4)
[05-01T21:48:11.637849] [REP-04] [D] 0000: 74 65 73 74 test
[05-01T21:48:11.638213] [REP-04] [T] no data found
[05-01T21:48:11.638222] [REP-04] [E] DELETE: no data found [prs_apply_replay.c:3575]
[05-01T21:48:11.638229] [REP-04] [T] send ipc (type:PRS_IPC_ERROR_LOG, tid:0, key:0 src_id:-1)
[05-01T21:48:11.638235] [REP-04] [E] Replay delete failed.(xid: 3940649673949184, stmt: DELETE FROM "TIBERO"."T1" WHERE "C1" = :"C1" AND "C2" = :"C2" AND "C3" = :"C3" AND ROWNUM = 1) [prs_apply_replay.c:3608]
[05-01T21:48:11.638240] [REP-04] [T] send ipc (type:PRS_IPC_ERROR_LOG, tid:0, key:0 src_id:-1)
[05-01T21:48:11.638266] [CTH-00] [T] event occurred (fd:16, type:1, idx:0)
[05-01T21:48:11.638269] [REP-04] [E] unable to get error code (rc:100) [prs_apply_replay.c:3622]
[05-01T21:48:11.638284] [REP-04] [E] Error discarded : no data found [prs_apply_replay.c:3641]
SQL
복사
5. Discard 로그 확인
Discard 로그를 통해 Skip 처리된 DML 내역을 확인할 수 있습니다.
[05-01T21:48:11.638293] [REP-04] [I] Error discarded : no data found
[05-01T21:48:11.638301] [REP-04] [I] sql : DELETE FROM "TIBERO"."T1" WHERE "C1" = :"C1" AND "C2" = :"C2" AND "C3" = :"C3" AND ROWNUM = 1 , xid:3940649673949184 ,seqno:3636 ,tsn:315844751 ,obj_id:238123
[05-01T21:48:11.638305] [REP-04] [I] WHERE clause columns (col_cnt:3)
[05-01T21:48:11.638343] [REP-04] [I] end sql
SQL
복사
주의
에러로 인해 적용에 실패한 DML을 건너뛰게 하는 파라미터이므로, 해당 DML이 처리하는 row는 Source와 Target 간 데이터 불일치가 발생할 수 있다는 점을 유의해야 합니다.