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

logical replication으로 거의 무중단 메이저 버전 업그레이드

PostgreSQL업그레이드

명령어

# 0) On the old version wal_level = logical (restart); every table needs a PRIMARY KEY or REPLICA IDENTITY
# 1) Move roles and schema to the new version (a 'role postgres already exists' error is expected):
pg_dumpall -h <old_host> --globals-only | psql -h <new_host> -X -d postgres
pg_dump -h <old_host> --schema-only --create -d <db> | psql -h <new_host> -X -d postgres
# 2) Publication on the old version, subscription on the new version (initial copy + continuous stream):
psql -h <old_host> -d <db> -X -c "CREATE PUBLICATION upg_pub FOR ALL TABLES;"
psql -h <new_host> -d <db> -X -c "CREATE SUBSCRIPTION upg_sub CONNECTION 'host=<old_host> dbname=<db> user=<repl_user>' PUBLICATION upg_pub;"
# 3) Wait until all tables are 'r' (ready) and lag is ~0:
psql -h <new_host> -d <db> -X -c "SELECT srsubstate, count(*) FROM pg_subscription_rel GROUP BY 1;"
psql -h <old_host> -d <db> -X -c "SELECT slot_name, pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), confirmed_flush_lsn)) AS lag FROM pg_replication_slots WHERE slot_name = 'upg_sub';"
# 4) Cutover: stop application writes, confirm lag = 0, synchronize sequences (logical-sync-sequences)
# 5) Drop the subscription (the remote slot is dropped too), point the application to the new server:
psql -h <new_host> -d <db> -X -c "DROP SUBSCRIPTION upg_sub;"

하는 일

새 버전으로 빈 클러스터를 만들고 스키마를 옮긴 후 logical replication으로 이전 버전에서 데이터를 지속적으로 스트리밍한다. 최종 전환 단계(쓰기 중지, 시퀀스 동기화, 리디렉션)만 짧은 중단을 일으킨다. 역방향의 두 번째 복제로 롤백 경로를 열어 둘 수 있다.

사용 시점

pg_upgrade가 요구하는 중단을 허용할 수 없을 때, 새 하드웨어/OS로 동시에 이전할 때, 여러 메이저 버전을 건너뛸 때.

주의

DDL, 시퀀스, large object, materialized view 내용은 복제되지 않으므로 마이그레이션 중에는 스키마를 동결한다. primary key/replica identity가 없는 테이블에서는 publisher의 UPDATE/DELETE가 실패한다. 대형 데이터베이스에서는 초기 복사가 오래 걸리며 이전 서버에 WAL과 catalog_xmin을 붙잡는다. 데이터베이스마다 별도의 publication/subscription이 필요하다. 전환 전에 행 수/checksum을 비교한다.

DBAtlas에서 열기 →

관련 항목