Logical replication ile neredeyse kesintisiz major sürüm yükseltmesi
PostgreSQLUpgradeKomut
# 0) Eski sürümde wal_level = logical (restart); tüm tablolarda PRIMARY KEY veya REPLICA IDENTITY olmalı
# 1) Rolleri ve şemayı yeni sürüme taşı ('role postgres already exists' hatası beklenir):
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) Eski sürümde publication, yeni sürümde subscription (ilk kopya + sürekli akış):
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) Tüm tablolar 'r' (ready) olana ve lag ~0 olana kadar bekle:
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: uygulama yazmalarını durdur, lag = 0 doğrula, sequence'ları eşitle (logical-sync-sequences)
# 5) Subscription'ı kaldır (uzak slot da silinir), uygulamayı yeni sunucuya yönlendir:
psql -h <new_host> -d <db> -X -c "DROP SUBSCRIPTION upg_sub;"Ne yapar?
Yeni sürümde boş bir küme kurup şemayı taşır, eski sürümden logical replication ile veriyi sürekli akıtır; yalnızca son cutover adımında (yazmaları durdurma, sequence eşitleme, yönlendirme) kısa bir kesinti olur. Ters yönde ikinci bir replikasyonla geri dönüş yolu da açık tutulabilir.
Ne zaman kullanılır?
pg_upgrade'in gerektirdiği kesintinin kabul edilemediği, farklı donanıma/OS'e geçişin de aynı anda yapıldığı veya birden çok major sürüm atlanan yükseltmelerde.
Dikkat
DDL, sequence, large object ve materialized view içeriği replike edilmez; geçiş süresince şema dondurulmalı. Primary key/replica identity'si olmayan tablolarda UPDATE/DELETE publisher'da hata verir. Büyük veritabanlarında ilk kopya uzun sürer ve eski sunucuda WAL ile catalog_xmin tutar. Database başına ayrı publication/subscription gerekir. Cutover öncesi satır sayısı/checksum karşılaştırması yap.