Logical replication'da sequence değerlerini subscriber'a eşitle
PostgreSQLLogical ReplicationKomut
# Publisher'da setval betiğini üret, subscriber'da uygula (cutover'da yazmalar durdurulduktan sonra):
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> -XNe yapar?
Logical replication sequence (identity dahil) değerlerini taşımadığı için publisher'daki her sequence'ın son değerini okuyup subscriber'da aynı değeri setval ile ayarlayan komutları üretir ve doğrudan uygular.
Ne zaman kullanılır?
Logical replication ile sürüm yükseltme/migrasyon cutover'ında, uygulamayı subscriber'a yönlendirmeden hemen önce.
Dikkat
Publisher'a yazma sürerken çalıştırılırsa değerler hemen eskir ve cutover sonrası duplicate key hatası alınır; yazmaları durdurduktan sonra çalıştır veya güvenlik payı ekle. DDL de replike edilmez: şema değişikliklerini (ALTER TABLE, yeni index) iki tarafa ayrıca uygula, önce subscriber'a. pg_sequences, okuma yetkin olmayan sequence'lar için last_value'yu NULL döndürür; komutu sahip veya superuser ile çalıştır.