web-dev-qa-db-fra.com

PostgreSQL se plaint de la mémoire partagée, mais la mémoire partagée semble être OK

J'ai effectué une sorte de suppression et de création de schéma intensive sur un serveur PostgreSQL, mais se plaint maintenant ..:

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

Mais le problème persiste si PostgreSQL vient d'être redémarré avec service postgresql restart, Je pense que max_locks_per_transaction ne réglera rien.

Je suis un peu éloigné parce que les listes de dépannage pour cette erreur ne fonctionnent pas pour moi.

PLUS D'INFO 1409291350: Quelques détails manquants mais je garde le résultat SQL de base.

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

Et:

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

Votre commentaire sur la suppression et la création intensives et l'avis que vous avez reçu concernant l'augmentation de max_locks_per_transaction, indiquant que vous supprimez et créez de nombreux objets dans la même transaction. Chacun de ces résultats dans un verrou, qui nécessite chacun une petite quantité de mémoire partagée. Pour cette raison, max_locks_per_transaction limite le nombre de verrous que vous pouvez détenir dans une transaction (pour empêcher une transaction d'utiliser toute la mémoire partagée).

Vous pouvez soit augmenter légèrement cette limite (je vous déconseille de la fixer arbitrairement ou vous vous retrouverez dans une situation distincte de manque de mémoire partagée totale), soit effectuer vos suppressions et créer soit par lots de transactions, soit en une seule suppression./créer par transaction.

Edit: Apparemment, je me trompais sur le fonctionnement de max_locks_per_transaction. D'après la documentation, le nombre total de verrous disponibles est max_locks_per_transaction * (max_connections + max_prepared_transactions) - toute transaction peut contenir plus de max_locks_per_transaction, tant que le nombre de verrous détenus partout est inférieur à cette valeur totale.

11
yieldsfalsehood