Mettre à jour pgsql sur pgsql-prod

Version 2.1 par Gaetan RETEL le 2025/03/12 01:58

Après avoir galéré sur la mise à jour de postgreSQL sur pgsql-prod, j'ai décidé de noter ici les étapes à suivre pour une upgrade sans histoire.

Les commandes listées ci dessous seront celle de la version que j'ai installé. 

Précautions à prendre

Avant de toucher à la BDD on va évidemment faire une sauvegarde, pour pouvoir remettre en état en cas de pépin. Pour cela on peut utiliser pg_dumpall. Pour cela on va faire deux sauvegarde, une avec le flag --globals-only pour récupérer les users/roles/etc, et une autre pour récupérer les BDDs.

Attention, la commande pg_dumpall ne fait qu'un dump du cluster par défaut (port 5432), il va donc falloir l'exécuter pour chaque cluster

Pour voir les différents clusters présents, utiliser la commande pg_lsclusters. La sortie inclura plusieurs information importantes, comme la version pgsql utilisé par chaque cluster, et son port.

Pour vérifier qu'il y a de la place sur la VM on peut utiliser df -h et regarder la place sur ce qui est monté sur / , le dump des BDD du cluster main faisait 1.3G dans mon cas.

su - postgres -c "pg_dumpall -U postgres -p 5432" > /var/backups/pgsql_main_backup.sql

su - postgres -c "pg_dumpall --globals-only -U postgres -p 5432" > /var/backups/pgsql_main_globals_backup.sql

Penser à copier les sauvegardes sur une autre machine en cas de problème sur la VM, on ne sait jamais. Pour la copier sur votre machine dans pgsql/ utiliser par exemple :

scp -J root@atilla.org pgsql-prod.prod.infra:/var/backups/pgsql_main_backup.sql ./pgsql/

Pour vérifier les packages installés, utiliser la commande

dpkg -l | grep postgresql

Préparation des nouveaux clusters

pour créer les nouveaux clusters, il faut commencer par regarder comment sont faits les anciens, pour qu'ils soient compatibles entre eux. L'encodage et le collationnement/type de caractères doivent être identiques.

on peut trouver les informations nécessaires en affichant les BDDs de chaque clusters :

sudo -u postgres psql -p 5432

\l

Si comme moi vous n'avez jamais touché à postgreSQL, la commande pour sortir du terminal est \q

Dans mon cas, l'encodage est UTF-8 et le reste en C. Pour créer un cluster "main" utilisant pgsql 14 la commande est donc

pg_createcluster --locale=C --encoding=UTF8 14 main

On va utiliser la commande pg_upgrade pour migrer les données, il va falloir utiliser pas mal de flags avec des arguments, n'oubliez pas de lire la doc.

Pour passer de la version x à la version y, il faut le path des dossiers des exécutables et de data des version x et y, ainsi que le path du fichier .conf de postgres de chaque version.

Avant de lancer la commande, on notera l'existence du flag --check, dont on ne manquera pas de se servir.

Pour la version 13 à 14, il faut donc taper pour lancer les vérifications

/usr/lib/postgresql/14/bin/pg_upgrade -b /usr/lib/postgresql/13/bin -B /usr/lib/postgresql/14/bin -d /var/lib/postgresql/13/main -D /var/lib/postgresql/14/main -o '-c config_file=/etc/postgresql/13/main/postgresql.conf' -O '-c config_file=/etc/postgresql/14/main/postgresql.conf' --check

À ce stade là s'il y a des problèmes, google est votre ami.

Lancer l'upgrade

Si la commande avec le flag --check à réussi, il n'y a plus qu'à la lancer sans. Pour autant, une erreur peut toujours survenir.

Pour la suite, lisez bien TOUTES les infos avant de vous lancer dans les commandes des différents clusters, sinon vous risquez de devoir recommencer.

/usr/lib/postgresql/14/bin/pg_upgrade -b /usr/lib/postgresql/13/bin -B /usr/lib/postgresql/14/bin -d /var/lib/postgresql/13/main -D /var/lib/postgresql/14/main -o '-c config_file=/etc/postgresql/13/main/postgresql.conf' -O '-c config_file=/etc/postgresql/14/main/postgresql.conf'