Ekspor dan impor database PostgreSQL dengan nama yang berbeda?

39

Apakah ada cara untuk mengekspor database PostgreSQL dan kemudian mengimpornya dengan nama lain?

Saya menggunakan PostgreSQL dengan Rails dan saya sering mengekspor data dari produksi, di mana database disebut blah_production dan mengimpornya pada pengembangan atau pementasan dengan nama blah_development dan blah_staging. Pada MySQL ini sepele karena ekspor tidak memiliki basis data di mana pun (kecuali komentar mungkin), tetapi pada PostgreSQL sepertinya tidak mungkin. Apakah itu tidak mungkin?

Saya sedang membuang database dengan cara ini:

pg_dump blah > blah.dump

Saya tidak menggunakan opsi -c atau -C. Tumpukan itu berisi pernyataan seperti:

COMMENT ON DATABASE blah IS 'blah';

ALTER TABLE public.checks OWNER TO blah;

ALTER TABLE public.users OWNER TO blah;

Ketika saya mencoba mengimpor

psql blah_devel < blah.dump

saya mendapat

WARNING:  database "blah" does not exist

ERROR:  role "blah" does not exist

Mungkin masalahnya bukan database tapi perannya?

Jika saya membuangnya dengan cara ini:

pg_dump --format=c blah > blah.dump

dan coba impor dengan cara ini:

pg_restore -d blah_devel < tmp/blah.psql

Saya mendapatkan kesalahan ini:

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

Ada ide?

Saya telah melihat di luar sana beberapa orang menggunakan skrip sed untuk memodifikasi dump. Saya ingin menghindari solusi itu tetapi jika tidak ada alternatif saya akan mengambilnya. Adakah yang menulis naskah untuk mengubah nama basis data dump untuk memastikan tidak ada data yang pernah diubah?

pupeno
sumber

Jawaban:

42

Solusinya adalah membuangnya seperti ini:

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

dan mengimpornya seperti ini:

psql blah_devel < blah.psql > /dev/null

Saya masih mendapatkan peringatan ini:

WARNING:  database "blah" does not exist

tetapi sisanya tampaknya berhasil.

pupeno
sumber
2
Anda adalah penyelamat hidup :)
Sri Harsha Kappala
life saver bro :)
Anda tahu siapa
11

Jika Anda membuat dump teks, Anda dapat mengekspor basis data tanpa CREATE DATABASEbit (mis. Jangan tentukan -cdan - Copsi untuk pg_dump); Ini akan mencegah Postgres dari mencoba menjatuhkan, membuat & terhubung ke database.

Jika Anda menggunakan salah satu format arsip, Anda dapat menentukan -dopsi untuk pg_restorememberi nama basis data yang ingin Anda pulihkan.

Periksa halaman manual untuk pg_dumpdan pg_restoreuntuk lebih jelasnya, dan jangan lupa untuk memasang monyet gores sebelum Anda mencoba ini pada sistem produksi jika saya meninggalkan beberapa detail penting.

voretaq7
sumber
Terima kasih. Saya akan memberikan -da coba dengan pg_restore, tapi saya untuk saat ini, membuangnya sebagai teks dan di pg_dump saya tidak menentukan -c maupun -C. Saya hanya memanggil databasename pg_dump. Apakah saya melewatkan sesuatu?
pupeno
tanpa opsi pg_dumpharus membuat dump yang Anda kembalikan ke database apa pun yang terhubung dengan Anda (sudah lama sejak saya melakukan dump teks & dikembalikan ke DB yang berbeda, tetapi jika tidak ada CREATE& \connectbit SQL dalam dump teks dieksekusi dimanapun Anda berada saat Anda \i
men -port
pg_dump dalam mode teks atau biner, secara default, memiliki banyak sebutan nama database.
pupeno
6

Sekarang pg_restore memiliki opsi -d dan Anda dapat mengatur nama database untuk mengimpor data.

pada sumber :

pg_dump -v -Fc mydb.dmp mydb

on dest :

Createdb -T template1 mydb2

pg_restore -v -e -d mydb2 mydb.dmp

Dmitry Kremer
sumber
3
Sintaks ini bekerja untuk saya: pg_dump -v -Fc mydb > mydb.dmp(pg_dump v9.4.5).
Paolo