ALTER SUBSCRIPTION
ALTER SUBSCRIPTION
ALTER SUBSCRIPTION은 구독(subscription)의 정의를 바꾸는 명령이에요. 연결 문자열, 구독 게시 목록, 활성·비활성 상태, 구독 파라미터 등을 변경할 수 있어요.
출처: PostgreSQL 문서
본문
문법 (Synopsis)
ALTER SUBSCRIPTION name CONNECTION 'conninfo'
ALTER SUBSCRIPTION name SET PUBLICATION publication_name [, ...] [ WITH ( publication_option [= value] [, ... ] ) ]
ALTER SUBSCRIPTION name ADD PUBLICATION publication_name [, ...] [ WITH ( publication_option [= value] [, ... ] ) ]
ALTER SUBSCRIPTION name DROP PUBLICATION publication_name [, ...] [ WITH ( publication_option [= value] [, ... ] ) ]
ALTER SUBSCRIPTION name REFRESH PUBLICATION [ WITH ( refresh_option [= value] [, ... ] ) ]
ALTER SUBSCRIPTION name ENABLE
ALTER SUBSCRIPTION name DISABLE
ALTER SUBSCRIPTION name SET ( subscription_parameter [= value] [, ... ] )
ALTER SUBSCRIPTION name SKIP ( skip_option = value )
ALTER SUBSCRIPTION name OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }
ALTER SUBSCRIPTION name RENAME TO new_name
설명 (Description)
ALTER SUBSCRIPTION은 CREATE SUBSCRIPTION에서 지정할 수 있는 대부분의 구독 속성을 변경할 수 있어요.
ALTER SUBSCRIPTION을 쓰려면 구독의 소유자여야 해요. 구독 이름을 바꾸거나 소유자를 변경하려면 데이터베이스에 대한 CREATE 권한이 있어야 해요. 또한 소유자를 변경하려면 새 소유 역할로 SET ROLE 할 수 있어야 해요. 구독이 password_required=false라면 슈퍼유저만 수정할 수 있어요.
게시를 리프레시할 때 우리는 더 이상 게시의 일부가 아닌 릴레이션을 제거하고, 테이블 동기화 슬롯이 있으면 그것도 제거해요. 원격 호스트에서 구독에 할당된 리소스가 해제되도록 이 슬롯들을 제거하는 것이 필요해요. 네트워크 장애나 다른 오류 때문에 PostgreSQL이 슬롯을 제거하지 못하면 오류가 보고돼요. 이 상황에서 진행하려면 사용자가 작업을 재시도하거나, DROP SUBSCRIPTION에 설명된 대로 슬롯을 구독에서 분리하고 구독을 드롭해야 해요.
ALTER SUBSCRIPTION ... REFRESH PUBLICATION, 리프레시 옵션이 true인 ALTER SUBSCRIPTION ... {SET|ADD|DROP} PUBLICATION ..., ALTER SUBSCRIPTION ... SET (failover = true|false), ALTER SUBSCRIPTION ... SET (two_phase = false) 명령은 트랜잭션 블록 안에서 실행할 수 없어요.
ALTER SUBSCRIPTION ... REFRESH PUBLICATION과 리프레시 옵션이 true인 ALTER SUBSCRIPTION ... {SET|ADD|DROP} PUBLICATION ... 명령은, copy_data가 false가 아닌 한 구독에 two_phase 커밋이 활성화되어 있을 때도 실행할 수 없어요. 실제 2단계 상태를 알려면 pg_subscription의 subtwophasestate 컬럼을 참고하세요.
파라미터 (Parameters)
name — 속성을 변경할 구독의 이름이에요.
CONNECTION 'conninfo' — 이 절은 원래 CREATE SUBSCRIPTION으로 설정된 연결 문자열을 교체해요. 자세한 내용은 그 문서를 참고하세요.
SET PUBLICATION / ADD PUBLICATION / DROP PUBLICATION publication_name — 이 형태들은 구독된 게시 목록을 변경해요. SET은 게시 목록 전체를 새 목록으로 교체하고, ADD는 게시 목록에 게시를 추가하며, DROP은 게시 목록에서 게시를 제거해요. ADD와 SET 변형에서는 존재하지 않는 게시를 지정할 수 있어서, 사용자가 나중에 추가할 수 있게 돼요. 자세한 내용은 CREATE SUBSCRIPTION을 참고하세요. 기본적으로 이 명령은 REFRESH PUBLICATION처럼 행동하기도 해요.
publication_option은 이 작업에 대한 추가 옵션을 지정해요. 지원되는 옵션은:
refresh (boolean) — false이면 명령이 테이블 정보를 리프레시하려 하지 않아요. 이 경우 REFRESH PUBLICATION을 별도로 실행해야 해요. 기본값은 true예요.
추가로, REFRESH PUBLICATION 아래에 설명된 옵션을 지정해 암시적 리프레시 작업을 제어할 수도 있어요.
REFRESH PUBLICATION — 게시자에서 누락된 테이블 정보를 가져와요. 이것은 CREATE SUBSCRIPTION 또는 마지막 REFRESH PUBLICATION 호출 이후 구독된 게시에 추가된 테이블의 복제를 시작해요.
refresh_option은 리프레시 작업에 대한 추가 옵션을 지정해요. 지원되는 옵션은:
copy_data (boolean) — 복제가 시작될 때 구독 중인 게시의 기존 데이터를 복사할지 여부를 지정해요. 기본값은 true예요.
이전에 구독된 테이블은, 테이블의 행 필터 WHERE 절이 이후 수정되었더라도 복사되지 않아요.
copy_data = true가 origin 파라미터와 어떻게 상호작용할 수 있는지에 대한 자세한 내용은 Notes를 참고하세요.
이진 형식으로 기존 데이터를 복사하는 방법에 대한 자세한 내용은 CREATE SUBSCRIPTION의 binary 파라미터를 참고하세요.
ENABLE — 이전에 비활성화된 구독을 활성화해, 트랜잭션 끝에서 논리 복제 워커를 시작해요.
DISABLE — 실행 중인 구독을 비활성화해, 트랜잭션 끝에서 논리 복제 워커를 중지해요.
SET ( subscription_parameter [= value] [, ... ] ) — 이 절은 원래 CREATE SUBSCRIPTION으로 설정된 파라미터를 변경해요. 자세한 내용은 그 문서를 참고하세요. 변경할 수 있는 파라미터는 slot_name, synchronous_commit, binary, streaming, disable_on_error, password_required, run_as_owner, origin, failover, two_phase예요. password_required = false는 슈퍼유저만 설정할 수 있어요.
slot_name을 변경할 때, 이름이 지정된 슬롯의 failover와 two_phase 속성 값은 구독에 지정된 대응 failover·two_phase 파라미터와 다를 수 있어요. 슬롯을 만들 때는 슬롯 속성 failover와 two_phase가 구독의 대응 파라미터와 일치하는지 확인하세요. 그렇지 않으면 게시자의 슬롯이 구독 옵션이 말하는 것과 다르게 동작할 수 있어요. 예를 들어 구독의 failover 옵션이 비활성화되어 있어도 게시자의 슬롯이 스탠바이로 동기화되거나, 구독의 failover 옵션이 활성화되어 있어도 동기화가 비활성화될 수 있어요.
failover와 two_phase 파라미터는 구독이 비활성화된 상태에서만 변경할 수 있어요.
two_phase를 true에서 false로 변경할 때, 논리 복제 워커가 수행한 준비된 트랜잭션(두 단계 파라미터가 아직 true일 때의 것)이 발견되면 백엔드 프로세스가 오류를 보고해요. 게시자 노드에서 준비된 트랜잭션을 해결하거나 구독자에서 수동으로 롤백한 다음 다시 시도할 수 있어요. 특정 구독에 해당하는 논리 복제 워커가 준비한 트랜잭션은 "pg_gid_%u_%u" (파라미터: 구독 oid, 원격 트랜잭션 id xid) 형태를 가져요. 이런 트랜잭션을 수동으로 해결하려면 이름에 해당 구독 id가 들어 있는 모든 준비된 트랜잭션을 롤백해야 해요. 애플리케이션은 pg_prepared_xacts로 필요한 준비된 트랜잭션을 찾을 수 있어요. two_phase 옵션이 true에서 false로 변경된 후에는, 트랜잭션이 커밋될 때 게시자가 그 트랜잭션을 다시 복제해요.
SKIP ( skip_option = value ) — 원격 트랜잭션의 모든 변경 적용을 건너뛰어요. 들어오는 데이터가 어떤 제약을 위반하면, 해결될 때까지 논리 복제가 중지돼요. ALTER SUBSCRIPTION ... SKIP 명령을 사용하면 논리 복제 워커가 트랜잭션 안의 모든 데이터 수정 변경을 건너뛰어요. 이 옵션은 구독자에서 two_phase를 활성화해 이미 준비된 트랜잭션에는 효과가 없어요. 논리 복제 워커가 트랜잭션을 성공적으로 건너뛰거나 트랜잭션을 마치면 LSN(pg_subscription.subskiplsn에 저장)이 지워져요. 논리 복제 충돌에 대한 자세한 내용은 Section 29.7을 참고하세요.
skip_option은 이 작업에 대한 옵션을 지정해요. 지원되는 옵션은:
lsn (pg_lsn) — 논리 복제 워커가 변경을 건너뛸 원격 트랜잭션의 완료 LSN(finish LSN)을 지정해요. 완료 LSN은 트랜잭션이 커밋되거나 준비되는 LSN이에요. 개별 하위 트랜잭션 건너뛰기는 지원되지 않아요. NONE으로 설정하면 LSN을 초기화해요.
new_owner — 구독의 새 소유자 사용자 이름이에요.
new_name — 구독의 새 이름이에요.
boolean 타입의 파라미터를 지정할 때는 = value 부분을 생략할 수 있는데, 이는 TRUE를 지정하는 것과 같아요.
예제 (Examples)
구독이 구독하는 게시를 insert_only로 변경하려면:
ALTER SUBSCRIPTION mysub SET PUBLICATION insert_only;
구독을 비활성화(중지)하려면:
ALTER SUBSCRIPTION mysub DISABLE;
호환성 (Compatibility)
ALTER SUBSCRIPTION은 PostgreSQL 확장 기능이에요.
더 알아보기 (Learn more)
SET/ADD/DROP PUBLICATION은 기본적으로REFRESH PUBLICATION처럼 행동해요.refresh = false로 두면 별도로 리프레시해야 해요.REFRESH PUBLICATION과 일부 관련 명령은 트랜잭션 블록 안에서 실행할 수 없어요.failover·two_phase파라미터는 구독이 비활성화된 상태에서만 변경할 수 있어요.password_required = false는 슈퍼유저만 설정할 수 있어요.