Sto testando un aggiornamento PostgreSQL da 8.2.1 a 9.2 su una macchina virtuale che esegue una distribuzione Linux personalizzata. La procedura di aggiornamento è la seguente:
- Avvia il
pg
servizio - Vuoto tutti i DB (non sono sicuro che sia necessario)
- Backup con
pg_dumpall
- Interrompere il
pg
servizio - Allontana la directory in cui sono archiviati i dati (
/var/pg
; è una semplice configurazione a server singolo) - Installa PostgreSQL 9.2
initdb
- Avvia il server
- Ripristina i dati scaricati
reindexdb
tutti i DB- Ricrea la
referential_constraints
vista - Vuoto tutti i DB (AFAIK richiesto dopo questo aggiornamento)
Questa procedura funziona bene su un host, eseguendo il backup e il ripristino senza intoppi. Su un altro computer con un database diverso, i punti da 1 a 7 funzionano correttamente, ma il server non si avvia a meno che non aggiunga un sleep 1
dopo initdb
, e anche in questo caso i dati scaricati non possono essere ripristinati perché "il sistema del database si sta avviando". Quali sono i modi standard per gestirlo, ad eccezione di questi terribili hack:
sleep
ing per un periodo di tempo generoso prima di entrambe le operazioni,- loop fino a quando non funziona o fino a quando non viene raggiunto un timeout generoso, o
- loop fino a quando non accetta una query banale o viene raggiunto un timeout.
Modifica: la " soluzione " non ha funzionato dopo tutto. Cosa serve per assicurarsi che il database sia pronto per eseguire un ripristino?
initdb
viene eseguito in modo sincrono, quindi quando il server viene avviato initdb
è già terminato correttamente.
initdb
stato di uscita? Suppongo che quando è pronto il lavoro è fatto.