web-dev-qa-db-fra.com

Comment mettre à niveau PostgreSQL de la version 9.6 à la version 10.1 sans perdre de données?

J'utilise la base de données PostgreSQL pour mon application Ruby on Rails (sous Mac OS X 10.9).

Existe-t-il des instructions détaillées sur la mise à niveau de la base de données PostgreSQL?

J'ai bien peur de détruire les données de la base de données ou de les gâcher.

182
user3675188

En supposant que vous avez utilisé home-brew pour installer et mettre à niveau Postgres, vous pouvez effectuer les étapes suivantes.

  1. Arrêtez le serveur Postgres actuel:

    launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

  2. Initialiser une nouvelle base de données 10.1:

    initdb /usr/local/var/postgres10.1 -E utf8

  3. lancez pg_upgrade(note: changez la version du bac si vous effectuez une mise à niveau à partir de quelque chose d’autre que ci-dessous):

    pg_upgrade -v \
        -d /usr/local/var/postgres \
        -D /usr/local/var/postgres10.1 \
        -b /usr/local/Cellar/postgresql/9.6.5/bin/ \
        -B /usr/local/Cellar/postgresql/10.1/bin/
    
  4. Déplacer de nouvelles données en place:

    cd /usr/local/var
    mv postgres postgres9.6
    mv postgres10.1 postgres
    
  5. Redémarrez Postgres:

    launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

  6. Consultez /usr/local/var/postgres/server.log pour plus de détails et pour vous assurer que le nouveau serveur a démarré correctement.

  7. Enfin, réinstallez la gemme Rails pg

    gem uninstall pg
    gem install pg
    

Je vous suggère de prendre un peu de temps pour lire la documentation PostgreSQL pour comprendre exactement ce que vous faites dans les étapes ci-dessus afin de minimiser les frustrations.

379
Donovan

Voici la solution pour Ubuntu users

Nous devons d'abord arrêter postgresql 

Sudo /etc/init.d/postgresql stop

Créez un nouveau fichier nommé /etc/apt/sources.list.d/pgdg.list et ajoutez la ligne ci-dessous.

deb http://apt.postgresql.org/pub/repos/apt/ utopic-pgdg main

Suivez les commandes ci-dessous

wget -q -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | Sudo apt-key add -
Sudo apt-get update
Sudo apt-get install postgresql-9.4
Sudo pg_dropcluster --stop 9.4 main 
Sudo /etc/init.d/postgresql start

Maintenant, nous avons tout, il suffit de le mettre à niveau comme ci-dessous

Sudo pg_upgradecluster 9.3 main
Sudo pg_dropcluster 9.3 main

C'est tout. Le cluster principalement mis à niveau fonctionnera sur le numéro de port 5433. Vérifiez-le avec la commande ci-dessous.

Sudo pg_lsclusters
52
pramod

Malgré toutes les réponses ci-dessus, voici mes 5 centimes.

Cela fonctionne sur n'importe quel OS et depuis n'importe quelle version de Postgres.

  • Arrêtez toute instance postgres en cours d'exécution;
  • Installez la nouvelle version et démarrez-la. Vérifiez si vous pouvez également vous connecter à la nouvelle version.
  • Remplacez postgresql.conf -> port de l'ancienne version de 5432 par 5433;
  • Démarrer l'ancienne version de postgres instance;
  • Ouvrez un terminal et un CD dans le nouveau dossier bin version;
  • Exécuter pg_dumpall -p 5433 -U <username> | psql -p 5432 -U <username>
  • Arrêtez l'ancienne instance postgres en cours d'exécution;
45
Christian

Le manuel de l'utilisateur couvre ce sujet en profondeur. Vous pouvez:

  • pg_upgrade en place; ou

  • pg_dump et pg_restore.

En cas de doute, faites-le avec des décharges. Ne supprimez pas l'ancien répertoire de données, conservez-le au cas où quelque chose se passe mal ou si vous faites une erreur. De cette façon, vous pouvez simplement revenir à votre installation 9.3 inchangée.

Pour plus de détails, voir le manuel.

Si vous êtes bloqué, posez une question détaillée expliquant comment vous êtes bloqué, où et ce que vous avez essayé en premier. Cela dépend aussi un peu de la manière dont vous avez installé PostgreSQL, car il existe plusieurs "distributions" de PostgreSQL pour OS X (malheureusement). Vous devez donc fournir ces informations.

11
Craig Ringer

Update: Ce processus est identique pour la mise à niveau de 9.6 à 10; modifiez simplement les commandes pour refléter les versions 9.6 et 10, où 9.6 est la version ancienne et 10 est la version nouvelle. Veillez également à ajuster les répertoires "ancien" et "nouveau" en conséquence.


Je viens de mettre à niveau PostgreSQL 9.5 vers la version 9.6 sur Ubuntu et je pensais partager mes découvertes, car il existe quelques nuances spécifiques au système d'exploitation/paquet à connaître.

(Je ne voulais pas avoir à sauvegarder 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 binaire pg_upgrade, ce qui est expliqué en détail (avec quelques détails) sur https: // www. postgresql.org/docs/9.6/static/pgupgrade.html .

Le seul aspect "délicat" de pg_upgrade est le fait que le fait de ne pas transmettre la valeur correcte d'un argument ou de ne pas être connecté en tant qu'utilisateur correct ou à cd à l'emplacement correct avant d'exécuter une commande peut conduire à des messages d'erreur cryptiques.

Sous Ubuntu (et probablement Debian), à condition que vous utilisiez le référentiel "officiel", deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main, et que vous n’ayez pas modifié les chemins par défaut du système de fichiers ou les options d’exécution, la procédure suivante devrait faire l'affaire.

Installez la nouvelle version (notez que nous spécifions explicitement le 9.6):

Sudo apt install postgresql-9.6

Une fois l'installation réussie, les deux versions fonctionneront côte à côte, mais sur des ports différents. La sortie de l'installation mentionne ceci, 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

Basculez vers l’utilisateur système dédié PostgreSQL: 

su postgres

Déplacez-vous dans son répertoire personnel (sinon, des erreurs seront générées):

cd ~

pg_upgradenécessite les entrées suivantes (pg_upgrade --help nous dit ceci):

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", afin de faciliter leur visualisation:

  -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 commutateur --new-options, car son échec 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 est dû au fait que 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 commande pg_upgrade à partir de la version new 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 sera liée au port 5433 (la valeur par défaut est 5432), donc gardez cela à l'esprit si vous essayez de tester la nouvelle instance avant de la "basculer".

Démarrez le serveur normalement (à nouveau, cela lancera l’ancienne et la nouvelle instance):

systemctl start postgresql

Si vous souhaitez définir la nouvelle version comme version par défaut, vous devez modifier le fichier de configuration en vigueur, par exemple, /etc/postgresql/9.6/main/postgresql.conf, et vous assurer que le port est défini en tant que tel:

port = 5432

Si vous faites cela, changez le numéro de port de l'ancienne version en 5433 en même temps (avant de démarrer les services), ou supprimez simplement l'ancienne version (cela ne supprimera pas le contenu actuel de votre base de données; vous devrez utilisez 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

Pour terminer, n'oubliez pas de prendre en compte le bon conseil de pg_upgrade:

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
9
Ben Johnson

Si vous utilisez les services homebrew et homebrew, vous pouvez probablement simplement faire:

brew services stop postgresql
brew upgrade postgresql
brew postgresql-upgrade-database
brew services start postgresql

Je pense que cela pourrait ne pas fonctionner complètement si vous utilisez les fonctionnalités avancées de postgres, mais cela a parfaitement fonctionné pour moi.

9
jnmandal

Debout sur les épaules des autres pauvres créatures marchant dans cette boue, j'ai pu suivre ces étapes pour me remettre en marche après une mise à niveau vers Yosemite:

En supposant que vous avez utilisé home-brew pour installer et mettre à niveau Postgres, vous pouvez effectuer les étapes suivantes.

  1. Arrêtez le serveur Postgres actuel:

    launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

  2. Initialiser une nouvelle base de données 9.4:

    initdb /usr/local/var/postgres9.4 -E utf8

  3. Installez postgres 9.3 (car il n’était plus présent sur ma machine):

    brew install homebrew/versions/postgresql93

  4. Ajouter des répertoires supprimés lors de la mise à niveau de Yosemite:

    mkdir -p /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp}/touch /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp}/.keep

  5. lancer pg_upgrade:

    pg_upgrade -v -d /usr/local/var/postgres -D /usr/local/var/postgres9.4 -b /usr/local/Cellar/postgresql93/9.3.5/bin/ -B /usr/local/Cellar/postgresql/9.4.0/bin/

  6. Déplacer de nouvelles données en place:

    cd /usr/local/var
    mv postgres postgres9.3
    mv postgres9.4 postgres
    
  7. Redémarrez Postgres:

    launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

  8. Consultez /usr/local/var/postgres/server.log pour plus de détails et pour vous assurer que le nouveau serveur a démarré correctement.

  9. Enfin, réinstallez les bibliothèques associées? 

    pip install --upgrade psycopg2
    gem uninstall pg
    gem install pg
    
8
Josh

On dirait que la solution a été cuite dans Homebrew maintenant:

$ brew info postgresql
...
==> Caveats
To migrate existing data from a previous major version of PostgreSQL run:
  brew postgresql-upgrade-database
....
4
Steven Shaw

Cela l'a fait pour moi.

https://Gist.github.com/dideler/60c9ce184198666e5ab4

Court et au point. Honnêtement, je ne cherche pas à comprendre les entrailles de PostgreSQL, je veux faire avancer les choses.

1
dimitarvp

Sur Windows J'ai dû faire face à différents messages d'erreur en essayant d'utiliser pg_upgrade

J'ai économisé beaucoup de temps pour:

  1. Base de données de sauvegarde
  2. Désinstallez toutes les copies de PostgreSQL
  3. Installer la 9.5
  4. Restaurer la base de données
1
Andrew

Je pense que c'est le meilleur lien pour que votre solution mette à jour postgres vers 9.6 

https://sandymadaan.wordpress.com/2017/02/21/upgrade-postgresql9-3-9-6-in-ubuntu-retaining-the-databases/
0
zulqarnain nazir

Pour Mac via homebrew:

brew tap petere/postgresql

brew install <formula> (par exemple: brew install petere/postgresql/postgresql-9.6)

Enlevez les vieux Postgres:

brew unlink postgresql

brew link -f postgresql-9.6

En cas d'erreur, n'oubliez pas de lire et de suivre les instructions relatives à la préparation à chaque étape.

Regardez ceci pour plus: https://github.com/petere/homebrew-postgresql

0
ThangTD

Sur Windows 10 depuis que j'ai eu NPM, j'ai installé le paquet rimraf. npm install rimraf -g

Sauvegardez toutes vos bases de données une à une en utilisant la commande pg_dump -U $username --format=c --file=$mydatabase.sqlc $dbname

Ensuite, la dernière version de PostgreSQL installée, à savoir 11.2, m'a incité à utiliser le port 5433 cette fois.

Suivi de Uninstall d'anciennes versions de PostgreSQL, la mine était 10. Notez que le programme de désinstallation peut vous avertir de ne pas supprimer le dossier C:\PostgreSQL\10\data. C'est pourquoi nous avons maintenant recours à rimraf pour supprimer définitivement le dossier et ses sous-dossiers.

passez dans le répertoire d’installation de PostgreSQL et lancez la commande rimraf 10. 10 est un nom de répertoire. Notez que vous utilisez votre ancienne version de PostgreSQL i.e. 9.5 ou quelque chose d’autre.

Ajoutez maintenant C:\PostgreSQL\pg11\bin, C:\PostgreSQL\pg11\lib dans les variables d’environnement Windows. Notez que ma nouvelle version installée est 11, alors pourquoi j’utilise pg11.

Accédez à C:\PostgreSQL\data\pg11 puis ouvrez postgresql.conf éditez port = 5433 en port = 5432

C'est tout. Ouvrez cmd et tapez psql -U postgres

Vous pouvez maintenant restaurer toutes vos bases sauvegardées une par une en utilisant la commande pg_restore -U $username --dbname=$databasename $filename

0
STREET MONEY

Ma solution consistait à combiner ces deux ressources:

https://Gist.github.com/tamoyal/2ea1fcdf99c819b4e07d

et

http://www.gab.lc/articles/migration_postgresql_9-3_to_9-4

Le second on a aidé plus que le premier. Ne pas suivre les étapes telles quelles, car certaines ne sont pas nécessaires ..__ Si vous ne pouvez pas sauvegarder les données via la console postgres, vous pouvez utiliser une autre approche et la sauvegarder avec pgAdmin 3 ou un autre programme, comme je l'ai fait dans mon cas.

En outre, le lien: https://help.ubuntu.com/stable/serverguide/postgresql.html M'a aidé à définir le mot de passe crypté et à définir md5 pour l'authentification de l'utilisateur postgres.

Après tout, vérifiez la version postgres server exécutée dans le terminal:

Sudo -u postgres psql postgres

Après avoir saisi le mot de passe, exécutez-le dans le terminal postgres:

SHOW SERVER_VERSION;

Cela produira quelque chose comme:

 server_version 
----------------
 9.4.5

Pour définir et lancer postgres, j'ai utilisé la commande suivante:

> Sudo bash # root
> su postgres # postgres

> /etc/init.d/postgresql start
> /etc/init.d/postgresql stop

Et puis pour restaurer la base de données à partir d'un fichier:

> psql -f /home/ubuntu_username/Backup_93.sql postgres

Ou si cela ne fonctionne pas, essayez avec celui-ci:

> pg_restore --verbose --clean --no-acl --no-owner -h localhost -U postgres -d name_of_database ~/your_file.dump

Et si vous utilisez Rails, faites un bundle exec rake db:migrate après avoir extrait le code :)

0
Aleks