DBAtlas · 데이터베이스 운영 아틀라스

logical replication에서 시퀀스 값을 subscriber로 동기화

PostgreSQL논리 복제

명령어

# Generate the setval script on the publisher and apply it on the subscriber (at cutover, after writes are stopped):
psql -h <publisher_host> -d <db> -XAtc "SELECT format('SELECT setval(%L, %s, %s);', quote_ident(schemaname) || '.' || quote_ident(sequencename), COALESCE(last_value, start_value), (last_value IS NOT NULL)::text) FROM pg_sequences;" | psql -h <subscriber_host> -d <db> -X

하는 일

logical replication은 시퀀스(identity 포함) 값을 전달하지 않으므로, publisher에서 모든 시퀀스의 마지막 값을 읽어 subscriber에 같은 값을 설정하는 setval 명령을 생성하고 직접 적용한다.

사용 시점

logical replication을 이용한 업그레이드/마이그레이션 전환 시, 애플리케이션을 subscriber로 전환하기 직전에.

주의

publisher가 아직 쓰기를 받는 동안 실행하면 값이 즉시 낡아 전환 후 중복 키 오류가 발생한다. 쓰기를 중지한 후 실행하거나 안전 여유를 더한다. DDL도 복제되지 않으므로 스키마 변경(ALTER TABLE, 새 인덱스)은 양쪽에 별도로, subscriber부터 적용한다. pg_sequences는 읽을 수 없는 시퀀스의 last_value를 NULL로 반환하므로 소유자나 superuser로 명령을 실행한다.

DBAtlas에서 열기 →

관련 항목