带-C选项的pg_restore不会创建数据库

时间:2016-11-24 11:00:29

标签: postgresql pg-dump pg-restore

我正在使用pg_dump和pg_restore来备份和恢复postgres数据库。

以下是与此问题相关的文档中的一些信息 对于Pg_restore,-C选项描述如下

  

-C

     

- 创建

     

在恢复之前创建数据库。如果还指定了--clean,则> >之前删除并重新创建目标数据库    连接到它。使用此选项时,数据库以-d命名    仅用于发出初始DROP DATABASE和CREATE DATABASE    命令。所有数据都将还原到显示的数据库名称中    存档。

但是,即使我在pg_restore中使用此选项,也会出现以下错误

  

pg_restore:[archiver(db)]与数据库“test”的连接失败:   致命:>数据库“test”不存在

根据描述,-C选项应该创建了缺少的数据库。但是在我的情况下并不适用。

以下是我为备份和恢复所做的步骤:

  1. 使用pg_dump备份数据库
  2. pg_dump -N backup -d test --format custom -v -h xxhostxx -p 5432 -U xxuserxx --lock-wait-timeout 300000 -f test_pg_dump.dmp
    

    注意:不使用-C选项,因为它仅对纯文本格式有意义

    1. 删除测试数据库

    2. 使用pg_resore恢复数据库

      pg_restore -C -d test -v -h xxhostxx -p 5432 -U xxuserxx test_pg_dump.dmp**
      
    3. 我无法理解这里的问题是什么!我做错了吗? 如果需要更多信息,请告诉我。

3 个答案:

答案 0 :(得分:4)

以下引用并不代表您可能认为的含义。在实现他们所说的话之前,我还必须阅读三次。

  

使用此选项时,仅使用以-d命名的数据库   发出初始DROP DATABASE和CREATE DATABASE命令。所有数据   将恢复为存档中显示的数据库名称。

这意味着pg_restore最初将连接到使用-d指定的数据库。它不会创建该数据库。它使用您要还原的存档中的名称创建一个数据库,并将数据还原到该数据库中。

答案 1 :(得分:4)

正如@Eelke所说 - 你已经在文件中写了'创建数据库'所以当你运行脚本时这个数据库不存在...那就是总有'postgres'数据库。试试这个:

pg_restore -C -d postgres -v -h xxhostxx -p 5432 -U xxuserxx test_pg_dump.dmp**

这应该:

  1. 连接到postgres数据库
  2. 创建测试数据库
  3. 断开与postgres的连接并连接到测试
  4. 将数据上传到数据库
  5. 当然检查谁是postgres数据库的所有者 - 在大多数情况下,你必须以用户'postgres'的形式运行它。

答案 2 :(得分:0)

对我来说从来没有用过,所以此命令创建了数据库

createdb -h HOST -U USER -W DB_NAME

然后执行pg restore

pg_restore -d DB_NAME -v -h HOST -p PORT -U USER DUMP_FILE.dump**

故事的结尾