636 Stimmen

Kopieren der PostgreSQL-Datenbank auf einen anderen Server

Ich möchte eine produktive PostgreSQL-Datenbank auf einen Entwicklungsserver kopieren. Was ist der schnellste und einfachste Weg, dies zu tun?

852voto

Ferran Punkte 13653

Sie brauchen keine Zwischendatei zu erstellen. Sie können

pg_dump -C -h localhost -U localuser dbname | psql -h remotehost -U remoteuser dbname

ou

pg_dump -C -h remotehost -U remoteuser dbname | psql -h localhost -U localuser dbname

mit psql o pg_dump um eine Verbindung zu einem entfernten Host herzustellen.

Bei einer großen Datenbank oder einer langsamen Verbindung kann es schneller sein, eine Datei zu dumpen und die Datei komprimiert zu übertragen.

Wie Kornel schon sagte, ist es nicht nötig, in eine Zwischendatei zu dumpen. Wenn Sie komprimiert arbeiten wollen, können Sie einen komprimierten Tunnel verwenden.

pg_dump -C dbname | bzip2 | ssh  remoteuser@remotehost "bunzip2 | psql dbname"

ou

pg_dump -C dbname | ssh -C remoteuser@remotehost "psql dbname"

aber auch bei dieser Lösung muss an beiden Enden eine Sitzung eingerichtet werden.

Anmerkung: pg_dump dient zum Sichern und psql ist für die Wiederherstellung. Also, die Der erste Befehl in dieser Antwort kopiert von lokal nach fern und der zweite von fern nach lokal . Mehr -> https://www.postgresql.org/docs/9.6/app-pgdump.html

37 Stimmen

Es besteht keine Notwendigkeit für Zwischendateien - Sie können einen komprimierten SSH-Tunnel verwenden oder einfach eine Pipe senden: pg_dump | bzip2 | ssh "bunzip2 | pg_restore"

5 Stimmen

Wenn Sie bzip2 verwenden, schalten Sie die ssh-Kompression aus, um die Übertragung zu beschleunigen!

1 Stimmen

Beim Befehl ssh ist die Komprimierung bereits standardmäßig deaktiviert. Im Beispiel verwende ich bei der Verwendung der ssh-Komprimierung nicht bzip2 und bei der Verwendung von bzip2 verwende ich keine ssh-Komprimierung.

174voto

unmounted Punkte 31968
pg_dump the_db_name > the_backup.sql

Kopieren Sie dann die Sicherung auf Ihren Entwicklungsserver und stellen Sie sie mit wieder her:

psql the_new_dev_db < the_backup.sql

5 Stimmen

Jemand hat mir gesagt, dass dies problematisch sein kann - Probleme mit den Zugriffsrechten, die dazu führen, dass entweder der Dump oder die Wiederherstellung abbricht, wenn er auf einen Trigger trifft?

27 Stimmen

@rmbarnes: Wenn es Probleme gibt - müssen sie behoben werden. Ohne detaillierte Kenntnisse darüber, was dieser "Jemand" getan hat, kann niemand diese Behauptung bestätigen oder zurückweisen.

6 Stimmen

Verwenden Sie das --no-owner Flag mit pg_dump. Das überspringt das Problem und die erste Bearbeitung dieses Beitrags verwendete es - aber dann dachte ich, Sie bräuchten vielleicht eine genauere Übereinstimmung mit der ursprünglichen Datenbank.

45voto

Verwenden Sie pg_dump und später psql o pg_restore - abhängig davon, ob Sie die Optionen -Fp oder -Fc für pg_dump wählen.

Beispiel für die Verwendung:

ssh production
pg_dump -C -Fp -f dump.sql -U postgres some_database_name
scp dump.sql development:
rm dump.sql
ssh development
psql -U postgres -f dump.sql

0 Stimmen

Was ist der Unterschied zwischen -Fp y -Fc

0 Stimmen

-F, --format=c|d|t|p Ausgabedateiformat (benutzerdefiniert, Verzeichnis, tar, einfacher Text (Standard))

28voto

Eric H. Punkte 6606

Wenn Sie zwischen verschiedenen Versionen migrieren möchten (z.B. wenn Sie Postgres aktualisiert haben und 9.1 auf localhost:5432 und 9.3 auf localhost:5434 laufen lassen), können Sie dies tun:

pg_dumpall -p 5432 -U myuser91 | psql -U myuser94 -d postgres -p 5434

Überprüfen Sie die Migrationsdokumente .

0 Stimmen

Ich werde mehrfach nach dem (myuser91/postgres)-Passwort gefragt, gibt es eine Möglichkeit, dass ich das Passwort nur einmal eingeben muss?

0 Stimmen

@MartinWeber Erstellen Sie eine ,pgpass-Datei wie in diesem Dokument beschrieben postgresql.org/docs/9.4/static/libpq-pgpass.html

0 Stimmen

Was ist, wenn beide dieselben Anschlüsse haben?

27voto

pg_basebackup scheint jetzt der bessere Weg zu sein, insbesondere für große Datenbanken.

Sie können eine Datenbank von einem Server mit der gleichen oder einer älteren Hauptversion kopieren. Oder genauer gesagt :

pg_basebackup funktioniert mit Servern der gleichen oder einer älteren Hauptversion, bis hinunter zu 9.1. Allerdings ist der WAL-Streaming-Modus ( -X stream ) funktioniert nur mit Serverversion 9.3 und höher, und der tar-Formatmodus ( --format=tar ) der aktuellen Version funktioniert nur mit der Serverversion 9.5 oder höher.

Dazu müssen Sie auf dem Quellserver sein:

  1. listen_addresses = '*' um vom Zielserver aus eine Verbindung herstellen zu können. Stellen Sie sicher, dass Port 5432 offen ist.
  2. Mindestens 1 verfügbare Replikationsverbindung: max_wal_senders = 1 ( -X fetch ), 2 para -X stream (der Standardwert bei PostgreSQL 12) oder mehr.
  3. wal_level = replica oder höher, um Folgendes einstellen zu können max_wal_senders > 0 .
  4. host replication postgres DST_IP/32 trust en pg_hba.conf . Dies ermöglicht den Zugriff auf die pg Cluster für jeden aus dem DST_IP Maschine. Vielleicht möchten Sie auf eine sicherere Option zurückgreifen.

Änderungen 1, 2, 3 erfordern einen Neustart des Servers, Änderung 4 erfordert einen Reload.

Auf dem Zielserver:

# systemctl stop postgresql@VERSION-NAME
postgres$ pg_basebackup -h SRC_IP -U postgres -D VERSION/NAME --progress
# systemctl start postgresql@VERSION-NAME

13 Stimmen

Könnten Sie Ihre Antwort näher erläutern, beispielsweise durch ein Beispiel?

8 Stimmen

Das funktioniert allerdings nur, wenn beide Rechner die gleichen PG-Versionen haben.

0 Stimmen

Die Chancen sind gering, dass Sie unterschiedliche Datenbankversionen für Entwicklung und Produktion verwenden. Letztes Mal hatte ich eine unangenehme Unterhaltung mit einem meiner Teamkollegen, als sie versuchte, ein Problem einzureichen, dass ein bestimmter Code mit PG 9.6 nicht funktioniert, während wir zu diesem Zeitpunkt 9.5 in der Produktion verwendeten. Das Basis-Backup ist viel schneller. Dann ist pg_upgrade der richtige Weg, falls erforderlich.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X