web-dev-qa-db-fra.com

L'annulation d'un processus (AUTO) VACUUM dans PostgreSQL rend-elle tout le travail inutile?

Dans certains cas, et après avoir créé un update, insert ou delete massif à partir d'une table, j'ai commencé un VACUUM FULL ANALYZE pour vous assurer que la base de données ne se gonflait pas trop. Le faire dans une base de données de production m'a permis de découvrir que ce n'était pas une bonne idée, car je pouvais bloquer la table pendant une longue période. J'ai donc annulé le processus, peut-être essayé simplement VACUUM (pas plein) ou laissé AUTOVACUUM faire plus tard ce qu'il peut faire.

La question est: si j'arrête un VIDE ou un AUTOVACUUM "à mi-chemin", tout le traitement déjà fait est-il perdu?

Par exemple, si VACUUM a déjà trouvé 1 M de lignes mortes et que je l'arrête, toutes ces informations sont-elles perdues? VACUUM fonctionne-t-il entièrement transactionnellement ("tout ou rien", comme un très bon nombre de processus PostgreSQL)?

Si VACUUM peut être interrompu en toute sécurité sans perdre tout le travail, existe-t-il un moyen de faire fonctionner vacuum de manière incrémentielle? [Travailler pendant 100 ms, arrêter, attendre 10 ms pour permettre de ne pas bloquer le reste du monde ... et ainsi de suite]. Je sais que vous pouvez faire une partie de cela en réglant les paramètres du vide automatique, mais je pense dans le sens de pouvoir contrôler cela par programme, pour pouvoir le faire à certains moments/dans certaines conditions.


REMARQUE: Arrêter/annuler/tuer le processus signifie dans ce contexte:

  • Si vous utilisez pgAdmin, appuyez sur le bouton "Annuler la requête".
  • Si vous travaillez par programmation, appelez pg_cancel_backend ().

Je suppose que les deux sont équivalents. Je n'ai utilisé aucune commande kill au niveau du shell/système.

13
joanolo

Le travail effectué par un VIDE interrompu sera entièrement perdu, car il reviendra simplement à utiliser la version précédente de la table et jettera la version en cours de la table.

Le travail effectué par un ASPIRATEUR régulier (non-PLEIN) peut ne pas être entièrement perdu. Il nettoie les index par lots, et tous les lots qui ont été entièrement nettoyés n'auront pas besoin d'être nettoyés à nouveau. Ils devront encore être inspectés à nouveau, mais seront trouvés déjà propres la prochaine fois. Vous pouvez donc économiser de l'écriture IO qui n'aura pas besoin d'être répétée.

8
jjanes