Frage Exportieren und importieren Sie eine PostgreSQL-Datenbank unter einem anderen Namen?


Gibt es eine Möglichkeit, eine PostgreSQL-Datenbank zu exportieren und später unter einem anderen Namen zu importieren?

Ich benutze PostgreSQL mit Rails und ich exportiere oft die Daten aus der Produktion, wo die Datenbank blah_production heißt und diese bei der Entwicklung oder Inszenierung mit den Namen blah_development und blah_staging importiert. Auf MySQL ist das trivial, da der Export die Datenbank nirgends hat (außer vielleicht einen Kommentar), aber auf PostgreSQL scheint es unmöglich zu sein. Es ist unmöglich?

Ich lade gerade die Datenbank auf diese Weise herunter:

pg_dump blah > blah.dump

Ich verwende nicht die Optionen -c oder -C. Dieser Dump enthält Anweisungen wie:

COMMENT ON DATABASE blah IS 'blah';

ALTER TABLE public.checks OWNER TO blah;

ALTER TABLE public.users OWNER TO blah;

Wenn ich versuche mit zu importieren

psql blah_devel < blah.dump

Ich bekomme

WARNING:  database "blah" does not exist

ERROR:  role "blah" does not exist

Vielleicht ist das Problem nicht wirklich die Datenbank, sondern die Rolle?

Wenn ich es auf diese Weise ablege:

pg_dump --format=c blah > blah.dump

und versuche es so zu importieren:

pg_restore -d blah_devel < tmp/blah.psql

Ich bekomme diese Fehler:

pg_restore: WARNING:  database "blah" does not exist
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 1513; 1259 16435 TABLE checks blah
pg_restore: [archiver (db)] could not execute query: ERROR:  role "blah" does not exist
    Command was: ALTER TABLE public.checks OWNER TO blah;
pg_restore: [archiver (db)] Error from TOC entry 1509; 1259 16409 TABLE users blah
pg_restore: [archiver (db)] could not execute query: ERROR:  role "blah" does not exist
    Command was: ALTER TABLE public.users OWNER TO blah;
pg_restore: [archiver (db)] Error from TOC entry 1508; 1259 16407 SEQUENCE users_id_seq blah
pg_restore: [archiver (db)] could not execute query: ERROR:  role "blah" does not exist
    Command was: ALTER TABLE public.users_id_seq OWNER TO blah;
pg_restore: [archiver (db)] Error from TOC entry 1824; 0 0 ACL public postgres
pg_restore: [archiver (db)] could not execute query: ERROR:  role "postgres" does not exist
    Command was: REVOKE ALL ON SCHEMA public FROM postgres;
pg_restore: [archiver (db)] could not execute query: ERROR:  role "postgres" does not exist
    Command was: GRANT ALL ON SCHEMA public TO postgres;
WARNING: errors ignored on restore: 11

Irgendwelche Ideen?

Ich habe dort einige Leute gesehen, die sed-Skripte benutzen, um den Dump zu modifizieren. Ich möchte diese Lösung vermeiden, aber wenn es keine Alternative gibt, nehme ich sie. Hat jemand ein Skript geschrieben, um den Datenbanknamen des Speicherauszugs zu ändern, um sicherzustellen, dass keine Daten jemals geändert werden?


36
2018-01-28 15:31


Ursprung




Antworten:


Die Lösung war so:

pg_dump --no-owner --no-acl blah > blah.psql

und importiere es so:

psql blah_devel < blah.psql > /dev/null

Ich bekomme immer noch diese Warnung:

WARNING:  database "blah" does not exist

aber der Rest scheint zu funktionieren.


40
2018-01-29 20:48



Du bist ein Lebensretter :) - Sri Harsha Kappala
Lebensretter Bro :) - You knows who


Wenn Sie einen Text-Dump erstellen, können Sie die Datenbank ohne den exportieren CREATE DATABASE Bits (d. h. nicht angeben -c und -C Optionen zu pg_dump); Dadurch wird verhindert, dass Postgres versucht, Dateien zu löschen, zu erstellen und eine Verbindung mit der Datenbank herzustellen.

Wenn Sie eines der Archivformate verwenden, können Sie das angeben -d Option zu pg_restore um die Datenbank zu benennen, die Sie wiederherstellen möchten.

Überprüfen Sie die Manpages für pg_dump und pg_restore für weitere Details, und vergessen Sie nicht, ein Kratzaffen bevor Sie dies auf Produktionssystemen versuchen, falls ich ein wichtiges Detail weggelassen habe.


11
2018-01-28 15:51



Vielen Dank. Ich gebe -d einen Versuch mit pg_restore, aber ich bin für den Moment, dumping es als Text und in pg_dump Ich gebe weder -c noch -C an. Ich rufe gerade pg_dump Datenbankname an. Fehle ich etwas? - pupeno
ohne Optionen pg_dump sollte einen Dump erstellen, den Sie in der Datenbank wiederherstellen, mit der Sie verbunden sind (es ist eine Weile her, dass ich einen Text-Dump gemacht und in einer anderen DB wiederhergestellt habe, aber wenn es keine gibt CREATE & \connect Bits die SQL in der Text-Dump wird ausgeführt, wo immer Sie sind, wenn Sie sind \i Mportieren Sie die Dump-Datei. - voretaq7
pg_dump im Text- oder Binärmodus hat standardmäßig viele Erwähnungen des Datenbanknamens. - pupeno


Jetzt hat pg_restore die Option -d und Sie können den Datenbanknamen für das Importieren von Daten festlegen.

auf Quelle:

pg_dump -v -Fc meindb.dmp meindb

auf dest:

createdb -T schablonen1 mydb2

pg_restore -v -e -d meindb2 meindb.dmp


6
2017-12-09 08:07



Diese Syntax funktionierte für mich: pg_dump -v -Fc mydb > mydb.dmp (pg_dump v9.4.5). - Paolo