Frage

Ich habe einen Dump einer Datenbank mit dem Namen temp1 genommen, durch den follwing Befehl mit

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

Jetzt mag ich den Dump in einer anderen Datenbank wiederherstellen als „db_temp“, aber dadurch, dass ich nur wollen, dass alle Tabellen sollten in einem „temp_schema“ angelegt werden (nicht das Standardschema, das in der fms temp1 Datenbank) das ist in der „db_temp“ Datenbank.

Gibt es eine Möglichkeit, dies mit pg_restore Befehl zu tun?

auch eine andere Methode geschätzt werden!

War es hilfreich?

Lösung

Es gibt keinen Weg in pg_restore selbst. Was Sie tun können, ist die Verwendung pg_restore zu SQL Ausgabe zu erzeugen, und diese dann durch zum Beispiel sendet einen sed-Skript, es zu ändern. Sie müssen vorsichtig sein, wie Sie diesen sed-Skript schreiben, obwohl, so dass es nicht und ändert die Dinge in Ihren Daten überein.

Andere Tipps

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 Dump mit Ihrem bevorzugten Editor und fügen Sie die folgenden zwei Zeilen am Anfang der Datei:

create schema myschema;

SET search_path TO myschema;

Jetzt können Sie Ihren Backup-Dump mit dem Befehl

wiederherstellen

psql -f pub.backup.sql

Der set search_path to <schema> Befehl myschema als Standard festgelegt werden, so dass neue Tabellen und andere Objekte in diesem Schema erstellt werden, unabhängig von dem „default“ Schema, wo sie vorher gelebt.

Eine schnelle und schmutzige Art und Weise:

1) Umbenennungsstandardschema:

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) Umbenennungs Schemata nach Bedarf:

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

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 Sie es vor der Wiederherstellung nicht verändern können. Die Option wäre es, die Standard-Ausgabe zu verwenden und eine Suche und auf dem Schemanamen zu ersetzen, aber das wäre riskant und könnten vielleicht Ursache Daten beschädigt werden, wenn Sie nicht vorsichtig sind.

Wenn Sie nur ein paar Tische haben, dann können Sie eine Tabelle zu einem Zeitpunkt wiederherzustellen, nimmt pg_restore -d database wenn Sie -t tablename angeben. Natürlich werden Sie das Schema einrichten müssen, bevor die Tabellen wieder herstellt und dann aussortieren die Indizes und Einschränkungen, wenn Sie die Tabellen fertig sind wiederhergestellt wird.

Alternativ einen anderen Server auf einem anderen Port einrichten, stellen Sie die neue PostgreSQL-Server verwenden, benennen Sie das Schema, werfen Sie es, und in Ihre ursprüngliche Datenbank wiederherstellen. Das ist ein bisschen eine Flickschusterei natürlich, aber es wird den Job zu erledigen.

Wenn Sie abenteuerlich sind Sie vielleicht in der Lage sein, die Datenbanknamen in der Dump-Datei zu ändern, um einen Hex-Editor. Ich denke, es nur an einer Stelle in der Deponie erwähnt wird und solange die neuen und alten Datenbanknamen identisch sind, sollte es funktionieren. YMMV, tut nichts, wie dies in einer Produktionsumgebung nicht mir die Schuld, wenn diese Schläge und Ebene Ihre Heimatstadt, und die ganzen Rest der üblichen Haftungsausschluss.

Benennen Sie das Schema in einer temporären Datenbank.

Exportieren Sie das Schema:

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

Erstellen Sie eine neue Datenbank. Wiederherstellen des Exports:

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 nur den Satz search_path an der Spitze ändern.

Wie bereits erwähnt, gibt es keine direkte Unterstützung in pg_dump, psql oder pg_restore die Schemanamen während einer Müllhalde zu ändern / Wiederherstellungsprozess. Aber es ist ziemlich einfach Format „plain“ exportieren Sie dann die SQL-Datei ändern. Dieser Bash-Skript tut die Grundlagen:

rename_schema () {

  # Change search path so by default everything will go into the specified schema
  perl -pi -e "s/SET search_path = $2, pg_catalog/SET search_path = $3, pg_catalog, $2;/" "$1"

  # Change 'ALTER FUNCTION foo.' to 'ALTER FUNCTION bar.'
  perl -pi -e 's/^([A-Z]+ [A-Z]+) '$2'\./$1 '$3'./' "$1"

  # Change the final GRANT ALL ON SCHEMA foo TO PUBLIC
  perl -pi -e 's/SCHEMA '$2'/SCHEMA '$3'/' "$1"

}

Verbrauch:

pg_dump --format plain --schema=foo --file dump.sql MYDB
rename_schema dump.sql foo bar
psql -d MYDB -c 'CREATE SCHEMA bar;'
psql -d MYDB -f dumpsql
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top