it-swarm.com.de

Ich möchte die Datenbank mit einem anderen Schema wiederherstellen

Ich habe einen Speicherauszug einer Datenbank mit dem Namen temp1 erstellt, indem Sie den folgenden Befehl verwenden 

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

Jetzt möchte ich den Speicherauszug in einer anderen Datenbank namens "db_temp" wiederherstellen, aber ich möchte nur, dass alle Tabellen in einem "temp_schema" erstellt werden (nicht das Standardschema, das sich in der fms temp1-Datenbank befindet) die Datenbank "db_temp". 

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

Jede andere Methode wird auch geschätzt!

49
abubacker

In pg_restore selbst gibt es keine Möglichkeit. Sie können pg_restore verwenden, um eine SQL-Ausgabe zu generieren, und diese zum Beispiel durch ein Sed-Skript senden, um sie zu ändern. Sie müssen jedoch vorsichtig sein, wie Sie das sed-Skript schreiben, damit es nicht zu Übereinstimmungen in Ihren Daten passt.

9
Magnus Hagander

Es gibt eine einfache Lösung: 

  • Erstellen Sie einen Sicherungsdump im einfachen SQL-Format (Format "p" mit dem Parameter --format=p oder -F p).
  • Bearbeiten Sie Ihren pub.backup.sql-Dump mit Ihrem bevorzugten Editor und fügen Sie die folgenden zwei Zeilen am Anfang Ihrer Datei ein:

create schema myschema;

SET search_path TO myschema;

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

psql -f pub.backup.sql

Mit dem Befehl set search_path to <schema> wird myschema als Standard festgelegt, sodass neue Tabellen und andere Objekte in diesem Schema erstellt werden, unabhängig von dem "Standardschema", in dem sie zuvor gelebt haben.

54
fraber

Ein schneller und schmutziger Weg:

1) Standardschema umbenennen:

alter schema public rename to public_save;

2) Neues Schema als Standardschema erstellen:

create schema public;

3) Daten wiederherstellen

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

4) Schemata nach Bedarf umbenennen:

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

Die einfachste Methode wäre wahrscheinlich, das Schema nach der Wiederherstellung einfach umzubenennen, dh mit der folgenden SQL:

ALTER SCHEMA my_schema RENAME TO temp_schema

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

10
Hamish

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 einrichten, bevor Sie die Tabellen wiederherstellen, 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, die Wiederherstellung mit dem neuen PostgreSQL-Server durchführen, das Schema umbenennen, einen Dump erstellen und die ursprüngliche Datenbank wiederherstellen. Dies ist natürlich ein bisschen kludge, aber es wird die Arbeit erledigen.

Wenn Sie abenteuerlustig sind, können Sie möglicherweise den Datenbanknamen in der Sicherungsdatei mit einem Hex-Editor ändern. Ich denke, es wird nur an einer Stelle im Dump erwähnt und solange die neuen und alten Datenbanknamen gleich sind, sollte es funktionieren. YMMV, machen Sie so etwas in einer Produktionsumgebung nicht, beschuldigen Sie mich nicht, wenn dies explodiert und Ihre Heimatstadt und alle anderen üblichen Ausschlussklauseln auf eine Stufe bringt.

3
mu is too short

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

Exportieren Sie das Schema:

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

Erstellen Sie eine neue Datenbank. Den Export wiederherstellen:

psql -f prod.sql

ALTER SCHEMA prod RENAME TO somethingelse;

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

(Datenbank löschen)

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

2
Sico

Wie bereits erwähnt, gibt es in pg_dump, psql oder pg_restore keine direkte Unterstützung, um den Schemanamen während eines Dump-/Restore-Prozesses zu ändern. Es ist jedoch ziemlich einfach, das Format "plain" zu exportieren und dann die .sql-Datei zu ändern. Dieses Bash-Skript führt die Grundlagen aus:

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"

}

Verwendungszweck:

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
0
Steve Bennett