pg_restore impiega molto più tempo di pg_dump


9

Sto regolarmente salvando e successivamente ripristinando un database PostgreSQL di piccole dimensioni, che viene utilizzato per i test. I suoi dati vengono aggiornati regolarmente a seguito di test, quindi è necessario creare un nuovo dump e i dump vengono regolarmente utilizzati per ricreare il database in uno stato ben definito.

Ho notato che il dump (usando pg_dump -Fc database) richiede solo pochi secondi, ma il ripristino ( pg_restore -d database) richiede circa un minuto. Sembra strano. Mi sarei aspettato che entrambi impiegassero circa lo stesso tempo (supponendo che entrambi i compiti siano associati a I / O).

C'è qualche problema con il ripristino? Potrei forse renderlo più veloce? O è normale che il ripristino impieghi molto più tempo del dump? (E se sì, allora perché?)

Il file di dump di solito ha circa 3-4 MiB; il DBMS è PostgreSQL V8.4, in esecuzione su un Pentium4 3GHz con 1GiB di RAM sotto Ubuntu Linux.

Risposte:


9

Il contenuto di un indice non fa parte del backup, ma solo la definizione dell'indice. E questo richiederà solo pochi byte. Quando l'indice viene creato durante il ripristino e tutti i dati vengono indicizzati, sarà molto più grande. Questo richiederà tempo, ma dipende dalla tua situazione quanto tempo.

pg_restore ha un'opzione per il ripristino simultaneo (dalla versione 8.4), usare--jobs=number-of-jobs


Interessante, grazie. C'è un modo per scaricare anche l'indice, per accelerare il ripristino (al costo di un file di dump più grande)?
sleske,

No, il contenuto dell'indice non può far parte del backup. Per un database molto piccolo come il tuo (3-4 MiB), non dovrebbe comunque essere un problema.
Frank Heikens,

Ulteriori informazioni: pg_dump non ha accesso al contenuto di un indice. pg_dump utilizza le istruzioni SELECT per ottenere tutto il contenuto delle tabelle e il contenuto delle tabelle di sistema per creare il backup. È "solo" un wrapper attorno ad alcune istruzioni SELECT e ad alcune funzioni per scrivere i risultati sul disco.
Frank Heikens,

@Frank: grazie. Non sapevo dell'implementazione di pg_dump. Nel nostro caso, accelerare il ripristino sarebbe utile, perché deve essere eseguito ripetutamente come parte dei test automatizzati, quindi ridurlo da 1 minuto per dire che 10s sarebbe di aiuto. Ma a quanto pare non è fattibile. Dovrò trovare una soluzione diversa ...
sleske,

2
@sleske potresti provare con l' approccio di backup del filesystem . Ciò dovrebbe preservare gli indici e, inoltre, probabilmente correre un po 'più veloce sia per il backup che per il ripristino
Stefano

4

Per un ripristino, il database deve fare molto lavoro aggiuntivo:

Alcune cose vengono subito in mente:

  • La scrittura è più lenta della lettura
  • L'analisi dell'input richiede tempo
  • Aggiornamento di indici e altre strutture interne
  • Mantenimento dell'integrità referenziale

Non sono sicuro se questo equivale a quella differenza di tempo, però.

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.