pg_dump忽略用-n指定的模式

时间:2014-08-11 18:52:00

标签: postgresql

我正在使用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开关不应该在这里工作吗?

2 个答案:

答案 0 :(得分:2)

来自manual -

  

使用-t时,-n和-N开关无效,因为-t选择的表将被转储而不管这些开关如何,并且不会转储非表对象。

您的search_path中可能有schema_a,这就是第一个命令有效的原因。

答案 1 :(得分:0)

看看生成的SQL。我相信你应该看到的是:

  1. schema_a
  2. 中的所有内容
  3. 所有名为* .mytable
  4. 的表格

    也就是说,选项是附加的。

    我猜测的意图是模式S很可能依赖于一个或两个其他表,因此您可以将它们全部转储。