it-swarm.com.de

PostgreSQL beschwert sich über Shared Memory, aber Shared Memory scheint in Ordnung zu sein

Ich habe eine Art intensives Löschen und Erstellen von Schemas über einen PostgreSQL-Server durchgeführt, beschwere mich aber jetzt ..:

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

Das Problem bleibt jedoch bestehen, wenn PostgreSQL nur mit service postgresql restart Neu gestartet wird. Ich vermute, dass max_locks_per_transaction nichts tun wird.

Ich bin etwas entfremdet, weil die Fehlerbehebungslisten für diesen Fehler bei mir nicht funktionieren.

MEHR INFO 1409291350 : Einige Details fehlen, aber ich behalte das SQL-Kernergebnis.

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

Und:

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

Ihr Kommentar zum intensiven Löschen und Erstellen und die Benachrichtigung, die Sie bezüglich der Erhöhung von max_locks_per_transaction erhalten haben, deuten darauf hin, dass Sie viele Objekte löschen und erstellen in derselben Transaktion. Jedes dieser Elemente führt zu einer Sperre, für die jeweils eine geringe Menge an gemeinsam genutztem Speicher erforderlich ist. Aus diesem Grund begrenzt max_locks_per_transaction die Anzahl der Sperren, die Sie innerhalb einer Transaktion halten können (um zu verhindern, dass eine Transaktion den gesamten gemeinsam genutzten Speicher verwendet).

Sie können dieses Limit entweder ein wenig erhöhen (ich würde empfehlen, es nicht beliebig groß einzustellen, oder Sie werden in eine separate Situation geraten, in der der gesamte gemeinsam genutzte Speicher knapp wird) oder Ihre Drops und Erstellungen entweder in Stapel von Transaktionen oder als ein Drop ausführen/pro Transaktion erstellen.

Edit: Anscheinend habe ich mich geirrt, wie max_locks_per_transaction funktioniert. Aus der Dokumentation geht hervor, dass die Gesamtzahl der verfügbaren Sperren max_locks_per_transaction * (max_connections + max_prepared_transactions) ist. Jede Transaktion kann mehr als max_locks_per_transaction enthalten, solange die Anzahl der überall gehaltenen Sperren unter diesem Gesamtwert liegt.

11
yieldsfalsehood