我正在使用pg_dump(PostgreSQL)9.2.4。
我有一个包含两个不同模式的数据库,这些模式具有相同的表名。
- mydatabase
- schema_a
- mytable
- someothertable
- schema_b
- mytable
- another table
我想将orig_host中的schema_a.mytable和schema_b.mytable复制到new_host。我登录到new_host并输入:
% psql -c "drop schema schema_a cascade" mydatabase
% psql -c "create schema schema_a" musicbrainz_db
% pg_dump -h orig_host -n schema_a -t mytable mydatabase | psql mydatabase
没问题,但是当我为schema_b做同样的事情时,我会遇到冲突:
% psql -c "drop schema schema_b cascade" mydatabase
% psql -c "create schema schema_b" musicbrainz_db
% pg_dump -h orig_host -n schema_b -t mytable mydatabase | psql mydatabase
ERROR: relation "artist" already exists
我通过将最后一个命令转储到一个文件来确认它将搜索路径设置为schema_a,这会导致失败。如果我这样做似乎确实有用
%pg_dump -h orig_host -t schema_b.mytable mydatabase | psql mydatabase
但是-n开关不应该在这里工作吗?
答案 0 :(得分:2)
来自manual -
使用-t时,-n和-N开关无效,因为-t选择的表将被转储而不管这些开关如何,并且不会转储非表对象。
您的search_path中可能有schema_a,这就是第一个命令有效的原因。
答案 1 :(得分:0)
看看生成的SQL。我相信你应该看到的是:
也就是说,选项是附加的。
我猜测的意图是模式S很可能依赖于一个或两个其他表,因此您可以将它们全部转储。