2016-11-24 277 views
1

我正在使用pg_dump和pg_restore来备份和还原postgres数据库。带-C选项的pg_restore不会创建数据库

下面是从文档的一些信息,这将是对有关这个问题的 对于pg_restore的,-c选项描述如下

-C

--create

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

但是,即使当我使用和pg_restore这个选项,我获得以下错误

pg_restore的:归档(DB)连接到数据库的 “测试” 失败: FATAL:>数据库 “测试”不存在

根据描述-C选项应该已经创建了缺失的数据库。但它不适用于我的情况。

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

  1. 使用pg_dump的备份数据库
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** 
    

我不明白这里的问题是!我做错了什么? 让我知道是否需要更多信息。

回答

1

酷似@Eelke说 - 你得在文件中写道:“创建数据库”所以,当你运行脚本这个数据库中不存在......这是什么,通常会有“Postgres的数据库。试试这个:

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

,这应该:

  1. 连接到Postgres数据库
  2. 创建测试数据库从Postgres的
  3. 断开,并连接到测试
  4. 上传数据到数据库

当然检查谁是奥尼r的postgres数据库 - 在大多数情况下,你必须以用户'postgres'运行。

+0

谢谢@Jendrusk – Swapnil17

+0

在这个命令中有一个错误的人可能不会注意到:''postgres -v'应该是'postgres- v'。我无法在帖子中编辑少于6个字符。 – adamczi

3

以下引用并不意味着您可能认为它的含义。在意识到他们在说什么之前,我还必须读三遍。

当使用这个选项,和-d在一起的数据库仅用于 发行初始DROP DATABASE和CREATE DATABASE命令。所有数据 已恢复到存档中显示的数据库名称中。

这意味着pg_restore最初将连接到使用-d指定的数据库。它不会创建该数据库。它使用正在恢复的归档的名称创建一个数据库,并将数据恢复到该数据库中。

+0

这是否意味着你不能恢复数据库,如果它不存在? 要恢复需要发出命令,首先创建一个空数据库,然后恢复? – Swapnil17

+0

@ Swapnil17:你总是有一个空的数据库:'template1' –

+0

谢谢@Eelke和'a_horse_with_no_name' – Swapnil17