Postgresql转储在导入数据时不会纠正数据库

时间:2013-02-07 18:21:52

标签: ruby-on-rails postgresql amazon-ec2

我的目标是将.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

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

2 个答案:

答案 0 :(得分:4)

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

Dump: 

$ pg_dump dbname > outfile

Restore:

$ psql dbname < infile

不使用该方法的任何特殊原因?

答案 1 :(得分:0)

在输出的顶部相当清楚地说:

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

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

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