Soru PostgreSQL ERROR: kurtarma ile çakışma nedeniyle iptal bildirimi


Bekleme modunda PostgreSQL db üzerinde bir sorgu çalıştırırken aşağıdaki hatayı alıyorum. Hataya neden olan sorgu 1 ay boyunca iyi çalışır, ancak 1 aydan fazla sorguladığınızda bir hata oluşur.

ERROR: canceling statement due to conflict with recovery
Detail: User query might have needed to see row versions that must be removed

Nasıl çözüleceğine dair herhangi bir öneriniz var mı? Teşekkürler


76
2018-01-29 21:15


Menşei




Cevaplar:


Hot-standby sunucusunda sorguları çalıştırmak biraz zor - başarısız olabilir, çünkü sorgulama sırasında bazı gerekli satırlar birincil olarak güncellenebilir veya silinebilir. Birincil olarak, bir sorgunun ikincil olarak başlatıldığını bilmediğinden, satırlarının eski sürümlerini temizleyebildiğini (vakumlu) düşünür. Daha sonra sekonder bu temizleme işlemini tekrarlamalı ve bu satırları kullanabilecek tüm sorguları zorla iptal etmelidir.

Daha uzun sorgular daha sık iptal edilir.

Gerçek bir sorgu ikincil olarak çalıştırılırken, kukla bir sorgu yapan ve daha sonra boşta kalan birincil üzerinde tekrarlanabilir bir okuma işlemi başlatarak bu konuda çalışabilirsiniz. Onun varlığı birincil satır versiyonlarının primer üzerinde vakumlanmasını engelleyecektir.

Bu konuda daha fazla ve diğer geçici çözümler Hot Standby - Sorgu Çatışmaları İşleme belgelerdeki bölüm.


48
2018-01-29 23:51



PostgreSQL 9.1+ kullanıcıları için: bkz. eradmanPratik bir çözüm için aşağıda cevap. - Zoltán


Master'da boşta işlem yapmaya gerek yoktur. Postgresql-9.1’de Bu sorunu çözmek için en doğrudan yol

hot_standby_feedback = on

Bu, master'ı uzun süredir devam eden sorgulardan haberdar edecektir. İtibaren docs:

İlk seçenek, engelleyen hot_standby_feedback parametresini ayarlamaktır.   VACUUM son zamanlarda ölü satırları kaldırır ve bu yüzden temizleme çakışmaları olmaz.

Bu neden varsayılan değil? Bu parametre başlangıçtan sonra eklendi Uygulama ve bir beklemenin bir efendiyi etkileyebilmesinin tek yolu budur.


56
2018-02-10 19:34



Bu param, bekleme modunda ayarlanmalıdır. - Steve Kehlet
Bu durumda master için bazı dezavantajlar vardır Sıcak Bekleme-Geribildirim - Eugene Liskovets
Cevabımı kontrol et, bu iyi bir uygulama değil gibi görünüyor - Gilles Quenot


Belirtildiği gibi İşte hakkında hot_standby_feedback = on :

Bunun dezavantajı, beklemenin ustayı şişirmesidir.   bazı insanlar için de şaşırtıcı olabilir

Ve İşte:

Max_standby_streaming_delay öğesinin hangi ayarı var? Tercih ederim   Varsayılan olarak, varsayılan hot_standby_feedback açıktan -1'e kadar. Bu şekilde ne   Bekleme durumunda sadece bekleme durumunu etkiler


Ben de ekledim

max_standby_streaming_delay = -1

Ve daha fazla yok pg_dump bizim için hata, ne de usta bloat :)


37
2017-10-22 13:58



@lennard, bu benim için çalıştı. Bu yapılandırmayı kölenin postgresql.conf dosyasına ekledim, ardından köleyi yeniden başlattım. - Ardee Aram
Elbette sınırsız çoğaltma gecikmesi bu şekilde olabilir. Ve çoğaltmayı master'a bağlamak için bir çoğaltma yuvası kullanıyorsanız, bu, master üzerinde aşırı xlog tutma ile sonuçlanabilir, bu nedenle WAL arşivlemeyi kullanıyorsanız yalnızca gerçekten geçerlidir. - Craig Ringer
Bunu AWS RDS'de nasıl ayarladınız? - Kris MP
@KrisMP psql kullan - Yehonatan
Parametre grubunda @KrisMP - docs.aws.amazon.com/AmazonRDS/latest/UserGuide/... - r3m0t


Dokunmaya gerek yok hot_standby_feedback. Diğerleri belirttiği gibi, on ustayı şişirebilir. Bir köle üzerinde açılış işlemini düşünün ve kapatmayın.

Bunun yerine max_standby_archive_delay ve max_standby_streaming_delay bazı aklı değerlerine

# /etc/postgresql/10/main/postgresql.conf on a slave
max_standby_archive_delay = 900s
max_standby_streaming_delay = 900s

Bu şekilde, 900 saniyeden daha kısa bir süre zarfında köle sorguları iptal edilmeyecektir. İş yükünüz daha uzun sorgu gerektiriyorsa, bu seçenekleri daha yüksek bir değere ayarlamanız yeterlidir.


15
2017-12-05 19:33





Uzun bekleme sorgusu çalışırken, sıcak bekletme bağımlı sunucusundaki tablo verileri değiştirilir. Tablo verilerinin değiştirilmediğinden emin olmak için bir çözüm (PostgreSQL 9.1+), çoğaltmayı askıya almak ve sorgudan sonra devam etmektir:

select pg_xlog_replay_pause(); -- suspend
select * from foo; -- your query
select pg_xlog_replay_resume(); --resume

4
2017-10-05 08:56



Bu süper kullanıcı hakları gerektirir. Bu yüzden bazı durumlarda bir çözüm olmayabilir. - Joao Baltazar