Ich möchte eine PostgreSQL-Produktionsdatenbank auf einen Entwicklungsserver kopieren. Was ist der schnellste und einfachste Weg, dies zu tun?
Ich möchte eine PostgreSQL-Produktionsdatenbank auf einen Entwicklungsserver kopieren. Was ist der schnellste und einfachste Weg, dies zu tun?
Antworten:
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 psql
oder pg_dump
zum 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 psql
Wiederherstellen. 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
ssh remoteuser@remotehost "pg_dump -C dbname | bzip2" | bunzip2 | psql dbname
?
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
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
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 .
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_basebackup
funktioniert 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:
listen_addresses = '*'
um eine Verbindung vom Zielserver herstellen zu können. Stellen Sie sicher, dass Port 5432 offen ist.max_wal_senders = 1
( -X fetch
), 2
für -X stream
(Standardeinstellung bei PostgreSQL 12) oder mehr.wal_level = replica
oder höher, um einstellen zu können max_wal_senders > 0
.host replication postgres DST_IP/32 trust
in pg_hba.conf
. Dadurch wird pg
jedem vom DST_IP
Computer 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
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
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.
Dump Ihre Datenbank: pg_dump database_name_name > backup.sql
Importieren Sie Ihre Datenbank zurück: psql db_name < backup.sql
Lassen Sie mich ein Linux-Shell-Skript freigeben, um Ihre Tabellendaten von einem Server auf einen anderen PostgreSQL-Server zu kopieren.
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
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}}