2011-01-05 11 views
9

Ich habe einen (Produktion) DB-Server mit PostgreSQL v9.0 und einen Entwicklungscomputer mit PostgreSQL v8.4. Ich möchte die Produktions-DB aussortieren und auf der Entwicklungsmaschine verwenden. Ich kann die Postgres auf dem Dev-Rechner nicht upgraden.Verwenden Sie pg_restore zum Wiederherstellen von einer neueren Version von PostgreSQL

auf der Produktionsmaschine, ich laufe:

pg_dump -f nvdls.db -F p -U nvdladmin nvdlstats 

Auf der Entwicklungsmaschine, ich laufe:

pg_restore -d nvdlstats -U nvdladmin nvdls.db 

Und ich diesen Fehler habe:

pg_restore: [archiver] unsupported version (1.12) in file header 

Dies geschieht unabhängig ob ich beim Dumping das Format custom, tar oder plain_text wähle

Ich fand one discussion online, was darauf hindeutet, dass ich eine neuere Version von pg_restore auf der Dev-Maschine verwenden sollte. Ich habe dies versucht, indem ich einfach die 9.0-Binärdatei auf den Dev-Rechner kopiert habe, aber dies schlägt (nicht unerwartet) aufgrund von Verbindungsproblemen fehl.

Ich dachte, dass der Sinn von einem plain_text-Dump war, dass es rohes, portables SQL wäre. Scheinbar nicht.

Wie bekomme ich die 9.0 DB in meine 8.4 Installation?

+0

Sie könnten sowohl 8.4 als auch 9.0 parallel laufen lassen (das ist, was ich tue, es funktioniert), so können Sie 8.4 für lokale Projekte behalten, die davon abhängen, aber 9.0 für diese eine Anwendung, die 9 verwendet : Auf lange Sicht wird es sich besser auszahlen als zu versuchen, einen Dump von einer anderen Version wiederherzustellen. – wildpeaks

+0

[Exportieren und Importieren von PostgresSQL mit pgAdmin III] (http://stackoverflow.com/a/39167526/1045444) –

Antwort

25

pg_restore ist nur für die Wiederherstellung von Dumps im "benutzerdefinierten" Format.

Wenn Sie ein „Klartext“ do-Dump Sie psql verwenden, um die generierten SQL-Skript auszuführen:

 
psql -f nvdls.db dbname username 
+0

Das hat es geschafft, danke! – Phrogz

3

Mit pg_dump/pg_restore 9,0-8,4 zu bewegen, wird nicht unterstützt - nur bewegt sich vorwärts unterstützt.

Sie können jedoch normalerweise die Daten über (in einem Daten-Dump) erhalten, und in einigen Fällen können Sie das Schema abrufen - aber das ist meistens Glück, es hängt davon ab, welche Funktionen Sie verwenden.

Normalerweise sollten Sie die Zielversion von pg_dump und pg_restore verwenden. In diesem Fall sollten Sie die Binärdateien von 8.4 verwenden. Aber Sie sollten die selbe Version von pg_dump und pg_restore verwenden. Beide Tools funktionieren problemlos über das Netzwerk. Daher sollte es nicht notwendig sein, die Binärdateien zu kopieren.

Und wie a_horse_with_no_name sagt, ist es besser, pg_dump im Klartext-Modus zu verwenden - damit können Sie den Speicherauszug bei Bedarf manuell bearbeiten. Insbesondere können Sie festlegen, dass nur ein Schema dump (mit -s) und nur ein Datenspeicherauszug erstellt wird - nur der Schema-Dump muss wahrscheinlich bearbeitet werden.

+0

Guter Vorschlag zum Dumping-Schema getrennt von Daten. Ich hatte ein paar Fehler mit dem Klartext, aber nichts ist nicht behebbar. Ich konnte nicht versuchen, pg_dump von der Dev-Maschine zu verwenden, da der Produktionsserver so konfiguriert ist, dass er entfernte Verbindungen nicht erlaubt, aber das klingt auch vielversprechend. – Phrogz

+1

Sie können es remote verwenden, solange Sie die SSH-Portweiterleitung (oder Ähnliches) verwenden können. –

2

Wenn die 9.0-Datenbank irgendwelche Bytea-Spalten enthält, warten größere Probleme auf.

werden diese Spalten von pg_dump exportiert werden, um die "hex" Darstellung verwenden und in Ihrer Dump-Datei erscheinen wie:

SELECT pg_catalog.lowrite (0, '\ x0a2')

Jede Version des Postgres Backend unter 9.0 kann die hexadezimale Darstellung von bytea nicht finden, und ich kann keine Option finden, pg_dump auf der Seite 9.0 zu sagen, sie nicht zu verwenden.Das Festlegen der Standardeinstellung "bytea_output" auf ESCAPE für die Datenbank oder den gesamten Server wird scheinbar von pg_dump ignoriert.

Ich nehme an, es wäre möglich, die Dump-Datei nachbearbeiten und tatsächlich jeden Hex-codierten Bytea-Wert in einen Escape-Code ändern, aber das Risiko, die Art der Dinge normalerweise in einem Bytea (Bilder, PDFs usw.) erregt mich nicht.

+0

Atleast in 9.2.2 die bytea_output Einstellungen sind jetzt für pg_dump gehorchen, so dass es auf 'Escape' stellen wird eine 8,4 kompatible Dump machen, zumindest für bytea Felder. Sie erhalten immer noch einige Warnungen über Verfahren. – jishi

2

Ich löste das, indem ich postgresql von 8.X zu 9.2.4 aufwertete. Wenn Sie mit brauen auf Mac OS-X verwenden -

brew upgrade postgresql 

Sobald dies geschehen ist, so stellen Sie sicher, dass Ihre neue Postgres-Installation an der Spitze des Pfades ist. Es sieht ungefähr so ​​aus (abhängig vom Installationspfad der Version) -

export PATH=/usr/local/Cellar/postgresql/9.2.4/bin:$PATH 
0

Ich hatte dasselbe Problem. Ich habe pgdump und psql für den Export/Import von DB verwendet.

1.Set PGPASSWORD

export PGPASSWORD='h0ld1tn0w'; 

2.Export DB mit pg_dump

pg_dump -h <<host>> -U <<username>> <<dbname>> > /opt/db.out 

/opt/db.out ist Dump-Pfad. Sie können Ihre eigenen angeben.

3.Dann stellen Sie erneut PGPASSWORD eines anderen Hosts ein. Wenn der Host identisch ist oder das Passwort gleich ist, ist dies nicht erforderlich.

4.Import db in Ihrem anderen Host

psql -h <<host>> -U <<username>> -d <<dbname>> -f /opt/db.out 

Wenn Benutzernamen unterscheidet dann mit Ihrem lokalen Benutzernamen in db.out Datei suchen und ersetzen. Und stellen Sie sicher, dass der Benutzername ersetzt wird und keine Daten.

Verwandte Themen