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

#1 08/01/2018 20:41:05

e.papet
Membre

épuration pg_largeobject

Bonjour à tous,

Je souhaite une bonne et heureuses année 2018 à toute l'équipe de Postgresql.fr.

Je suis architecte logiciel et je travaille avec postgresql depuis plus de 10 ans.
Je dois trouver une solution pour récupérer de l'espace disque sur une instance postgresql en version 9.1 (qui n'est plus maintenue).
Le contexte :
- base qui a plus de 6 ans d'exploitation
- application critique pas d’interruption possible
- volume de la base 1,2 To
- table pg_largeobject 993 Go (estimation après épuration des orphelins 150 Go)
- architecture en réplication  Warm stand By

J'ai hérité du problème.
Le problème de la volumétrie est lié au fait que les images, les documents sont des champs de type LOB (je déconseille cette solution).
Les delete et update ne suppriment pas les images et les documents de la table pg_largeogbject (pas de unlink ) générant des orphelins (depuis plus de 6 ans), la volumétrie de base ne cesse de grossir.

J'ai effectué un vaccumlo sur la table pg_lrageobject ( plus de 20 heures)
J'ai effectué un test sur un autre serveur après copie physique et synchronisation de la base (rien que ça plus de 20 heures) d'un vacuumlo et un full vacuum ( plus de 40 heures), la base est passé de 1,3 Go à 300 Go.

Le  full vacuum c'est l locke la table pg_largeobject et cela n'est pas possible sur l'instance de production.
J'utilise de pg_repack pour effectuer les réorganisations avec un minimum de lock.
Mais impossible de lancé pg_repack sur la table pg_largeobject car elle ne possède pas de primary key (étonnant quand même)

Je suis à cours de solution, c'est pour cela que viens demander conseille auprès de la communauté.

Je vous remercie par avance.

Cordialement
Eric Papet

Hors ligne

#2 08/01/2018 21:12:23

gleu
Administrateur

Re : épuration pg_largeobject

Vous êtes à cours de solution parce que vous avez fait le tour de ce qui était possible. Le seul moyen est le VACUUM FULL de la table pg_largeobject malgré le temps d'immobilisation que cela vous imposera. Et après, assurez-vous que, quand une ligne est supprimée de la table utilisateur qui référence pg_largeobject, cela supprime aussi le large object. Vous pouvez utiliser un trigger pour ça si cela vous simplifie les choses.

Mais en attendant, votre seul moyen pour nettoyer la base actuelle, c'est un VACUUM FULL.


Guillaume.

Hors ligne

#3 08/01/2018 21:36:33

dverite
Membre

Re : épuration pg_largeobject

d'un vacuumlo et un full vacuum ( plus de 40 heures), la base est passé de 1,3 Go à 300 Go

Je suppose que vous vouliez dire de 1,3 To à 300 Go.

Quoiqu'il en soit effectivement les options pour dégonfler pg_largeobject sont limitées.
Par exemple il y a eu cette question  sur  la liste -general en anglais, sans alternative trouvée au VACUUM FULL.



Admettons que vacuumlo ait fait son travail, c.a.d appeler lo_unlink() avec tous les OIDs non référencés.
Pour se faire une idée, quel est après ça l'état des lieux en termes de :


- combien d'objets restent:  SELECT count(*) FROM pg_largeobject_metadata

- quelle taille utile ils font:  SELECT sum(octet_length(data)) FROM pg_largeobject

- quelle taille disque fait la table: SELECT pg_relation_size('pg_largeobject');

- quelle taille pour la table+son index: SELECT pg_total_relation_size('pg_largeobject')


Sinon pg_largeobject possède bien une clef primaire sur la valeur composite (loid, pageno), mais peut-être que ça ne convient
pas à pg_repack?

\d+ pg_largeobject
                  Table "pg_catalog.pg_largeobject"
 Column |  Type   | Modifiers | Storage  | Stats target | Description 
--------+---------+-----------+----------+--------------+-------------
 loid   | oid     | not null  | plain    |              | 
 pageno | integer | not null  | plain    |              | 
 data   | bytea   | not null  | extended |              | 
Indexes:
    "pg_largeobject_loid_pn_index" UNIQUE, btree (loid, pageno)

Hors ligne

#4 09/01/2018 15:01:30

e.papet
Membre

Re : épuration pg_largeobject

Bonjour Messieurs,

Merci pour ces réponses.
Oui c'est bien 1,3 To et 300 Go.

Concernant pg_largeobject il existe un "primary index" sur 2 champs "loid et pageno" mais cela n'est pas vue comme un primary key pour pg_repack.
J'ai posté un message sur le forum de pg_repack sans réponse pour l’instant, mais je vais orienter le prochain  post sur l'utilisation de pg_repack sur des tables possédant un unique index et pas une primary key.
Je vous tiendrai au courant des réponses de pg_repack à travers se post.

Je vous remercie encore pour ces précieuses information

@EricPapet

Hors ligne

#5 25/01/2018 19:09:40

Indaa
Membre

Re : épuration pg_largeobject

Bonjour ,

e.papet avez vous des nouvelles concernant votre problème ?

Cela m’intéresse énormément.

Merci

Hors ligne

#6 30/01/2018 17:21:26

e.papet
Membre

Re : épuration pg_largeobject

Bonjour Indaa,

Toujours pas de réponse de la part de pg_repack.
Par contre sur une copie de ma base, j'ai effectué un vaccumlo sur pg_latgeobject (24 Heures environ) sans lock et un vaccumdb sur pg_largeobject (26 heures environ) je suis passer de 1,2 To à 300 Go.

@
Eric Papet

Hors ligne

Pied de page des forums