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.
En supposant que vous avez utilisé home-brew pour installer et mettre à niveau Postgres, vous pouvez effectuer les étapes suivantes.
Arrêtez le serveur Postgres actuel:
launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
Initialiser une nouvelle base de données 10.1:
initdb /usr/local/var/postgres10.1 -E utf8
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/
Déplacer de nouvelles données en place:
cd /usr/local/var
mv postgres postgres9.6
mv postgres10.1 postgres
Redémarrez Postgres:
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
Consultez /usr/local/var/postgres/server.log
pour plus de détails et pour vous assurer que le nouveau serveur a démarré correctement.
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.
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
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.
postgresql.conf
-> port
de l'ancienne version de 5432
par 5433
;bin
version;pg_dumpall -p 5433 -U <username> | psql -p 5432 -U <username>
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.
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_upgrade
né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
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.
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.
Arrêtez le serveur Postgres actuel:
launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
Initialiser une nouvelle base de données 9.4:
initdb /usr/local/var/postgres9.4 -E utf8
Installez postgres 9.3 (car il n’était plus présent sur ma machine):
brew install homebrew/versions/postgresql93
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
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/
Déplacer de nouvelles données en place:
cd /usr/local/var
mv postgres postgres9.3
mv postgres9.4 postgres
Redémarrez Postgres:
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
Consultez /usr/local/var/postgres/server.log
pour plus de détails et pour vous assurer que le nouveau serveur a démarré correctement.
Enfin, réinstallez les bibliothèques associées?
pip install --upgrade psycopg2
gem uninstall pg
gem install pg
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
....
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.
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:
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/
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
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
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 :)