PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 28/01/2014 12:18:47

assadi
Membre

Maintenance

Bonjour,

Un de mes utilisateurs à effectué un VACUUM FULL sur sa base ce matin et j'ai constaté au niveau des logs
que plus personnes ne pouvaient se connecter à leur base.

Un postgresql:
- base 1
- base 2
- base n

__logs__
> debut du vacuum full
944822 2014-01-28 07:38:11 GMT [11285]: [3­1] xx.xx.xx.xx.xx user=userbase1,db=base 1LOG:  process 11285 still waiting for AccessExclusiveLock on relation 1260 of database 0 after 1000.044 ms
944823 2014-01-28 07:38:11 GMT [11285]: [4­1] xx.xx.xx.xx.xx user=userbase1,db=base 1 STATEMENT:  VACUUM FULL VERBOSE

> ensuite d'autres users tente de se connecter
944829 2014-01-28 07:38:12 GMT [11294]: [2­1] host_distant user=userbase2,db=base 2 LOG:  process 11294 still waiting for AccessShareLock on relation 1260 of database 0 after 1000.287 ms
944830 2014-01-28 07:38:12 GMT [11295]: [2­1] host_distant user=userbase2,db=base 2 LOG:  process 11295 still waiting for AccessShareLock on relation 1260 of database 0 after 1000.148 ms
944865 2014-01-28 07:39:11 GMT [11294]: [3­1] host_distant user=userbase2,db=base 2 FATAL:  canceling authentication due to timeout
--
le user de la base 1 n'est pas admin et ne peux se connecter qu'à sa base...

questions:
Qu'est ce que la database 0 ?
Est ce conseillé de faire un vacuum full sur une base ?
ou doit ton effectuer table par table ?

Merci,

Hors ligne

#2 28/01/2014 13:37:28

gleu
Administrateur

Re : Maintenance

Voici ce qu'il se passe. Vous lancez VACUUM FULL. Ce dernier réclame des verrous en accès exclusifs sur toutes les tables, dont pg_authid (OID 1260). Or cette dernière doit être bloquée par un autre processus. Les autres utilisateurs ne peuvent pas se connecter car, lorsque PostgreSQL essaie de lire la table pg_authid à la connexion, il ne peut pas vu que le VACUUM FULL a demandé un verrou exclusif. Bref, tout le monde est bloqué.

Il faudrait savoir qui bloque le VACUUM FULL. Un "SELECT pid FROM pg_locks WHERE relation=1260 AND granted" nous donnerait le pid, puis un "SELECT * FROM pg_stat_activity WHERE pid=<no_pid_precedente_requete>" nous indiquerait les infos sur la session bloquante (à noter que la colonne s'appelle peut-être procpid pour cette dernière requête si votre version de PostgreSQL est une 9.2 ou antérieure.


Guillaume.

Hors ligne

#3 28/01/2014 18:08:10

assadi
Membre

Re : Maintenance

Merci,

Si le problème se reproduit j'executerai la requête.

aat

Hors ligne

#4 29/01/2014 00:16:44

assadi
Membre

Re : Maintenance

Re:Bonjour,

J'ai reussi à reproduire le cas:
Ce matin j'avais un dump en cours + l'execution manuel par un user d'un vaccuum full.
Encore merci,

Hors ligne

#5 29/01/2014 00:22:15

assadi
Membre

Re : Maintenance

Re: du coup
je me demande comment protéger mon serveur de prod.
interdire des actions de dump de 8h30 à 22h est ce possible ?

Cdt,

Hors ligne

#6 29/01/2014 01:12:20

gleu
Administrateur

Re : Maintenance

Un dump via pg_dump ? normal, ça pose des verrous en accès partagé, incompatible avec les verrous en accès exclusif du VACUUM FULL, et du coup tout le monde reste bloqué derrière.

Pour l'interdiction, ça ne peut être qu'une règle interne. Mais la vraie bonne question est : pourquoi voulez-vous utiliser VACUUM FULL ?


Guillaume.

Hors ligne

#7 29/01/2014 11:09:22

assadi
Membre

Re : Maintenance

Bonjour,

Il a effectué un Vac full pour rentre l'espace disque au system !
bref il ne savait pas qu'en detruisant une table l'espace était rendu au system !

Assadi,

Hors ligne

Pied de page des forums