출판

출판 (Publication) — 어떤 테이블의 어떤 변경을 내보낼지 정하기

논리 복제에서 "출판"은 복제의 원본 쪽 개념이에요. 출판을 정의한 노드를 publisher라고 부르고, 출판은 테이블 하나나 여러 테이블에서 발생한 변경들의 집합을 의미해요. 이를 변경 집합(change set)이나 복제 집합(replication set)이라고 부르기도 하죠. 각 출판은 하나의 데이터베이스에만 존재하며, "어느 테이블의 어떤 변경을 내보낼지"를 결정하는 기준점입니다.

출처: 공식문서

출판은 스키마와 다릅니다

출판은 스키마와 달라서 테이블에 접근하는 방식을 바꾸지 않아요. 필요하면 각 테이블을 여러 출판에 추가할 수도 있어요. 현재 출판은 테이블과 스키마의 모든 테이블만 담을 수 있고, ALL TABLES로 출판을 만들 때를 제외하면 객체를 명시적으로 추가해야 해요.

어느 연산을 복제할지 고를 수 있어요

출판은 만들어내는 변경을 INSERT, UPDATE, DELETE, TRUNCATE의 임의 조합으로 제한할 수 있어요. 트리거가 특정 이벤트 유형으로 발화하는 것과 비슷한 구조죠. 기본적으로는 모든 연산 유형이 복제됩니다. 이 출판 명세는 DML 연산에만 적용되고, 초기 데이터 동기화 복사에는 영향이 없어요. (행 필터는 TRUNCATE에는 효과가 없습니다.)

출판 하나에는 여러 구독자가 달릴 수 있어요.

출판 만들고 바꾸기

출판은 CREATE PUBLICATION 명령으로 만들고, 이후에는 대응하는 명령으로 바꾸거나(ALTER) 버릴 수(DROP) 있어요.

개별 테이블은 ALTER PUBLICATION으로 동적으로 추가·제거할 수 있습니다. ADD TABLEDROP TABLE 모두 트랜잭션적이어서, 트랜잭션이 커밋되면 그 시점의 올바른 스냅샷에서 테이블이 복제를 시작하거나 멈춰요.

Replica Identity — UPDATE/DELETE를 식별하는 열쇠

출판된 테이블이 UPDATEDELETE를 복제하려면 replica identity(복제 식별)가 설정되어 있어야 해요. 그래야 구독자 쪽에서 갱신·삭제할 올바른 행을 식별할 수 있습니다.

기본값은 주 키(있을 경우)예요. 특정 추가 요건을 만족하는 다른 유니크 인덱스도 replica identity로 설정할 수 있고요. 테이블에 적합한 키가 없다면 replica identity를 FULL로 설정할 수 있는데, 이 경우 행 전체가 키가 됩니다.

replica identity FULL을 지정하면 구독자 쪽에서 행을 검색하는 데 인덱스를 쓸 수 있어요. 후보 인덱스는 btree나 hash여야 하고, 부분(partial)이 아니어야 하며, 맨 왼쪽 인덱스 필드가 (표현식이 아닌) 출판 테이블 열을 참조하는 열이어야 해요. 이 비유니크 인덱스 속성 제한은 주 키에 강제되는 제한의 일부를 따릅니다. 그런 적합한 인덱스가 없으면 구독자 쪽 검색이 매우 비효율적일 수 있어서, replica identity FULL은 다른 해결책이 없을 때의 폴백으로만 써야 해요.

publisher 쪽에 FULL이 아닌 replica identity를 설정하면, 구독자 쪽에도 같거나 더 적은 열로 구성된 replica identity를 설정해야 합니다.

replica identity가 NOTHING이거나, 주 키 없이 DEFAULT이거나, 버려진 인덱스를 쓰는 USING INDEX인 테이블은, 그런 동작을 복제하는 출판에 포함됐을 때 UPDATE·DELETE를 지원할 수 없어요. 그런 연산을 시도하면 publisher 쪽에서 오류가 발생합니다. INSERT는 어떤 replica identity든 관계없이 진행돼요.

replica identity 설정 방법은 ALTER TABLE ... REPLICA IDENTITY를 참고하세요.

더 알아보기 (Learn more)