Aller au contenu

Récupérer l'ancien serveur

Lancer une mise à jour ordinaire sur un changement de majeure n’est pas une erreur qui se paie, mais elle emporte l’ancien serveur avant que vous l’ayez dumpé. Cette page le ramène, le temps du dump, puis vous remet à Montée de version PostgreSQL pour finir.

docker compose up -d --build construit l’image, recrée le conteneur de la base dans la nouvelle majeure, attend une santé qu’il n’obtient jamais, et sort en 1 sur dependency failed to start: container badlen-db-1 is unhealthy. docker compose logs db dit pourquoi, répété une fois par redémarrage :

Error: in 18+, these Docker images are configured to store database data in a format
which is compatible with "pg_ctlcluster" ...
Counter to that, there appears to be PostgreSQL data in:
/var/lib/postgresql

C’est le refus qui fait son travail : le serveur s’est arrêté avant de toucher à quoi que ce soit, le volume porte donc encore votre base exactement comme l’ancienne majeure l’a laissée. Ce que vous n’avez plus, c’est un serveur capable de la lire.

À côté de la pile, sur le même volume et dans la disposition dans laquelle il a été écrit. Le volume dit quelle majeure l’a écrit :

Fenêtre de terminal
export PGPASSWORD=$(grep -m1 '^POSTGRES_PASSWORD=' .env | cut -d= -f2-)
docker compose stop app db
docker run --rm -v badlen_pgdata:/vol alpine cat /vol/PG_VERSION # la majeure à ramener, par exemple 16
docker run --rm -d --name badlen-db-old --network badlen_default \
-e POSTGRES_PASSWORD="$PGPASSWORD" -v badlen_pgdata:/var/lib/postgresql/data postgres:16-alpine
until docker exec badlen-db-old pg_isready -U badlen -q; do sleep 1; done
docker run --rm --network badlen_default -e PGPASSWORD postgres:18-alpine \
pg_dump -h badlen-db-old -U badlen -d badlen > badlen-dump.sql
grep -c 'PostgreSQL database dump complete' badlen-dump.sql # doit afficher 1
docker stop badlen-db-old

Puis reprenez Montée de version PostgreSQL à son docker compose down, le dump étant déjà pris.

Confidentialité