Ich mag die Datenbank mit einem anderen Schema wiederherstellen
-
10-10-2019 - |
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!
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