Je teste une mise à niveau de PostgreSQL 8.2.1 à 9.2 sur une machine virtuelle exécutant une distribution Linux personnalisée. La procédure de mise à niveau est la suivante:
- Démarrez le
pg
service - Passez l'aspirateur sur toutes les bases de données (vous ne savez pas si cela est nécessaire)
- Sauvegarde avec
pg_dumpall
- Arrêtez le
pg
service - Éloignez le répertoire où les données sont stockées (
/var/pg
; c'est une configuration simple à serveur unique) - Installez PostgreSQL 9.2
initdb
- Démarrez le serveur
- Restaurer les données sauvegardées
reindexdb
toutes les bases de données- Recréez la
referential_constraints
vue - Videz toutes les bases de données (AFAIK requis après cette mise à niveau)
Cette procédure fonctionne très bien sur un hôte, sauvegarde et restauration sans accroc. Sur une autre machine avec une base de données différente, les points 1 à 7 fonctionnent correctement, mais le serveur ne démarre pas à moins que j'ajoute un sleep 1
après initdb
, et même alors, les données sauvegardées ne peuvent pas être restaurées car "le système de base de données démarre". Quelles sont les façons standard de gérer cela, à l'exception de ces terribles hacks:
sleep
pendant un certain temps généreusement avant chaque opération,- en boucle jusqu'à ce qu'il fonctionne ou jusqu'à ce qu'un délai d'attente généreux soit atteint, ou
- en boucle jusqu'à ce qu'il accepte une requête triviale ou qu'un délai soit atteint.
Edit: La " solution " n'a pas fonctionné après tout. Que faut-il pour s'assurer que la base de données est prête à exécuter une restauration?
initdb
est exécuté de manière synchrone, donc lorsque le serveur est démarré, il initdb
est déjà terminé avec succès.
initdb
statut de sortie? Je suppose que lorsque le travail est terminé, c'est terminé.