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

13

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
48347
quelle
2
PostgreSQL-Version von SELECT version()? Interessantes Problem ...
Craig Ringer
2
"Ich vermute, max_locks_per_transaction wird nichts tunen." - Warum vermuten Sie das? Haben Sie versucht, dem Vorschlag des Hinweises tatsächlich zu folgen?
Josh Kupershmidt
Haben Sie versucht, dem Vorschlag des Hinweises tatsächlich zu folgen? max_locks_per_transaction = 64 # min 10Bisher habe ich in /etc/postgresql/9.3/main/postgresql.conf keine Kommentare abgegeben.
29.
1
Die Standardeinstellung für max_locks_per_transaction ist zu Beginn 64. Wenn Sie diese Zeile aus dem Kommentar entfernen, wird sie nicht effektiv geändert.
Erträge Falsehood
1
OK, eine effektive Erhöhung auf 128 löste das Problem und ermöglichte die Fortsetzung des Vorgangs.
29.

Antworten:

11

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.

Ertragsfalschheit
quelle
Mein Arbeitsablauf umfasst (1) das Ablegen eines Schemas X, (2) das Löschen eines anderen Schemas Y und (3) das Wiederherstellen von X für den Schemanamen Y. Wie ich bereits sagte, habe ich diese Aktivitäten bis heute über mehrere Wochen durchgeführt und heute der Schritt (2) schlägt fehl. Schritt (2) besteht hauptsächlich aus DROP SCHEMA IF EXISTS public CASCADE; CREATE SCHEMA publicden Sätzen WARNING, ERROR und HINT.
29.
Durch das Verdoppeln der maximalen Anzahl von Sperren von 64 auf 128 konnte der Workflow fortgesetzt werden. Ich habe noch nicht alle Interna, aber ich vermute, dass das Festlegen zwischen den Sätzen DROP SCHEMA und CREATE SCHEMA eine ähnliche lindernde Wirkung hat.
29.
Jetzt ist mir klar, dass ich viele Tage eine kleine Schemaerhöhung erhalte, und dieses Problem passt perfekt zu einer dieser kleinen Schemaerhöhungen . Als allgemeine Strategie werde ich von nun an mehr Rücksicht auf TIPPS nehmen.
29.