Есть ли способ экспортировать базу данных PostgreSQL, а затем импортировать ее под другим именем?
Я использую PostgreSQL с Rails и часто экспортирую данные из производства, где база данных называется blah_production, и импортирую их при разработке или подготовке с именами blah_development и blah_staging. В MySQL это тривиально, так как экспорт не имеет базы данных нигде (кроме комментариев), но в PostgreSQL это кажется невозможным. Это невозможно?
В настоящее время я сбрасываю базу данных следующим образом:
pg_dump blah > blah.dump
Я не использую опции -c или -C. Этот дамп содержит такие утверждения, как:
COMMENT ON DATABASE blah IS 'blah';
ALTER TABLE public.checks OWNER TO blah;
ALTER TABLE public.users OWNER TO blah;
Когда я пытаюсь импортировать с
psql blah_devel < blah.dump
я получил
WARNING: database "blah" does not exist
ERROR: role "blah" does not exist
Может быть, проблема не в базе данных, а в роли?
Если я дам это так:
pg_dump --format=c blah > blah.dump
и попробуйте импортировать это так:
pg_restore -d blah_devel < tmp/blah.psql
Я получаю эти ошибки:
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
Любые идеи?
Я видел там людей, использующих сценарии sed для изменения дампа. Я бы хотел избежать этого решения, но если нет альтернативы, я его приму. Кто-нибудь написал скрипт для изменения имени базы данных дампа, чтобы гарантировать, что данные никогда не изменяются?