Kopieren der PostgreSQL-Datenbank auf einen anderen Server

492

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

Robin Barnes
quelle

Antworten:

666

Sie müssen keine Zwischendatei erstellen. Du kannst tun

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

oder

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

Verwenden von psqloder pg_dumpzum Herstellen einer Verbindung zu einem Remote-Host.

Bei einer großen Datenbank oder einer langsamen Verbindung kann das Ablegen einer Datei und das Übertragen der komprimierten Datei schneller sein.

Wie Kornel sagte, müssen Sie nicht in eine Zwischendatei sichern. Wenn Sie komprimiert arbeiten möchten, können Sie einen komprimierten Tunnel verwenden

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

oder

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

Diese Lösung erfordert jedoch auch eine Sitzung an beiden Enden.

Hinweis: pg_dump dient zum Sichern und psqlWiederherstellen. Der erste Befehl in dieser Antwort ist das Kopieren von lokal nach remote und der zweite von remote nach lokal . Mehr -> https://www.postgresql.org/docs/9.6/app-pgdump.html

Ferran
quelle
28
Es sind keine Zwischendateien erforderlich. Sie können einen komprimierten SSH-Tunnel oder einfach eine Pipe verwenden: pg_dump | bzip2 | ssh "bunzip2 | pg_restore"
Kornel
4
Wenn Sie bzip2 verwenden, deaktivieren Sie die SSH-Komprimierung, um die Übertragung zu beschleunigen!
lzap
8
Wie kann ich komprimiert arbeiten, wenn ich Daten aus der Produktion in die Entwicklung ziehe ? Ich habe eine SSH-Verbindung von der Entwicklung bis zur Produktion eingerichtet. So wäre es ssh remoteuser@remotehost "pg_dump -C dbname | bzip2" | bunzip2 | psql dbname?
Jeromy French
2
Ich würde erwarten, dass Sie in der Lage sein sollten, eine entfernte Datenbank mit dem Namen x in eine lokale Datenbank mit dem Namen y zu kopieren, aber die Lösung von @ Ferran funktioniert dafür nicht ... Es sieht für mich so aus, als ob die Lösung von porneL nur die bzip2-Dateien auf dem Computer belässt Server, das ist also kein einstufiger Prozess. In diesem Fall werde ich wahrscheinlich die Datenbank y löschen, den "oder" Teil von Ferrans Lösung verwenden, der x wiederherstellt, und dann die Datenbank in y umbenennen.
Darin Peterson
3
Folgendes habe ich getan: (1) pg_dump -C -h remotehost -U remoteuser x | psql -h localhost -U localuser (2) dropdb y (3) psql -U postgres -c 'ALTER DATABASE "x" RENAME TO "y"'
Darin Peterson
131
pg_dump the_db_name > the_backup.sql

Kopieren Sie dann das Backup auf Ihren Entwicklungsserver und stellen Sie es wieder her mit:

psql the_new_dev_db < the_backup.sql
unmontiert
quelle
3
Jemand hat mir gesagt, dass dies problematisch sein kann - Berechtigungsprobleme, die dazu führen, dass der Dump oder die Wiederherstellung sterben, wenn sie einen Auslöser treffen?
Robin Barnes
17
@rmbarnes: Wenn es Probleme gibt, müssen sie behoben werden. Ohne detailliertes Wissen darüber, was dieser "Jemand" getan hat - niemand kann diese Behauptung bestätigen oder abweisen.
4
Verwenden Sie das Flag --no-owner mit pg_dump. Dies überspringt das Problem und die erste Bearbeitung dieses Beitrags hat es verwendet - aber dann dachte ich, dass Sie möglicherweise eine genauere Wiedergabetreue zur ursprünglichen Datenbank benötigen.
Unmontiert
4
Für mich hat der obige Ansatz folgendermaßen funktioniert: pg_dump -C -h Host -U Benutzername Datenbankname> / any_directory / dump_schema_and_data_file .Und zum Wiederherstellen aus der Datei: psql -h Host -U Benutzername db_name <dump_schema_and_data_file
Ali Raza Bhayani
Das hat mir viel Ärger erspart. Ich habe Google Drive verwendet, um die Datei zwischen Computern zu verschieben. Da ich die Datenbank bereits auf dem neuen Computer hatte (aber leer), habe ich viele doppelte Schlüsselfehler erhalten. Es ist jedoch eine Entwicklungsumgebung und sie haben nichts verletzt.
Chris Mendla
37

Verwenden Sie pg_dump und später psql oder pg_restore - je nachdem, ob Sie für pg_dump die Optionen -Fp oder -Fc auswählen.

Anwendungsbeispiel:

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

quelle
22

Wenn Sie zwischen Versionen migrieren möchten (z. B. haben Sie postgres aktualisiert und 9.1 auf localhost: 5432 und 9.3 auf localhost: 5434 ausgeführt), können Sie Folgendes ausführen:

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

Überprüfen Sie die Migrationsdokumente .

Eric H.
quelle
Ich werde mehrmals nach dem (myuser91 / postgres) -Passwort gefragt. Gibt es eine Möglichkeit, das Passwort nur einmal einzugeben?
Martin Weber
@ MartinWeber Erstellen Sie eine pgpass-Datei gemäß diesem Dokument postgresql.org/docs/9.4/static/libpq-pgpass.html
Scott Warren
Was ist, wenn beide Ports gleich sind?
Ggnoredo
Wenn sie sich auf verschiedenen Servern befinden, können Sie -h verwenden, um die Hosts anzugeben.
Haroldo_OK
16

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

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

pg_basebackupfunktioniert mit Servern derselben oder einer älteren Hauptversion bis 9.1. Der WAL-Streaming-Modus ( -X stream) funktioniert jedoch nur mit Serverversion 9.3 und höher, und der Tar-Format-Modus ( --format=tar) der aktuellen Version funktioniert nur mit Serverversion 9.5 oder höher.

Dafür benötigen Sie auf dem Quellserver:

  1. listen_addresses = '*'um eine Verbindung vom Zielserver herstellen zu können. Stellen Sie sicher, dass Port 5432 offen ist.
  2. Mindestens 1 verfügbare Replikationsverbindung: max_wal_senders = 1( -X fetch), 2für -X stream(Standardeinstellung bei PostgreSQL 12) oder mehr.
  3. wal_level = replicaoder höher, um einstellen zu können max_wal_senders > 0.
  4. host replication postgres DST_IP/32 trustin pg_hba.conf. Dadurch wird pgjedem vom DST_IPComputer aus Zugriff auf den Cluster gewährt . Möglicherweise möchten Sie auf eine sicherere Option zurückgreifen.

Änderungen 1, 2, 3 erfordern einen Neustart des Servers, Änderung 4 erfordert ein erneutes Laden.

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
Benutzer2701173 neu laden
quelle
11
Könnten Sie in Ihrer Antwort weitere Details angeben, beispielsweise ein Beispiel?
Magnilex
7
Dies funktioniert jedoch nur, wenn beide Computer die gleichen PG-Versionen haben.
sm
Die Chancen sind gering, dass Sie für die Entwicklung und Produktion unterschiedliche Datenbankversionen verwenden. Das letzte Mal hatte ich ein unangenehmes Gespräch mit einer meiner Teamkollegen, als sie versuchte, ein Problem einzureichen, dass ein Teil des Codes mit PG 9.6 nicht funktioniert, während wir zu diesem Zeitpunkt 9.5 in der Produktion verwendet hatten. Die Basissicherung ist viel schneller. Dann ist pg_upgrade der richtige Weg, wenn nötig.
Zorg
2
Möglicherweise möchten Sie auf eine neuere Version migrieren und PostgreSQL nicht stoppen.
X-Yuri
1
Es besteht die Möglichkeit, dass Sie Ihre Datenbank bei jedem Upgrade auf dev und staging aktualisieren, bevor Sie sie in der Produktion ausführen.
Andrew Lorien
8

Führen Sie diesen Befehl mit dem Datenbanknamen aus, den Sie sichern möchten, um den DB-Speicherauszug zu erstellen.

 pg_dump -U {user-name} {source_db} -f {dumpfilename.sql}

 eg. pg_dump -U postgres mydbname -f mydbnamedump.sql

Scannen Sie nun diese Dump-Datei auf den Remote-Computer, auf den Sie die Datenbank kopieren möchten.

eg. scp mydbnamedump.sql user01@remotemachineip:~/some/folder/

Führen Sie auf dem Remotecomputer den folgenden Befehl in ~ / some / folder aus, um die Datenbank wiederherzustellen.

 psql -U {user-name} -d {desintation_db}-f {dumpfilename.sql}

 eg. psql -U postgres -d mynewdb -f mydbnamedump.sql
user01
quelle
7

Ich hatte ziemlich viel zu kämpfen und schließlich war die Methode, die es mir ermöglichte, es mit Rails 4 zum Laufen zu bringen, folgende:

auf Ihrem alten Server

sudo su - postgres
pg_dump -c --inserts old_db_name > dump.sql

Ich musste den Postgres-Linux-Benutzer verwenden, um den Dump zu erstellen. Außerdem musste ich -c verwenden, um die Erstellung der Datenbank auf dem neuen Server zu erzwingen. --inserts weist es an, die INSERT () -Syntax zu verwenden, die sonst für mich nicht funktionieren würde :(

dann auf dem neuen Server einfach:

sudo su - postgres
psql new_database_name < dump.sql

Um die dump.sql-Datei zwischen dem Server zu übertragen, habe ich einfach die "cat" verwendet, um den Inhalt zu drucken, und dann "nano", um ihn neu zu erstellen und den Inhalt zu kopieren.

Außerdem war die ROLLE, die ich für die beiden Datenbanken verwendete, unterschiedlich, sodass ich den gesamten Eigentümernamen im Dump finden und ersetzen musste.

Pastullo
quelle
6

Dump Ihre Datenbank: pg_dump database_name_name > backup.sql


Importieren Sie Ihre Datenbank zurück: psql db_name < backup.sql

MisterJoyson
quelle
5

Lassen Sie mich ein Linux-Shell-Skript freigeben, um Ihre Tabellendaten von einem Server auf einen anderen PostgreSQL-Server zu kopieren.

Referenz aus diesem Blog:

Linux Bash Shell Script für die Datenmigration zwischen PostgreSQL-Servern:

#!/bin/bash
psql \
    -X \
    -U user_name \
    -h host_name1 \
    -d database_name \
    -c "\\copy tbl_Students to stdout" \
| \
psql \
    -X \
    -U user_name \
    -h host_name2 \
    -d database_name \
    -c "\\copy tbl_Students from stdin"

Ich migriere nur die Daten; Bitte erstellen Sie eine leere Tabelle auf Ihrem Ziel- / zweiten Datenbankserver.

Dies ist ein Dienstprogramm-Skript. Darüber hinaus können Sie das Skript für die allgemeine Verwendung ändern, indem Sie Parameter für Hostname, Datenbankname, Tabellenname und andere hinzufügen

Anvesh
quelle
5

Die akzeptierte Antwort ist korrekt. Wenn Sie jedoch vermeiden möchten, das Kennwort interaktiv einzugeben, können Sie Folgendes verwenden:

PGPASSWORD={{export_db_password}} pg_dump --create -h {{export_db_host}} -U {{export_db_user}} {{export_db_name}} | PGPASSWORD={{import_db_password}} psql -h {{import_db_host}} -U {{import_db_user}} {{import_db_name}}
Zoran
quelle