L'annullamento di un processo (AUTO) VACUUM in PostgreSQL rende tutto il lavoro inutile?


13

In alcune occasioni, e dopo aver fatto un grosso update, inserto deleteda un tavolo, ho iniziato VACUUM FULL ANALYZEa assicurarmi che il DB non si stesse gonfiando troppo. Farlo in un database di produzione mi ha fatto scoprire che questa non era una buona idea, perché avrei potuto bloccare la tabella per un lungo periodo di tempo. Quindi, ho annullato il processo, forse ho provato solo VACUUM(non completo) o lasciato AUTOVACUUMfare dopo tutto ciò che può fare.

La domanda è: se interrompo un VACUUM o AUTOVACUUM "a metà strada", tutta l'elaborazione è già stata persa?

Ad esempio, se VACUUMho già trovato 1 M di file morte e lo interrompo, tutte queste informazioni vengono perse? VACUUM funziona in modo completamente transazionale ("tutto o niente", come un ottimo numero di processi PostgreSQL)?

Se VACUUM può essere interrotto in modo sicuro senza perdere tutto il lavoro, c'è un modo per farlo in modo vacuumincrementale? [Lavora per 100 ms, fermati, attendi 10 ms per consentire di non bloccare il resto del mondo ... e così via]. So che puoi fare parte di questo sintonizzando i parametri di autovacuum, ma sto pensando di essere in grado di controllarlo a livello di programmazione, di essere in grado di farlo in determinati momenti / a determinate condizioni.


NOTA: interrompere / annullare / terminare il processo significa in questo contesto:

  • Se si utilizza pgAdmin, premere il pulsante "Annulla query".
  • Se funziona a livello di codice, chiama pg_cancel_backend ().

Presumo che entrambi siano equivalenti. Non ho usato alcun comando kill a livello di shell / sistema.

Risposte:


8

Il lavoro svolto da un VACUUM FULL interrotto andrà completamente perso, poiché tornerà semplicemente all'utilizzo della versione precedente della tabella e getterà via la versione in corso della tabella.

Il lavoro svolto da un VUOTO normale (non COMPLETO) potrebbe non essere completamente perso. Pulisce gli indici in lotti e tutti i lotti che sono stati completamente puliti non dovranno essere ripuliti. Dovranno comunque essere ispezionati di nuovo, ma saranno trovati già puliti la prossima volta. Quindi potresti salvare alcuni IO di scrittura che non dovranno essere ripetuti.


1
Mi piacerebbe avere maggiori dettagli su questo, in particolare sull'autovacuum. Ho server occupati con molti database e talvolta l'autovacuum può richiedere molto tempo. Quando ciò accade, la creazione di un nuovo indice, ad esempio, è impossibile perché l'autovacuum ha un blocco. In alcuni casi sarebbe l'ideale uccidere l'autovacuum e applicare l'indice e, si spera, quando l'autovacuum funziona di nuovo non deve funzionare per quasi il tempo. Un modo per vedere i dettagli di ciò che l'autovacuum ha fatto / sta facendo a una tabella e agli indici?
Kurt Koller,

3
9.6 ha introdotto una vista per monitorare l'avanzamento del vuoto: postgresql.org/docs/current/static/progress-reporting.html . Non ci ho giocato da solo, quindi non so quanto funzionerà bene per te. Il vuoto automatico dovrebbe cedere automaticamente alla serratura, a meno che non venga fatto per il riavvolgimento. Le impostazioni predefinite per l'autovacuum sono fortemente rallentate, quindi potrebbe non funzionare più velocemente la volta successiva solo perché viene strozzato alla stessa velocità. Ho impostato abitualmente vacuum_cost_page_hite vacuum_cost_page_missa zero.
jjanes,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.