2010-11-16 3 views
34

Dear All,
ich einen Dump einer Datenbank namens TEMP1 genommen haben wiederherstellen
den follwing BefehlIch möchte die Datenbank mit einem anderen Schema

$ pg_dump -i -h localhost -U postgres -F c -b -v -f pub.backup temp1 

Jetzt möchte ich den Dump in einem anderen wiederherstellen Datenbank namens "db_temp", aber ich möchte nur, dass alle Tabellen in einem "temp_schema" (nicht das Standardschema, das in der Datenbank fms temp1 ist) in der Datenbank "db_temp" erstellt werden soll.

Gibt es eine Möglichkeit, dies zu tun mit pg_restore Befehl
Jede andere Methode auch geschätzt werden!
Vielen Dank im Voraus!

+6

ich kann einfach nicht akzeptieren, dass dies noch im Jahr 2017 passiert, und die Lösung besteht darin, die Dump-Datei zu hacken. – Sharky

Antwort

9

In pg_restore selbst gibt es keinen Weg. Was Sie tun können, ist mit pg_restore zu generieren SQL-Ausgabe, und dann senden Sie dies durch zum Beispiel ein Sed Skript, um es zu ändern. Sie müssen jedoch darauf achten, wie Sie dieses sed-Skript schreiben, damit es nicht mit Ihren Daten übereinstimmt und sie ändert.

7

Wahrscheinlich wäre die einfachste Methode, um einfach das Schema zu umbenennen nach der Wiederherstellung, dh mit der folgenden SQL:

ALTER SCHEMA my_schema RENAME TO temp_schema 

Ich glaube, dass, weil Sie das komprimierte Archiv-Format für die Ausgabe von pg_dump verwenden können Sie ändere es vor dem Wiederherstellen nicht. Die Option wäre, die Standardausgabe zu verwenden und den Schemanamen zu suchen und zu ersetzen, aber das wäre riskant und könnte möglicherweise dazu führen, dass Daten beschädigt werden, wenn Sie nicht vorsichtig sind.

+0

Diese Lösung kann viel Unordnung machen, ist es nicht – abubacker

+3

In welcher Weise ?? Die SQL-Anweisung ist die einzige sichere Methode zum Ändern eines Schemanamens. Die andere Lösung wird auch in einer anderen Antwort vorgeschlagen und wir erklären beide, dass es riskant ist. Schlechtes Downvoting. – Hamish

+1

Ich habe den Schemanamen geändert, aber danach kann ich den Suchpfad nicht mehr ändern! Der Benutzer kann nach dem Umbenennen keine Tabelle durchsuchen! –

3

Wenn Sie nur wenige Tabellen haben, können Sie jeweils eine Tabelle wiederherstellen, pg_restore akzeptiert -d database, wenn Sie -t tablename angeben. Natürlich müssen Sie das Schema vor dem Wiederherstellen der Tabellen einrichten und dann die Indizes und Einschränkungen sortieren, wenn Sie die Tabellen wiederhergestellt haben.

Alternativ können Sie einen anderen Server an einem anderen Port einrichten, den neuen PostgreSQL-Server wiederherstellen, das Schema umbenennen, es ablegen und in Ihre ursprüngliche Datenbank wiederherstellen. Das ist natürlich ein bisschen ein Klümpchen, aber es wird den Job erledigen.

Wenn Sie abenteuerlustig sind, können Sie möglicherweise den Datenbanknamen in der Dump-Datei mit einem Hex-Editor ändern. Ich denke, dass es nur an einer Stelle im Dump erwähnt wird und solange die neuen und alten Datenbanknamen identisch sind, sollte es funktionieren. YMMV, mach sowas in einer Produktionsumgebung nicht, beschuldige mich nicht, wenn das explodiert und deine Heimatstadt nivelliert, und all den Rest der üblichen Disclaimer.

32

Eine schnelle und schmutzige Art und Weise:

1) umbenennen Standardschema:

alter schema public rename to public_save; 

2) erstellen neues Schema als Standardschema:

create schema public; 

3) Wiederherstellen von Daten

pg_restore -f pub.backup db_temp [and whatever other options] 

4) Renam e-Schemata nach Bedarf:

alter schema public rename to temp_schema; 
alter schema public_save rename to public; 
44

Es gibt eine einfache Lösung:

  • Erstellen Sie Ihren Backup-Dump im Klar SQL-Format (Format "p" mit dem Parameter "--format = p" oder " -F p ")
  • Bearbeiten Sie Ihre pub.backup.sql mit Ihrem bevorzugten Editor Dump und die folgenden zwei Zeilen am Anfang der Datei hinzufügen:

Schema erstellen meinschema;

SET Suchpfad TO myschema;

Jetzt können Sie Ihre Backup-Dump mit dem

Befehl restore

psql -f pub.backup.sql

Die "search_path auf" Befehl myschema als Standard festgelegt wird, damit neue Tabellen und andere Objekte in diesem Schema erstellt werden, unabhängig vom "Standardschema", in dem sie zuvor gelebt haben.

+0

Gibt es eine nette Möglichkeit, nur den Kopf einer großen Dump-Datei zu bearbeiten? Sogar solche Dinge beinhalten das Duplizieren: http: // Superuser.com/questions/246837/How-Do-ich-Add-Text-zum-Anfang-einer-Datei-in-Bash –

+0

@PeterEhrlich Je nachdem, wie groß Ihre Dateien sind und verfügbaren RAM, können Sie vim verwenden Öffnen Sie eine Gzip'd-Dump-Datei direkt. Es wird immer noch im Speicher erweitert, aber ich konnte eine 750 MB (.gz) Datei mit nur einer kurzen Pause beim Speichern öffnen, bearbeiten und speichern. YMMV. – David

+0

Ich fand meine Dumps bereits einen oder mehrere SET search_path TO ...; Zeilen, die ich entfernen musste. Möglicherweise möchten Sie beim Bearbeiten und vor dem Wiederherstellen nach "search_path" suchen. Sie haben mindestens einen SET search_path TO ...; Zeile für jedes Schema, aus dem Objekte ausgegeben wurden. Es wäre schön, wenn es eine Option ohne Schema gäbe, die wie die Option --no-owner funktioniert. – David

0

Benennen Sie das Schema in einer temporären Datenbank um.

Export das Schema:

pg_dump --schema-only --schema=prod > prod.sql 

eine neue Datenbank erstellen. Wiederherstellen der Export:

psql -f prod.sql 

ALTER SCHEMA prod RENAME TO somethingelse; 

pg_dump --schema-only --schema=somethingelse > somethingelse.sql 

(löschen die Datenbank)

Für die Daten können Sie einfach ändern Sie den Satz search_path an der Spitze.

Verwandte Themen