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
pgservice - 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
pgservice - É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
reindexdbtoutes les bases de données- Recréez la
referential_constraintsvue - 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 1aprè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:
sleeppendant 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?
initdbest exécuté de manière synchrone, donc lorsque le serveur est démarré, il initdbest déjà terminé avec succès.
initdbstatut de sortie? Je suppose que lorsque le travail est terminé, c'est terminé.