데이터 마이그레이션 정합성은 행 수 일치가 아니라 키 기준 행 단위 값 일치율과 허용 불일치 목록으로 판정해야 하며, 비교 범위와 제외 컬럼을 먼저 문서로 고정해야 결과를 해석할 수 있다. Oracle 19c에서는 DBMS_COMPARISON의 버킷 비교와 RECHECK를, PostgreSQL에서는 집계 해시 기반 행 대조를 사용하되 두 경우 모두 비교 시점의 쓰기 중단 구간이나 키 범위 분리가 필요하다.
- Oracle DBMS_COMPARISON은 32비트 ORA_HASH 기반 버킷 비교를 사용하므로 해시 충돌 가능성과 지원 데이터 타입·인덱스 요건을 함께 검토해야 한다.
- 비교 전에 문자 집합, 컬럼 데이터 타입, 제외 컬럼, 타임존과 숫자 변환 규칙을 확정하지 않으면 불일치 원인을 구분할 수 없다.
- 비교 대상 행이 동시에 갱신되면 정상 행이 불일치로 보고될 수 있으므로 쓰기 중단 구간을 정하거나 키 범위로 나눠 검증한다.
- 불일치는 RECHECK 등으로 재현을 확인한 뒤 원인별로 분류해 반영하고, 검증 시각과 허용 기준을 릴리스 기록에 남긴다.
행 수 일치가 정합성 판정이 되지 못하는 이유
마이그레이션 완료 판정을 행 수 비교로 끝내면 잔여 불일치를 놓친다. 원본과 대상의 COUNT(*)가 같아도 특정 행의 컬럼 값이 다르거나 삭제와 삽입이 상쇄된 상태일 수 있기 때문이다. 합계나 평균 같은 집계 지표도 이상 신호를 줄 뿐 판정 근거가 되지 못한다. Oracle 19c의 DBMS_COMPARISON은 행 단위 해시를 버킷으로 나눠 비교하고 차이가 있는 버킷만 다시 쪼개 좁히는 방식으로 전체 스캔 비용을 줄인다. 다만 이 패키지는 32비트 ORA_HASH를 사용하므로 해시 충돌 가능성이 남고, 지원 데이터 타입과 인덱스 컬럼 요건을 함께 만족해야 동작한다. PostgreSQL의 페이지 체크섬은 디스크 페이지 손상을 탐지할 뿐 논리적으로 값이 어긋난 행은 잡아내지 못한다. 그래서 판정 기준은 행 수 일치가 아니라 키 기준 행 단위 값 일치율과 허용 불일치 목록 두 가지로 나눠 정의해야 한다. 검증 범위에서 제외한 컬럼이 남아 있다면 '차이 없음' 결과도 정합성의 증거가 아니다.
비교 범위와 제외 컬럼을 먼저 확정하는 기준
비교 범위를 문서로 고정하지 않으면 검증 결과를 해석할 수 없다. Oracle DBMS_COMPARISON은 양쪽 객체의 컬럼 수와 대응 컬럼 데이터 타입이 같아야 하고 데이터베이스 문자 집합이 동일해야 하며, BLOB·CLOB·LONG·ROWID와 사용자 정의 타입은 비교 대상으로 삼지 못한다. 이런 컬럼은 column_list에서 제외해 부분 비교로 전환하고, 제외한 컬럼은 애플리케이션 레벨 검증 항목으로 분리해 별도로 확인한다. 행을 유일하게 식별할 수 있는 인덱스도 필수 조건이다. 기본키나 NOT NULL 컬럼의 유니크 인덱스가 없고 적합한 인덱스를 지정하지 못하면 ORA-23676이 발생한다. PostgreSQL에서는 정렬 키를 지정한 집계 해시나 외부 비교 도구로 행 단위 대조를 수행하며, 큰 테이블은 키 범위로 나눠 실행한다. 어느 쪽이든 비교 전에 숫자 정밀도, 날짜 반올림, 타임존 변환, 문자 집합 변환 규칙을 확정하고, 마이그레이션 변환 로직과 비교 쿼리가 같은 규칙을 쓰는지 확인해야 한다.

부하와 잠금을 줄이는 실행 절차
실행 절차는 부하가 낮은 시간대를 고르는 것에서 시작한다. Oracle은 CREATE_COMPARISON에서 스캔 모드를 FULL, RANDOM, CYCLIC, CUSTOM 중 하나로 정하고 max_num_buckets(기본 1000)와 min_rows_in_bucket(기본 10000)을 조정해 한 번에 훑는 범위를 제어한다. 전체를 한 번에 비교하면 원본에 부하가 몰리므로 CYCLIC이나 CUSTOM으로 키 범위를 나눠 진행하고 각 범위의 scan_id와 결과를 기록한다. 비교 대상 행이 동시에 갱신되면 스캔 시점 차이 때문에 정상 행이 불일치로 잡힐 수 있고, 갱신 중인 행에 CONVERGE를 적용하면 예상치 못한 값이 남을 수 있다. 그러므로 비교 구간의 쓰기를 멈추거나 쓰기가 계속되는 범위는 검증에서 분리한다. PostgreSQL에서 체크섬 설정을 바꾸는 작업은 복제 노드가 있는 구성에서 모든 노드를 일관되게 전환하지 않으면 페이지 손상으로 이어질 수 있으므로 중단 범위를 미리 정하고 진행한다.
불일치 분류와 종료 판정 기록
불일치가 보고되면 먼저 원인을 분류한다. 값 차이인지, 행 누락인지, 중복 키인지, 제외 컬럼 때문인지에 따라 대응이 달라진다. Oracle에서는 RECHECK으로 해당 scan_id의 차이를 다시 확인하고 재현될 때만 수정 대상으로 확정한다. 수정은 CONVERGE로 일괄 반영하기보다 원인별 배치로 나누고, 반영 전후 키 목록과 건수를 검증 이력 테이블에 적재해 비교 시각과 실행자를 함께 남긴다. 전환 직전에는 쓰기를 정지한 상태에서 최종 비교를 한 번 더 수행하고 판정 기준을 릴리스 기록에 명시한다. 불일치 0건을 목표로 하되 제외 대상과 미검증 범위는 숨기지 않고 남긴다.
- 릴리스 기록에 남길 허용 불일치 건수와 허용 컬럼
- 검증 시각과 마지막으로 완료한 스캔 범위
- 비교에서 제외한 대상과 아직 검증하지 않은 범위
출처
- Oracle Database PL/SQL Packages and Types Reference 19c, DBMS_COMPARISON Oracle · 2026-09-28
- Oracle Database Streams Replication Administrator's Guide, Comparing and Converging Data Oracle · 2026-09-28
- PostgreSQL Documentation, pg_checksums PostgreSQL Global Development Group · 2026-09-28
- PostgreSQL Documentation, initdb (데이터 체크섬 옵션) PostgreSQL Global Development Group · 2026-09-28