it-swarm.com.de

Wie können Sie PostgreSQL von Version 9.6 auf Version 10.1 aktualisieren, ohne Daten zu verlieren?

Ich verwende die PostgreSQL-Datenbank für meine Ruby on Rails-Anwendung (unter Mac OS X 10.9).

Gibt es detaillierte Anweisungen zum Upgrade der PostgreSQL-Datenbank?

Ich fürchte, ich werde die Daten in der Datenbank zerstören oder durcheinander bringen.

182
user3675188

Vorausgesetzt, Sie haben Home-Brew zum Installieren und Aktualisieren von Postgres verwendet, können Sie die folgenden Schritte ausführen.

  1. Stoppen Sie den aktuellen Postgres-Server:

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

  2. Initialisieren Sie eine neue 10.1-Datenbank:

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

  3. führen Sie pg_upgradeaus (Hinweis: Ändern Sie die Bin-Version, wenn Sie ein Upgrade von einer anderen als der folgenden Version durchführen):

    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. Verschieben Sie neue Daten in Position:

    cd /usr/local/var
    mv postgres postgres9.6
    mv postgres10.1 postgres
    
  5. Postgres neu starten:

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

  6. Überprüfen Sie /usr/local/var/postgres/server.log für Details und um sicherzustellen, dass der neue Server ordnungsgemäß gestartet wurde.

  7. Installieren Sie schließlich die Rails pg gem

    gem uninstall pg
    gem install pg
    

Ich schlage vor, dass Sie sich etwas Zeit nehmen, um die PostgreSQL-Dokumentation zu lesen , um genau zu verstehen, was Sie in den obigen Schritten tun, um den Frust zu minimieren.

379
Donovan

Hier ist die Lösung für Ubuntu Benutzer

Zuerst müssen wir postgresql stoppen 

Sudo /etc/init.d/postgresql stop

Erstellen Sie eine neue Datei mit dem Namen /etc/apt/sources.list.d/pgdg.list und fügen Sie die folgende Zeile hinzu

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

Befolgen Sie die folgenden Befehle

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

Jetzt haben wir alles, müssen nur noch wie unten beschrieben aktualisiert werden

Sudo pg_upgradecluster 9.3 main
Sudo pg_dropcluster 9.3 main

Das ist es. Das aufgerüstete Cluster wird meistens an Portnummer 5433 ausgeführt. Überprüfen Sie es mit dem folgenden Befehl

Sudo pg_lsclusters
52
pramod

Trotz aller obigen Antworten geht hier meine 5 Cent.

Es funktioniert auf jedem Betriebssystem und in jeder beliebigen Postgres-Version.

  • Stoppen Sie alle laufenden Postgres-Instanzen.
  • Installieren Sie die neue Version und starten Sie sie. Prüfen Sie, ob Sie auch eine Verbindung zur neuen Version herstellen können.
  • Ändern Sie postgresql.conf -> port der alten Version von 5432 in 5433;
  • Starten Sie die alte Version der Postgres-Instanz.
  • Öffnen Sie ein Terminal und eine CD im neuen bin-Ordner.
  • pg_dumpall -p 5433 -U <username> | psql -p 5432 -U <username> ausführen
  • Stoppen Sie, dass alte Postgres-Instanz ausgeführt wird.
45
Christian

Das Benutzerhandbuch behandelt dieses Thema ausführlich. Sie können:

  • pg_upgrade vor Ort; oder

  • pg_dump und pg_restore.

Wenn Sie Zweifel haben, tun Sie es mit Dumps. Löschen Sie nicht das alte Datenverzeichnis, sondern behalten Sie es bei, falls etwas schief geht oder Sie einen Fehler machen. Auf diese Weise können Sie einfach zu Ihrer unveränderten 9.3-Installation zurückkehren.

Einzelheiten finden Sie im Handbuch.

Wenn Sie nicht weiterkommen, posten Sie eine ausführliche Frage, in der Sie erklären, wie Sie wo und was Sie zuerst versucht haben. Es hängt ein wenig davon ab, wie Sie PostgreSQL installiert haben, da PostgreSQL für OS X (leider) mehrere verschiedene "Distributionen" enthält. Sie müssen also diese Informationen angeben.

11
Craig Ringer

Update: Dieser Vorgang ist beim Upgrade von 9.6 auf 10 identisch. Ändern Sie einfach die Befehle entsprechend den Versionen 9.6 und 10, wobei 9.6 die alte-Version und 10 die neue-Version ist. Stellen Sie sicher, dass Sie auch die "alten" und "neuen" Verzeichnisse entsprechend anpassen.


Ich habe gerade PostgreSQL 9.5 auf Ubuntu 9.6 aufgerüstet und dachte, ich würde meine Erkenntnisse teilen, da es einige OS/Paket-spezifische Nuancen gibt, von denen man wissen muss.

(Ich wollte keine Daten manuell abspeichern und wiederherstellen, daher waren einige der anderen Antworten hier nicht durchführbar.)

Kurz gesagt, der Prozess besteht darin, die neue Version von PostgreSQL neben der alten Version (z. B. 9.5 und 9.6) zu installieren und anschließend die pg_upgrade-Binärdatei auszuführen, die ausführlich unter https: //www.postgresql erläutert wird .org/docs/9.6/static/pgupgrade.html .

Der einzige "knifflige" Aspekt von pg_upgrade ist, dass das Versäumnis, den korrekten Wert für ein Argument zu übergeben, oder der Fehler, als korrekter Benutzer oder cd vor der Ausführung eines Befehls am richtigen Ort angemeldet zu werden, zu kryptischen Fehlermeldungen führen kann.

Wenn Sie unter Ubuntu (und wahrscheinlich auch Debian) das "offizielle" Repo deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main verwenden und Sie die standardmäßigen Dateisystempfade oder Laufzeitoptionen nicht geändert haben, sollte der folgende Vorgang ausgeführt werden.

Installieren Sie die neue Version (beachten Sie, dass wir 9.6 explizit angeben):

Sudo apt install postgresql-9.6

Nach erfolgreicher Installation werden beide Versionen nebeneinander ausgeführt, jedoch auf verschiedenen Ports. In der Installationsausgabe wird dies unten erwähnt, aber es ist leicht zu übersehen:

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

Stoppen Sie beide Serverinstanzen (dies wird beide gleichzeitig stoppen):

Sudo systemctl stop postgresql

Wechseln Sie zum dedizierten PostgreSQL-Systembenutzer: 

su postgres

In sein Home-Verzeichnis verschieben (andernfalls wird es zu Fehlern kommen):

cd ~

pg_upgradeerfordert die folgenden Eingaben (pg_upgrade --help sagt uns dies):

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)

Diese Eingaben können mit "langen Namen" angegeben werden, um sie einfacher zu visualisieren:

  -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

Wir müssen auch den --new-options-Schalter übergeben, da dies zu folgendem führt:

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"?

Dies ist darauf zurückzuführen, dass die Standardkonfigurationsoptionen ohne diesen Schalter angewendet werden, was dazu führt, dass falsche Verbindungsoptionen verwendet werden und daher der Socket-Fehler.

Führen Sie den Befehl pg_upgrade in der neu PostgreSQL-Version aus:

/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

Abmeldung des dedizierten Systembenutzerkontos:

exit

Das Upgrade ist jetzt abgeschlossen, but, die neue Instanz bindet sich an Port 5433 (der Standardwert ist 5432). Denken Sie also daran, wenn Sie versuchen, die neue Instanz vor dem "Ausschalten" zu testen .

Starten Sie den Server wie gewohnt (wieder werden sowohl die alte als auch die neue Instanz gestartet):

systemctl start postgresql

Wenn Sie die neue Version als Standard festlegen möchten, müssen Sie die effektive Konfigurationsdatei (z. B. /etc/postgresql/9.6/main/postgresql.conf) bearbeiten und sicherstellen, dass der Port als solcher definiert ist:

port = 5432

Wenn Sie dies tun, ändern Sie entweder die Portnummer der alten Version gleichzeitig in 5433 (bevor Sie die Dienste starten), oder entfernen Sie einfach die alte Version (dies wird durch nicht Ihren tatsächlichen Datenbankinhalt entfernt müssen apt --purge remove postgresql-9.5 verwenden, damit dies geschieht):

apt remove postgresql-9.5

Mit dem obigen Befehl werden alle Instanzen angehalten. Sie müssen die neue Instanz ein letztes Mal mit folgendem Befehl starten:

systemctl start postgresql

Vergessen Sie nicht, den guten Rat von pg_upgrade zu beachten:

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

Wenn Sie Homebrew- und Homebrew-Dienste verwenden, können Sie wahrscheinlich Folgendes tun:

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

Ich denke, das funktioniert möglicherweise nicht vollständig, wenn Sie erweiterte Postgres-Funktionen verwenden, aber es hat perfekt für mich funktioniert.

9
jnmandal

Ich stand auf den Schultern der anderen armen Kreaturen, die durch diesen Dreck traten, und konnte diese Schritte befolgen, um nach einem Upgrade auf Yosemite wieder in Betrieb zu gehen:

Vorausgesetzt, Sie haben Home-Brew zum Installieren und Aktualisieren von Postgres verwendet, können Sie die folgenden Schritte ausführen.

  1. Stoppen Sie den aktuellen Postgres-Server:

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

  2. Initialisieren Sie eine neue 9.4-Datenbank:

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

  3. Installiere postgres 9.3 (da es auf meinem Rechner nicht mehr vorhanden war):

    brew install homebrew/versions/postgresql93

  4. Fügen Sie Verzeichnisse hinzu, die während des Yosemite-Upgrades entfernt wurden:

    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. pg_upgrade ausführen:

    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. Verschieben Sie neue Daten in Position:

    cd /usr/local/var
    mv postgres postgres9.3
    mv postgres9.4 postgres
    
  7. Postgres neu starten:

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

  8. Überprüfen Sie /usr/local/var/postgres/server.log für Details und um sicherzustellen, dass der neue Server ordnungsgemäß gestartet wurde.

  9. Installieren Sie schließlich verwandte Bibliotheken neu? 

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

Sieht so aus, als ob die Lösung jetzt in Homebrew gebacken wurde:

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

Das hat es für mich getan.

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

Kurz und auf den Punkt. Ich möchte ehrlich gesagt nicht die Hintergründe von PostgreSQL verstehen, ich möchte etwas erledigen.

1
dimitarvp

Unter Windows Beim Versuch, pg_upgrade zu verwenden, wurden andere Fehlermeldungen angezeigt. 

Ich habe viel Zeit für mich gespart:

  1. Backup-DB
  2. Deinstallieren Sie alle Kopien von PostgreSQL
  3. Installieren Sie 9.5
  4. DB wiederherstellen
1
Andrew

Ich denke, dies ist der beste Link für Ihre Lösung, um Postgres auf 9.6 zu aktualisieren 

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

Für Mac via Homebrew:

brew tap petere/postgresql

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

Alte Postgres entfernen:

brew unlink postgresql

brew link -f postgresql-9.6

Wenn ein Fehler auftritt, vergessen Sie nicht, die Anweisungen zum Brühen in jedem Schritt zu lesen.

Weitere Informationen finden Sie hier: https://github.com/petere/homebrew-postgresql

0
ThangTD

Unter Windows 10 habe ich, seit ich npm hatte, das rimraf-Paket installiert. npm install rimraf -g

Sichern Sie alle Ihre Datenbanken nacheinander mit dem Befehl pg_dump -U $username --format=c --file=$mydatabase.sqlc $dbname

Dann installierte ich die neueste PostgreSQL-Version, d. H. 11.2, die mich dieses Mal aufforderte, Port 5433 zu verwenden.

Gefolgt von Deinstallation älterer PostgreSQL-Versionen war 10. Hinweis: Das Deinstallationsprogramm gibt möglicherweise eine Warnung aus, dass der Ordner C:\PostgreSQL\10\data nicht gelöscht wird. Deshalb haben wir den nächsten Schritt mit rimraf, um den Ordner und seine Unterordner dauerhaft zu löschen.

wechseln Sie in das PostgreSQL-Installationsverzeichnis und führen Sie den Befehl rimraf 10 aus. 10 ist ein Verzeichnisname. Beachten Sie, dass Sie Ihre ältere Version von PostgreSQL verwenden, d. H. 9.5 oder so.

Fügen Sie nun C:\PostgreSQL\pg11\bin, C:\PostgreSQL\pg11\lib zu den Windows-Umgebungsvariablen hinzu. Beachten Sie, dass meine neu installierte Version 11 ist. Deshalb verwende ich pg11.

Navigiere zu C:\PostgreSQL\data\pg11 und postgresql.confport = 5433 zu port = 5432 bearbeiten

Das ist es. Öffne cmd und tippe psql -U postgres

Sie können jetzt alle Ihre gesicherten Datenbanken einzeln mit dem Befehl pg_restore -U $username --dbname=$databasename $filename wiederherstellen.

0
STREET MONEY

Meine Lösung bestand darin, eine Kombination dieser beiden Ressourcen zu verwenden:

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

und

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

Die Sekunde eine half mehr als die erste. Um dies nicht zu tun, befolgen Sie die Schritte nicht, da einige nicht erforderlich sind. Wenn Sie die Daten nicht über die Postgres-Konsole sichern können, können Sie alternativ vorgehen und sie mit pgAdmin 3 oder sichern ein anderes Programm, wie ich es in meinem Fall tat.

Der Link: https://help.ubuntu.com/stable/serverguide/postgresql.html Half beim Festlegen des verschlüsselten Kennworts und beim Festlegen von md5 für die Authentifizierung des Postgres-Benutzers.

Wenn alles erledigt ist, überprüfen Sie die postgres-Version der server-Version im Terminal:

Sudo -u postgres psql postgres

Nach Eingabe des Passworts im Postgres-Terminal laufen lassen:

SHOW SERVER_VERSION;

Es wird etwas ausgegeben wie:

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

Zum Setzen und Starten von Postgres habe ich den Befehl verwendet:

> Sudo bash # root
> su postgres # postgres

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

Und dann zum Wiederherstellen der Datenbank aus einer Datei:

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

Wenn dies nicht funktioniert, versuchen Sie es mit diesem:

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

Und wenn Sie Rails verwenden, machen Sie einen bundle exec rake db:migrate, nachdem Sie den Code gezogen haben :)

0
Aleks