Ich habe ein intensives Schema-Löschen und -Erstellen über einen PostgreSQL-Server durchgeführt, beklage mich aber jetzt.
WARNING: out of shared memory
ERROR: out of shared memory
HINT: You might need to increase max_locks_per_transaction.
Aber das Problem bleibt, wenn PostgreSQL nur mit neu gestartet wird service postgresql restart
, ich vermute, dass max_locks_per_transaction nichts tunen wird.
Ich bin ein bisschen entfremdet, weil die Fehlerbehebungslisten für diesen Fehler bei mir nicht funktionieren.
MEHR INFO 1409291350: Einige Details fehlen, aber ich behalte das Kern-SQL-Ergebnis.
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
postgresql
schema
memory
48347
quelle
quelle
SELECT version()
? Interessantes Problem ...max_locks_per_transaction = 64 # min 10
Bisher habe ich in /etc/postgresql/9.3/main/postgresql.conf keine Kommentare abgegeben.Antworten:
Ihr Kommentar zum intensiven Löschen und Erstellen und der Hinweis, dass Sie max_locks_per_transaction erhöhen, deuten darauf hin, dass Sie viele Objekte in derselben Transaktion löschen und erstellen . Jedes von diesen führt zu einer Sperre, die jeweils eine kleine Menge gemeinsam genutzten Speichers erfordert. 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 belegt).
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 nicht mehr ausreicht), oder Sie können Ihre Löschvorgänge ausführen und entweder in Stapeln von Transaktionen oder als ein Tropfen erstellen / 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.
quelle
DROP SCHEMA IF EXISTS public CASCADE; CREATE SCHEMA public
den Sätzen WARNING, ERROR und HINT.