29.7. 충돌#

논리적 복제는 구독자 노드에서 로컬로 변경된 경우에도 데이터가 업데이트된다는 점에서 일반 DML 작업과 유사하게 작동합니다. 들어오는 데이터가 제약 조건을 위반하면 복제가 중지됩니다. 이를 a라고 합니다.충돌. 복제할 때업데이트또는삭제작업, 누락된 데이터도 다음과 같이 간주됩니다.충돌, 그러나 오류가 발생하지 않으며 이러한 작업은 단순히 건너뜁니다.

추가 로깅이 트리거되고 충돌 통계가 수집됩니다(에 표시pg_stat_subscription_stats보기) 다음에서충돌사례:

삽입_존재 #

a를 위반하는 행 삽입지연할 수 없음고유한 제약조건. 충돌하는 키의 출처와 커밋 타임스탬프 세부정보를 기록하려면,track_commit_timestamp구독자에서 활성화되어야 합니다. 이 경우 충돌이 수동으로 해결될 때까지 오류가 발생합니다.

update_origin_differs #

이전에 다른 출처에 의해 수정된 행 업데이트. 이 충돌은 다음 경우에만 감지될 수 있습니다.track_commit_timestamp구독자에서 활성화되었습니다. 현재 업데이트는 로컬 행의 출처에 관계없이 항상 적용됩니다.

업데이트_존재 #

행의 업데이트된 값이 다음을 위반합니다.지연할 수 없음고유한 제약조건. 충돌하는 키의 출처와 커밋 타임스탬프 세부정보를 기록하려면,track_commit_timestamp구독자에서 활성화되어야 합니다. 이 경우 충돌이 수동으로 해결될 때까지 오류가 발생합니다. 분할된 테이블을 업데이트할 때 업데이트된 행 값이 다른 파티션 제약 조건을 충족하여 행이 새 파티션에 삽입되는 경우,insert_exists새 행이 다음을 위반하면 충돌이 발생할 수 있습니다.지연할 수 없음고유한 제약 조건.

update_missing #

업데이트할 행을 찾을 수 없습니다. 이 시나리오에서는 업데이트를 건너뜁니다.

delete_origin_differs #

이전에 다른 출처에 의해 수정된 행을 삭제하는 중입니다. 이 충돌은 다음 경우에만 감지될 수 있습니다.track_commit_timestamp구독자에서 활성화되었습니다. 현재 삭제는 로컬 행의 출처에 관계없이 항상 적용됩니다.

delete_missing #

삭제할 행을 찾을 수 없습니다. 이 시나리오에서는 삭제를 건너뜁니다.

다중_고유_충돌 #

행을 삽입하거나 업데이트하면 여러 항목을 위반합니다.지연할 수 없음고유한 제약조건. 충돌하는 키의 원본 및 커밋 타임스탬프 세부정보를 기록하려면 다음을 확인하세요.track_commit_timestamp구독자에서 활성화되었습니다. 이 경우 충돌이 수동으로 해결될 때까지 오류가 발생합니다.

제외 제약 조건 위반과 같은 다른 충돌 시나리오가 있다는 점에 유의하세요. 현재는 로그에 이에 대한 추가 세부정보를 제공하지 않습니다.

논리적 복제 충돌에 대한 로그 형식은 다음과 같습니다:

로그: 관계 "에서 충돌이 감지되었습니다.스키마이름.테이블 이름": 충돌=충돌_유형세부정보:detailed_explanation.
{detail_values [; ... ]}.

어디에서세부사항_값다음 중 하나입니다:

    열쇠 (열_이름 [, ...])=(열_값 [, ...])
    기존 로컬 행 [(열_이름 [, ...])=](열_값 [, ...])
    원격 행 [(열_이름 [, ...])=](열_값 [, ...])
    복제본 ID {(열_이름 [, ...])=(열_값 [, ...]) | 가득한 [(열_이름 [, ...])=](열_값 [, ...])}

로그는 다음 정보를 제공합니다:

로그
  • 스키마 이름.테이블 이름충돌과 관련된 지역 관계를 식별합니다.

  • 충돌_유형발생한 충돌 유형입니다(예:insert_exists, update_exists).

세부정보
  • detailed_explanation가능한 경우 기존 로컬 행을 수정한 트랜잭션의 원본, 트랜잭션 ID 및 커밋 타임스탬프를 포함합니다.

  • 열쇠섹션에 고유 제약 조건을 위반한 로컬 행의 키 값이 포함되어 와이즈 토토.insert_exists, update_exists또는다중_고유_충돌충돌.

  • 기존 로컬 행원본이 원격 행과 다른 경우 섹션에 로컬 행이 포함됩니다.update_origin_differs또는delete_origin_differs충돌하거나 키 값이 원격 행과 충돌하는 경우insert_exists, update_exists또는다중_고유_충돌충돌.

  • 원격 행섹션에는 충돌을 일으킨 원격 삽입 또는 업데이트 작업의 새 행이 포함됩니다. 업데이트 작업의 경우 값이 변경되지 않고 토스트된 경우 새 행의 열 값은 null이 됩니다.

  • 복제본 ID섹션에는 업데이트하거나 삭제할 기존 로컬 행을 검색하는 데 사용된 복제본 ID 키 값이 포함되어 있습니다. 로컬 관계가 다음으로 표시된 경우 전체 행 값이 포함될 수 있습니다.복제본 ID 전체.

  • 열_이름은 열 이름입니다. 을 위한기존 로컬 행, 원격 행복제본 ID가 가득 참의 경우, 사용자에게 테이블의 모든 열에 접근할 수 있는 권한이 없는 경우에만 열 이름이 기록됩니다. 열 이름이 있는 경우 해당 열 값과 동일한 순서로 표시됩니다.

  • 열_값은 열 값입니다. 큰 열 값은 64바이트로 잘립니다.

  • 다음의 경우에 주의하세요다중_고유_충돌충돌, 다중detailed_explanation그리고detail_values줄이 생성되며 각 줄은 고유한 고유 제약 조건과 관련된 충돌 정보를 자세히 설명합니다.

논리적 복제 작업은 구독을 소유한 역할의 권한으로 수행됩니다. 대상 테이블에 대한 권한 실패로 인해 복제 충돌이 발생합니다.PostgreSQL : 문서 : 18 : 5.9. 보안 무지개 토토 행정책이 일반적으로 거부하는지 여부에 관계없이 구독 소유자가 적용되는 대상 테이블에서삽입, 업데이트, 삭제또는잘라내기복제 중입니다. 행 수준 보안에 대한 이 제한은 향후 버전에서 해제될 수 있습니다.PostgreSQL.

오류를 생성하는 충돌로 인해 복제가 중지됩니다. 사용자가 수동으로 해결해야 합니다. 충돌에 대한 자세한 내용은 구독자의 서버 로그에서 확인할 수 있습니다.

해결 방법은 구독자의 데이터 또는 권한을 변경하여 들어오는 변경 사항과 충돌하지 않도록 하거나 기존 데이터와 충돌하는 트랜잭션을 건너뛰는 방식으로 수행할 수 있습니다. 충돌로 인해 오류가 발생하면 복제가 진행되지 않고 논리적 복제 작업자가 구독자의 서버 로그에 다음과 같은 종류의 메시지를 내보냅니다.

오류: "public.test" 관계에서 충돌이 감지되었습니다: conflict=insert_exists
세부 정보: 키는 이미 2024-06-26 10:47:04.727375+08의 트랜잭션 740에서 로컬로 수정된 고유 인덱스 "t_pkey"에 존재합니다.
키(c)=(1); 기존 로컬 행(1, 'local'); 원격 행(1, '원격').
CONTEXT: 트랜잭션 725의 복제 대상 관계 "public.test"에 대한 "INSERT" 중 복제 원본 "pg_16395"에 대한 원격 데이터 처리가 0/14C0378에 완료되었습니다.

제약조건을 위반한 변경 사항이 포함된 트랜잭션의 LSN과 복제 원본 이름은 서버 로그에서 확인할 수 있습니다(LSN 0/14C0378 및 복제 원본pg_16395위의 경우). 충돌을 일으킨 트랜잭션은 다음을 사용하여 건너뛸 수 있습니다.구독 변경 ... 건너뛰기마감 LSN 포함(예: LSN 0/14C0378). 종료 LSN은 게시자에서 트랜잭션이 커밋되거나 준비되는 LSN일 수 있습니다. 또는를 호출하여 트랜잭션을 건너뛸 수도 있습니다.pg_replication_origin_advance()함수. 이 기능을 사용하기 전에 구독을 일시적으로 비활성화해야 합니다.구독 변경 ... 비활성화또는 다음과 함께 구독을 사용할 수 있습니다.disable_on_error옵션. 그런 다음 다음을 사용할 수 있습니다.pg_replication_origin_advance()함수노드_이름(즉,pg_16395) 및 마무리 LSN의 다음 LSN(예: 0/14C0379). 현재 원점 위치는에서 볼 수 있습니다.pg_replication_origin_status시스템 보기. 전체 트랜잭션을 건너뛰는 것은 어떠한 제약 조건도 위반하지 않을 수 있는 변경 사항을 건너뛰는 것을 포함합니다. 이는 쉽게 가입자의 일관성을 떨어뜨릴 수 있습니다. 원본 및 커밋 타임스탬프 등 충돌하는 행에 관한 추가 세부정보는 다음에서 확인할 수 있습니다.세부사항로그 줄. 하지만 이 정보는 다음 경우에만 사용할 수 있습니다.track_commit_timestamp구독자에서 활성화되었습니다. 사용자는 이 정보를 사용하여 로컬 변경 사항을 유지할지 아니면 원격 변경을 채택할지 결정할 수 있습니다. 예를 들어,세부사항23251_23377

스트리밍모드는병렬, 실패한 트랜잭션의 완료 LSN이 기록되지 않을 수 있습니다. 이 경우 스트리밍 모드를 다음으로 변경해야 할 수도 있습니다.켜짐또는꺼짐그리고 동일한 충돌을 다시 발생시켜 실패한 트랜잭션의 종료 LSN이 서버 로그에 기록됩니다. Finish LSN의 사용법은 다음을 참조하세요.구독 변경 ... 건너뛰기.

수정 사항 제출

문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.