Mettre à jour pgsql sur pgsql-prod
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.
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
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.
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
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.
/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'