È possibile creare / ripristinare rapidamente gli snapshot del database con PostgreSQL?


52

Prima di tutto, sono uno sviluppatore, non un DBA o un amministratore di sistema; per piacere sii gentile :)

Sto lavorando a un flusso di lavoro dell'applicazione in cui un'azione di un singolo utente attiverà modifiche complesse nel database: la creazione di centinaia di record in alcune tabelle, l'aggiornamento di centinaia di record in altri, ecc. Tutto sommato, circa 12 tabelle (su ~ 100 ) sono toccati da questa azione. A causa della complessità, è molto difficile per me ripristinare manualmente tutte le modifiche prima di poter eseguire un altro test. Durante la maggior parte del mio tempo di sviluppo, posso semplicemente inserire un'istruzione "ROLLBACK" verso la fine del flusso di lavoro, ma quando mi avvicino al commit delle modifiche, devo testare la realtà.

Ho una copia locale del database di produzione con cui lavorare. Nel mio caso, scaricare e ripristinare tra i test è più veloce della scrittura di uno script per annullare tutte le modifiche. È più veloce, ma mi sta ancora rallentando molto (il ripristino richiede circa 20 minuti sul mio vecchio laptop). Esiste un modo per salvare un'istantanea dello stato corrente del database e ripristinarlo rapidamente?

Sono sicuro di essere l'unico utente sul sistema e ho accesso come root. Il dump del database è ~ 100 MB quando viene tarato e decompresso. La versione PostgreSQL è 8.3.

Grazie in anticipo per eventuali idee utili.


Dici di avere il dump del database, non è sufficiente? Testa il tuo sistema, se isomething va storto, usa il dump per riportare il DB al suo stato originale e continuare lo sviluppo.
DrColossos,

1
Stai ripristinando solo le tabelle che sono cambiate?
Jack Douglas,

1
@ Jack Douglas: sto ripristinando l'intero dump dalla discarica. Le tabelle in questione costituiscono circa i 2/3 dei dati e dovrei comunque preoccuparmi del corretto ordine di ripristino e delle restrizioni delle chiavi esterne.
Zilk,

1
@DrColossus: sì, i dump sono sufficienti per ripristinare lo stato precedente, ma crearli e applicarli è molto lento.
Zilk,

Risposte:


35

È possibile utilizzare snapshot a livello di file system, ma spesso è piuttosto ingombrante, richiede file system speciali e non è sempre disponibile, soprattutto su laptop obsoleti. ;-)

Che ne dici di creare il tuo stato di base come database e quindi creare un nuovo database da esso per l'esecuzione del test, utilizzando la CREATE DATABASE ... TEMPLATEfunzionalità. Dopo il test, butti via quel database. Quindi il tuo limite di velocità è essenzialmente solo il tempo alla cp -Rdirectory del database. È più veloce di quanto otterrai senza la magia dell'istantanea del file system.


Questa è un'ottima idea. Non avevo pensato ai modelli di database. Grazie!
Zilk,

1
Questa è un'ottima soluzione, 5 volte più veloce di drop-restore ma ha un lato negativo: è necessario eliminare le connessioni correnti prima di farlo, altrimenti non funzionerà.
sorin

Aggiornamento: questo non funzionerà in produzione perché il database di origine avrà connessioni ad esso. Abbiamo bisogno di un'altra soluzione.
sorin

11

Usa Stellar , è come git per i database:

Stellar ti consente di ripristinare rapidamente il database quando, ad esempio, stai scrivendo migrazioni di database, cambiando filiali o inviando messaggi con SQL. PostgreSQL e MySQL (parzialmente) sono supportati.



liquibase non lo supporta come Stellar, dove è possibile lavorare con il database (ad es. nei test unitari) e potrebbe essere necessario eseguire il rollback a uno stato o orario con tag precedente.
Andreas Dietrich,

Stellar sembra un'ottima idea, ma non funziona per me
Orlando,

5

Se il tuo database viene eseguito in Virtualbox , puoi facilmente salvare le istantanee e ripristinare le istantanee dello stato del database e del sistema operativo stesso in pochi secondi (o 1-2 minuti se hai davvero molti dati nel database o nel sistema operativo o molto poca memoria allocata alla macchina virtuale) gratuitamente.

Nella tua / maggior parte dei casi, sarebbe meglio installare un Linux leggero (piuttosto che un server Windows) per eseguire la macchina virtuale in cui è ospitato il database dato che hai menzionato che hai poche risorse disponibili sul tuo laptop.


Sul sito di produzione, utilizzo i backup di snapshot di MediaTemple per ottenere lo stesso risultato (ma è 20 $ per slot di backup e specifico per quel servizio di web hosting, quindi potrebbe non adattarsi a te).


Ah non importa, non ho visto il tuo commento che menziona che già conosci su virtualbox.
Wildpeaks

3

Probabilmente non è la risposta che speri, ma hai preso in considerazione un livello inferiore di snapshot, ad esempio LVM?


Sì, mi è venuto in mente. Sfortunatamente, le istantanee del filesystem non sono supportate da FS che sto attualmente usando (ext3). Un'altra opzione sarebbe quella di impostare una VM come Virtualbox per le esecuzioni di test.
Zilk,

2

Ho trovato questa domanda quando ho provato a fare lo stesso e ho finito per usare git nella directory dei dati postgresql. Annullare le modifiche è semplice come:

git reset --hard

6
Questo non serve a grandi database. Inoltre, perché torturare git con file binari di varie dimensioni?
RolandoMySQLDBA

0

Un'altra opzione che potrebbe essere sperimentata sarebbe quella di salvare effettivamente una copia della directory dei dati postgresql, quindi riscrivere la directory esistente con la copia quando si desidera ripristinarla. Richiederà più spazio sul disco, ma sarà sicuramente più veloce del ripristino da un backup. Non sono sicuro se questo sarebbe più veloce del metodo template, quindi sarebbe una buona idea fare alcuni test, prima.


0

Anche se devo dire Stellarche git reset --hardè una soluzione interessante, avrò un problema con database e test più grandi, e utilizzo le Virtualboxsoluzioni ecc., Tuttavia, nei test più grandi, questi diventano un po 'più "problematici" quando si stanno usando soluzioni di metallo nudo ecc.

Quindi DEVO menzionare ZFScome filesystem da considerare in futuro per questi motivi per i seguenti motivi che anche @Peter Eisentraut ha menzionato:

  1. Istantanee - specialmente quando si esegue la replica da Prod a QA / DR, è possibile utilizzare lo stesso "filesystem" per i test:
#On a replication node, rather stop, snap, restore for a "consistent" backup ;)
su -l -c "/usr/bin/m2ee stop" acw_qa
pg_ctlcluster ${=QA} stop --force
zfs destroy -R $SNAPSHOT
pg_ctlcluster ${=REPLICATION} stop --force
zfs snapshot $SNAPSHOT
pg_ctlcluster ${=REPLICATION} start

zfs destroy $CLONE
zfs clone -o mountpoint=$CLONEDIR $SNAPSHOT $CLONE
rm $CLONEDIR/$CLUSTER/recovery.conf
pg_ctlcluster ${=QA} start
su -l -c "/usr/bin/m2ee start" acw_qa
  1. per eseguire un test, appena prima del test esegui un arresto postgresql come sopra, zfs snapshot $SNAPSHOTavvia postgresql, quindi esegui il rollback, arresta postgresql ezfs rollback $SNAPSHOT

  2. Compressione - Postgresql ottiene una tipica compressione 3: 1 nei miei database, quindi puoi fare molti altri test;)

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.