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.
Vorausgesetzt, Sie haben Home-Brew zum Installieren und Aktualisieren von Postgres verwendet, können Sie die folgenden Schritte ausführen.
Stoppen Sie den aktuellen Postgres-Server:
launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
Initialisieren Sie eine neue 10.1-Datenbank:
initdb /usr/local/var/postgres10.1 -E utf8
führen Sie pg_upgrade
aus (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/
Verschieben Sie neue Daten in Position:
cd /usr/local/var
mv postgres postgres9.6
mv postgres10.1 postgres
Postgres neu starten:
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
Überprüfen Sie /usr/local/var/postgres/server.log
für Details und um sicherzustellen, dass der neue Server ordnungsgemäß gestartet wurde.
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.
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
Trotz aller obigen Antworten geht hier meine 5 Cent.
Es funktioniert auf jedem Betriebssystem und in jeder beliebigen Postgres-Version.
postgresql.conf
-> port
der alten Version von 5432
in 5433
;bin
-Ordner.pg_dumpall -p 5433 -U <username> | psql -p 5432 -U <username>
ausführenDas 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.
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_upgrade
erfordert 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
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.
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.
Stoppen Sie den aktuellen Postgres-Server:
launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
Initialisieren Sie eine neue 9.4-Datenbank:
initdb /usr/local/var/postgres9.4 -E utf8
Installiere postgres 9.3 (da es auf meinem Rechner nicht mehr vorhanden war):
brew install homebrew/versions/postgresql93
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
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/
Verschieben Sie neue Daten in Position:
cd /usr/local/var
mv postgres postgres9.3
mv postgres9.4 postgres
Postgres neu starten:
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
Überprüfen Sie /usr/local/var/postgres/server.log
für Details und um sicherzustellen, dass der neue Server ordnungsgemäß gestartet wurde.
Installieren Sie schließlich verwandte Bibliotheken neu?
pip install --upgrade psycopg2
gem uninstall pg
gem install pg
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
....
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.
Unter Windows Beim Versuch, pg_upgrade
zu verwenden, wurden andere Fehlermeldungen angezeigt.
Ich habe viel Zeit für mich gespart:
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/
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
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.conf
port = 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.
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 :)