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.