PostgreSQL paylaşılan hafızadan şikayet ediyor, ancak paylaşılan hafıza iyi görünüyor


13

Bir tür yoğun şema bırakma ve bir PostgreSQL sunucusu üzerinde oluşturma gerçekleştiriyorum, ama şimdi şikayet ..

WARNING:  out of shared memory
ERROR:  out of shared memory
HINT:  You might need to increase max_locks_per_transaction.

Ancak PostgreSQL ile yeniden başlatılırsa sorun devam ediyor service postgresql restart, max_locks_per_transaction'ın hiçbir şeyi ayarlamayacağından şüpheleniyorum.

Bu hatanın sorun giderme listeleri benim için çalışmadığı için biraz yabancıyım.

Daha fazla bilgi 1409291350: Bazı ayrıntılar eksik ama çekirdek SQL sonucu tutmak.

postgres=# SELECT version();
PostgreSQL 9.3.5 on x86_64-unknown-linux-gnu, compiled by gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2,
 64-bit

Ve:

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 14.04.1 LTS
Release:        14.04
Codename:       trusty

2
PostgreSQL sürümü SELECT version()? İlginç bir sorun ...
Craig Ringer

2
"Ben max_locks_per_transaction hiçbir şey ayarlamak olmaz şüpheli." - Ah, bundan neden şüphelenesin? Aslında ipucunun önerisini izlemeyi denediniz mi?
Josh Kupershmidt

Aslında ipucunun önerisini izlemeyi denediniz mi? max_locks_per_transaction = 64 # min 10Şimdiye kadar /etc/postgresql/9.3/main/postgresql.conf ' da uncommented .
48347

1
Varsayılan max_locks_per_transaction başlangıç ​​olarak 64'tür - bu satırın etkinleştirilmemesi onu etkili bir şekilde değiştirmedi.
givesfalsehood

1
Tamam 128'e etkili bir artış sorunu çözdü , aslında operasyonun devam etmesine izin verdi.
48347

Yanıtlar:


11

Yoğun bırakma ve oluşturma hakkındaki yorumunuz ve aynı işlemde bıraktığınız ve çok sayıda nesne oluşturduğunuz maks_locks_per_transaction ipucunu artırmayla ilgili olarak aldığınız bildirim . Bunların her biri, her biri az miktarda paylaşılan bellek gerektiren bir kilitle sonuçlanır. Bu nedenle, max_locks_per_transaction bir işlem içinde tutabileceğiniz kilit sayısını sınırlar (herhangi bir işlemin tüm paylaşılan belleği kullanmasını önlemek için).

Ya bu limiti biraz artırabilirsin (keyfi olarak ayarlamaya karşı öneriyorum ya da toplam paylaşılan belleğin tükenmesi için ayrı bir duruma gireceksiniz) ya da damlalarınızı yapın ve işlem kümelerinde ya da bir damla olarak oluşturun / işlem başına oluştur.

Düzenleme: Görünüşe göre max_locks_per_transaction nasıl çalıştığı hakkında yanılmışım. Dokümantasyondan, mevcut kilit sayısı max_locks_per_transaction * (max_connections + max_prepared_transactions) - her yerde tutulan kilit sayısı bu toplam değerden az olduğu sürece herhangi bir işlem max_locks_per_transaction değerinden daha fazla tutabilir.


İş akışım (1) bir X şemasını boşaltmak, (2) başka bir Y şemasını atmak ve (3) Y şema adı üzerinde X'i geri yüklemek. adım (2) başarısız oluyor. Adım (2) esas olarak DROP SCHEMA IF EXISTS public CASCADE; CREATE SCHEMA publicbunlardan oluşur , bunlar UYARI, HATA ve İPUCU atan cümlelerdir.
48347

Maksimum kilitlerin 64 ile 128 arasında iki katına çıkarılması, iş akışının devam etmesini sağladı. Iv henüz tüm içsellere sahip değil, ama sanırım DROP SCHEMA ve CREATE SCHEMA cümleleri arasında işlem yapmak benzer bir rahatlatıcı etkiye sahip olacak.
48347

Şimdi günlerce küçük bir şema artışı elde ettiğimi fark ediyorum ve bu sorun bu küçük şema artışlarından biriyle mükemmel bir şekilde eşleşiyor . Genel bir strateji olarak bundan böyle HINT'leri daha fazla dikkate alacağım.
48347
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.