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
pgservizio - Vuoto tutti i DB (non sono sicuro che sia necessario)
- Backup con
pg_dumpall - Interrompere il
pgservizio - 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
reindexdbtutti i DB- Ricrea la
referential_constraintsvista - 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 1dopo 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:
sleeping 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?
initdbviene eseguito in modo sincrono, quindi quando il server viene avviato initdbè già terminato correttamente.
initdbstato di uscita? Suppongo che quando è pronto il lavoro è fatto.