1

我的目标是将 .sql 转储从我的服务器导入到 project_devel 数据库中。我遇到了一个令人沮丧的问题,当我从 .sql 文件加载数据时, -d [databasename] 选项似乎被忽略了。相反(您可以在输出中看到大约 12 行),.sql 文件可能会告诉导入器导入另一个数据库。关于为什么会发生这种情况以及如何强制数据进入我用 -d 指定的数据库的任何线索?

我最终通过将我在 database.yml 中的开发数据库名称更改为 project_prod 对其进行了创可贴,因为我的目标只是在本地加载生产数据并调试一些东西。

我用来导入的命令:

YeastFlakes:newproject new$ psql -h /tmp -d project_devel -f prod_dump_2013-02-07_09-00.sql 

输出:

You are now connected to database "postgres" as user "new".
    SET
    SET
    SET
    psql:prod_dump_2013-02-07_09-00.sql:15: ERROR:  role "project" already exists
    ALTER ROLE
    psql:prod_dump_2013-02-07_09-00.sql:17: ERROR:  role "postgres" already exists
    ALTER ROLE
    psql:prod_dump_2013-02-07_09-00.sql:19: ERROR:  role "replication" already exists
    ALTER ROLE
    psql:prod_dump_2013-02-07_09-00.sql:31: ERROR:  database "project_prod" already exists
    REVOKE
    REVOKE
    GRANT
    GRANT
    You are now connected to database "project_prod" as user "new".
    SET
    SET
    SET
    SET
    SET
    SET
    CREATE EXTENSION
    COMMENT
    SET
    SET
    SET
    psql:prod_dump_2013-02-07_09-00.sql:85: ERROR:  relation "active_admin_comments" already exists
    ALTER TABLE
    psql:prod_dump_2013-02-07_09-00.sql:99: ERROR:  relation "active_admin_comments_id_seq" already exists

输出持续一段时间......

4

2 回答 2

4

PostgreSQL 文档似乎采用了一种非常简单的 SQL 转储/恢复方法;

Dump: 

$ pg_dump dbname > outfile

Restore:

$ psql dbname < infile

有什么特别的理由不使用这种方法吗?

于 2013-02-07T18:29:09.283 回答
0

它在您的输出顶部相当清楚地表明:

You are now connected to database "postgres" as user "new".
...
You are now connected to database "project_prod" as user "new".

如果您查看备份的前二十行左右,我认为您没有看到任何看起来像“连接”命令的东西?可能将数据库“postgresql”作为用户“new”,然后另一个数据库“project_prod”再次作为用户“new”?

哦 - 如果您不打算真正查看文件内部,那么将其作为原始 SQL 转储是没有意义的。不妨使用压缩的“自定义”格式,并为您提供使用 pg_restore 恢复单个/选定元素的选项。有关详细信息,请参阅广泛而详细的手册。

于 2013-02-07T18:38:26.547 回答