使用不同的名称导出和导入PostgreSQL数据库?

有没有办法导出一个PostgreSQL数据库,然后用另一个名称导入它?

我在Rails中使用PostgreSQL,而且我经常从生产中导出数据,其中数据库名为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 

也许问题不是数据库,而是angular色?

如果我这样倾倒它:

 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脚本来修改转储。 我想避免这种解决scheme,但如果没有其他的select,我会采取。 有没有人写过脚本来改变转储的数据库名称,确保没有数据被改变?

解决scheme是这样倾倒:

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

并像这样导入它:

 psql blah_devel < blah.psql > /dev/null 

我仍然得到这个警告:

 WARNING: database "blah" does not exist 

但其余的似乎工作。

如果你正在创build一个文本转储,你可以导出数据库而不需要CREATE DATABASE位(即不要指定-cC选项到pg_dump )。 这将防止Postgres试图删除,创build和连接到数据库。

如果您使用的是某种归档格式,则可以指定pg_restore-d选项来命名要还原到的数据库。

请查看pg_dumppg_restore的手册页以获取更多详细信息,并且在生产系统上尝试此操作之前,请不要忘记安装一个临时猴子 ,以免遗漏一些重要的细节。

现在pg_restore有-d选项,您可以设置数据库名称来导入数据。

来源

pg_dump -v -Fc mydb.dmp mydb

目标

createdb -T template1 mydb2

pg_restore -v -e -d mydb2 mydb.dmp