J’ai ouvert une instance Mastodon, sur un serveur dédié, il y a de ça quelques mois avec une version 1.1 à l’époque, qui depuis à été mise à jour successivement jusqu’à la très récente 2.4.5.
À l’origine, sur le serveur, j’ai installé une distribution Debian/Jessie (8), toujours en forme et qui fait le job. Au moment d’installer Mastodon j’avais pris ce qui venait côté PostgreSQL, soit la 9.4, or il se trouve que la prochaine version 2.5 de Mastodon, nécessite a minima une version 9.5 de PostgreSQL.
Je viens de tester la migration de 9.4 à 9.6, sur une machine virtuelle comprenant un serveur Apache-PHP + PostgreSQL 9.4, et une installation Dotclear 2.14.2 la-dessus.
Ensuite, après avoir fouillé à droite et à gauche les possibilité de migrer (sans oublier les données), j’ai finalement testé cette procédure, qui semble assez indolore (pour autant que je puisse en juger).
Note : toutes les commandes peuvent se faire en mode root, ou avec un préfixe sudo ; à vous de voir ce que vous préférez. Dans la suite je ne mentionnerai pas le préfixe sudo.
Ajout du dépôt PostgreSQL
Par défaut la distribution Debian/Jessie ne comporte pas de paquet au delà de la version 9.4 de PostgreSQL, il faut donc lui indiquer où récupérer ça en éditant le fichier /etc/apt/sources.list.d/pgdg.list et en y ajoutant ceci :
deb http://apt.postgresql.org/pub/repos/apt/ jessie-pgdg main
Ensuite on ajoute la clé :
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
Suivi d’une mise à jour pour reconstruire l’index :
apt-get update
Installation de la version 9.6 de PostgreSQL
Avant tout, sachez que la commande pg_lsclusters permet de lister les «clusters» PostgreSQL installés :
pg_lsclusters
Qui retourne dans mon cas ceci — un seul cluster, 9.4, en train de tourner, et heureusement vu que le café des blogueurs s’en sert :
Ver Cluster Port Status Owner Data directory Log file
9.4 main 5432 online postgres /var/lib/postgresql/9.4/main /var/log/postgresql/postgresql-9.4-main.log
On l’utilisera par la suite pour vérifier l’état des clusters.
Lancement de l’installation de la version 9.6 de PostgreSQL :
apt-get install postgresql-9.6 postgresql-contrib-9.6
Rien de particulier sauf qu’une fois installé, vous obtenez deux clusters, 9.4 et 9.6, en train de tourner (commande pg_lsclusters) :
Ver Cluster Port Status Owner Data directory Log file
9.4 main 5432 online postgres /var/lib/postgresql/9.4/main /var/log/postgresql/postgresql-9.4-main.log
9.6 main 5433 online postgres /var/lib/postgresql/9.6/main /var/log/postgresql/postgresql-9.6-main.log
Notez les numéros respectifs des ports, 5432 (port PostgreSQL par défaut) pour la 9.4, 5433 pour la 9.6.
Note : Côté applicatif c’est toujours PostgreSQL 9.4 qui sert les données sur le port par défaut, donc Mastodon est censé continuer de fonctionner sans sourciller.
Migration du cluster 9.4 vers 9.6
Il s’agit ici de faire migrer la configuration et les données utilisées par la 9.4 vers la 9.6.
Pour cela on commence par supprimer le cluster 9.6, la migration se chargeant de le recréer à l’issue du traitement :
pg_dropcluster 9.6 main --stop
Un pg_lsclusters nous donne alors :
Ver Cluster Port Status Owner Data directory Log file
9.4 main 5432 online postgres /var/lib/postgresql/9.4/main /var/log/postgresql/postgresql-9.4-main.log
Il est temps de lancer la migration :
pg_upgradecluster -v 9.6 9.4 main
Qui va dupliquer la configuration et les données et recréer le cluster 9.6 — la configuration et es données de la 9.4 ne sont pas supprimées pendant cette migration. De plus le port d’écoute de l’ancienne 9.4 est affecté à la nouvelle 9.6 tandis qu’un autre port est attribué à la 9.4. Enfin le cluster 9.4 est stoppé.
Confirmation avec un pg_lsclusters :
Ver Cluster Port Status Owner Data directory Log file
9.4 main 5433 down postgres /var/lib/postgresql/9.4/main /var/log/postgresql/postgresql-9.4-main.log
9.6 main 5432 online postgres /var/lib/postgresql/9.6/main /var/log/postgresql/postgresql-9.6-main.log
C’est à ce moment qu’il faut vérifier que tout fonctionne côté applicatif puisque c’est dorénavant la 9.6 qui écoute sur le port habituel !
Suppression de PostgreSQL 9.4
Maintenant que la 9.6 tourne correctement, on peut supprimer le custer 9.4, qui va supprimer la configuration et les données au passage :
pg_dropcluster 9.4 main
Résultat avec un pg_lsclusters :
Ver Cluster Port Status Owner Data directory Log file
9.6 main 5432 online postgres /var/lib/postgresql/9.6/main /var/log/postgresql/postgresql-9.6-main.log
Et les données de la 9.4 ont disparu.
Reste plus qu’à supprimer les paquets de la 9.4 qui ne servent plus à rien :
apt-get --purge remove postgresql-client-9.4 postgresql-9.4
Et voilà \o/
Référence :
1 De Franck -
Testé en situation réelle, de la 9.4 vers la 9.6, puis ensuite de la 9.6 vers la 12, aucun problème à signaler.