导出和导入具有不同名称的PostgreSQL数据库?


39

有没有一种方法可以导出PostgreSQL数据库,然后再使用其他名称导入它?

我在PostgreSQL上使用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

也许问题不是真正的数据库,而是角色?

如果我这样转储它:

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脚本修改转储。我想避免这种解决方案,但是如果没有其他选择,我会采取。是否有人编写脚本来更改转储的数据库名称,以确保没有数据被更改?

Answers:


42

解决方案像这样转储它:

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

然后像这样导入它:

psql blah_devel < blah.psql > /dev/null

我仍然收到此警告:

WARNING:  database "blah" does not exist

但其余的似乎有效。


2
您是一位救命者:)
Sri Harsha Kappala

救生员兄弟:)
您知道谁

11

如果您正在创建文本转储,则可以不带CREATE DATABASE位地导出数据库(即,不指定-cC选项- pg_dump);这将防止Postgres尝试删除,创建和连接数据库。

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

检查的手册页pg_dumppg_restore更多的细节,不要忘记安装一个从无到有猴子尝试这种在情况下,我留下了一些重要的细节,生产系统之前。


谢谢。我将-da与pg_restore一起尝试,但是我暂时将其作为文本转储,在pg_dump中我既未指定-c也未指定-C。我只是在叫pg_dump数据库名。我想念什么吗?
pupeno

没有选项的情况下,pg_dump应该创建一个转储,然后将其还原到所连接的任何数据库中(自从我进行了文本转储并将其还原到另一个数据库已有一段时间了,但是如果没有CREATE\connect位,则执行文本转储中的SQL无论您身在何处,何时都\i转储文件
voretaq7 2011年

缺省情况下,文本或二进制模式下的pg_dump提及数据库名称的次数很多。
pupeno 2011年

6

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

来源

pg_dump -v -Fc mydb.dmp mydb

在目标上

createdb -T template1 mydb2

pg_restore -v -e -d mydb2 mydb.dmp


3
这种语法对我pg_dump -v -Fc mydb > mydb.dmp有用:(pg_dump v9.4.5)。
Paolo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.