Mise à jour : ce processus est le même pour la mise à niveau de 9.5 à au moins 11.5; modifiez simplement les commandes pour refléter les versions 9.6
et 10
, où 9.6
est l' ancienne version et 10
la nouvelle version. Veillez également à ajuster les "anciens" et "nouveaux" répertoires en conséquence.
Je viens de mettre à niveau PostgreSQL 9.5 vers 9.6 sur Ubuntu et j'ai pensé partager mes conclusions, car il y a quelques nuances spécifiques au système d'exploitation / package dont vous devez être conscient.
( Je ne voulais pas devoir vider et restaurer les données manuellement , donc plusieurs des autres réponses ici n'étaient pas viables.)
En bref, le processus consiste à installer la nouvelle version de PostgreSQL avec l'ancienne version (par exemple, 9.5 et 9.6), puis à exécuter le pg_upgrade
binaire, qui est expliqué en (certains) détails sur https://www.postgresql.org/ docs / 9.6 / static / pgupgrade.html .
Le seul aspect "délicat" de pg_upgrade
cet échec est de ne pas transmettre la valeur correcte d'un argument, ou de ne pas être connecté en tant qu'utilisateur correct oucd
à l'emplacement correct avant d'exécuter une commande, peut entraîner des messages d'erreur cryptiques.
Sur Ubuntu (et probablement Debian), à condition d'utiliser le référentiel "officiel", deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main
, et à condition que vous n'ayez pas changé les chemins par défaut du système de fichiers ou les options d'exécution, la procédure suivante devrait faire le travail.
Installez la nouvelle version (notez que nous spécifions 9.6
explicitement le):
sudo apt install postgresql-9.6
Une fois l'installation réussie, les deux versions s'exécuteront côte à côte, mais sur des ports différents. La sortie de l'installation le mentionne en bas, mais il est facile de l'oublier:
Creating new cluster 9.6/main ...
config /etc/postgresql/9.6/main
data /var/lib/postgresql/9.6/main
locale en_US.UTF-8
socket /var/run/postgresql
port 5433
Arrêtez les deux instances de serveur (cela arrêtera les deux en même temps):
sudo systemctl stop postgresql
Passez à l'utilisateur du système PostgreSQL dédié:
su postgres
Déplacez-vous dans son répertoire personnel (ne pas le faire entraînera des erreurs):
cd ~
pg_upgrade
nécessite les entrées suivantes ( pg_upgrade --help
nous le dit):
When you run pg_upgrade, you must provide the following information:
the data directory for the old cluster (-d DATADIR)
the data directory for the new cluster (-D DATADIR)
the "bin" directory for the old version (-b BINDIR)
the "bin" directory for the new version (-B BINDIR)
Ces entrées peuvent être spécifiées avec des "noms longs", pour les rendre plus faciles à visualiser:
-b, --old-bindir=BINDIR old cluster executable directory
-B, --new-bindir=BINDIR new cluster executable directory
-d, --old-datadir=DATADIR old cluster data directory
-D, --new-datadir=DATADIR new cluster data directory
Nous devons également passer le --new-options
commutateur, car le non-respect entraîne les conséquences suivantes:
connection to database failed: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/var/lib/postgresql/.s.PGSQL.50432"?
Cela se produit car les options de configuration par défaut sont appliquées en l'absence de ce commutateur, ce qui entraîne l'utilisation d'options de connexion incorrectes, d'où l'erreur de socket.
Exécutez la pg_upgrade
commande à partir de la nouvelle version de PostgreSQL:
/usr/lib/postgresql/9.6/bin/pg_upgrade --old-bindir=/usr/lib/postgresql/9.5/bin --new-bindir=/usr/lib/postgresql/9.6/bin --old-datadir=/var/lib/postgresql/9.5/main --new-datadir=/var/lib/postgresql/9.6/main --old-options=-cconfig_file=/etc/postgresql/9.5/main/postgresql.conf --new-options=-cconfig_file=/etc/postgresql/9.6/main/postgresql.conf
Déconnexion du compte utilisateur système dédié:
exit
La mise à niveau est maintenant terminée, mais la nouvelle instance se liera au port 5433
(la valeur par défaut standard est 5432
), alors gardez cela à l'esprit si vous essayez de tester la nouvelle instance avant de la "couper".
Démarrez le serveur comme d'habitude (encore une fois, cela démarrera à la fois l'ancienne et la nouvelle instance):
systemctl start postgresql
Si vous souhaitez /etc/postgresql/9.6/main/postgresql.conf
définir la nouvelle version par défaut, vous devrez modifier le fichier de configuration efficace, par exemple , et vous assurer que le port est défini comme tel:
port = 5432
Si vous faites cela, modifiez le numéro de port de l'ancienne version 5433
en même temps (avant de démarrer les services), ou supprimez simplement l'ancienne version (cela ne supprimera pas le contenu de votre base de données réelle; vous devrez l'utiliser apt --purge remove postgresql-9.5
pour que cela se produise ):
apt remove postgresql-9.5
La commande ci-dessus arrêtera toutes les instances, vous devrez donc démarrer la nouvelle instance une dernière fois avec:
systemctl start postgresql
Enfin, n'oubliez pas de considérer pg_upgrade
les bons conseils de:
Upgrade Complete
----------------
Optimizer statistics are not transferred by pg_upgrade so,
once you start the new server, consider running:
./analyze_new_cluster.sh
Running this script will delete the old cluster's data files:
./delete_old_cluster.sh