为什么pg_restore返回成功但实际上并没有恢复我的数据库?

82

我有一个安装在Linux服务器上的Postgres 8.4数据库,我使用以下命令进行了转储:

pg_dump --format=c --exclude-table=log --file=/path/to/output my_db

然后我通过FTP将创建好的文件传输到我的本地Windows 7机器,并尝试使用以下命令将文件恢复到我的本地Postgres 8.4实例:

pg_restore --create --exit-on-error --verbose c:\path\to\file

恢复命令会生成大量输出,声称已创建了我的数据库,并连接到它,然后按预期创建了所有其他表。但是,当我通过pgAdmin在本地计算机上查看数据库时,恢复的数据库根本不存在。

为了排除问题,我尝试了以下命令:

pg_restore --create --exit-on-error --verbose --host=blahblah --username=no_one c:\path\to\file
当我运行这个命令时,即使给定的主机名和用户名完全是无意义的,我仍然从命令得到完全相同的输出,没有任何错误。有人遇到过这种情况吗?或者知道可能是什么原因导致这种情况发生?
3个回答

137

你需要添加一个有效的数据库名称来进行初始连接,否则它只会将内容转储到STDOUT:

pg_restore --create --exit-on-error --verbose --dbname=postgres <backup_file>

75
为什么在pg_restore文档中没有提到big fat red?! - Yo Ludke
11
6年后,我遇到了同样的问题,最终偶然找到了这个能解决问题的答案。我无法相信文档仍未修复,或者命令输出中没有任何信息让用户知道它实际上并没有执行任何操作。对于新手来说,使用 PostgreSQL 存在严重的可用性问题。 - James
2
告诉我吧。至少浪费了两个小时。公平地说:这在手册的第二段中有说明。 - jnns
6
@YoLudke 因为PostgreSQL文档是世界上最糟糕的文档。 - Marco Prins
3
好的,我以为只有我觉得这些文档难以理解。 - user798719
显示剩余3条评论

11

这仍然很令人困惑,我试图执行这个东西,--dbname应该是我想创建的数据库。

pg_restore --create --exit-on-error --verbose --dbname=jiradb jiradb.tar

错误!!

实际上应该是--dbname=postgres,然后使用--create选项从文件名创建真正的数据库。在我的情况下,我使用tar备份进行了还原。

pg_restore --create --exit-on-error --verbose --dbname=postgres jiradb.tar

1
我刚刚使用 --dbname=my_specific_db 而不是 =postgres 运行了它,它可以正常工作... 我想知道自从你的回答以来是否有什么变化? - Josh.F
@Josh.F 这取决于 my_specific_db 是否已经存在。 - rooby

0
你实际上可以使用以下方法创建你试图插入的数据库:
createdb new-db -h HOST -p PORT -U USER

但这可能不会解决问题。
您必须确保要恢复的数据库与您备份的数据库名称相同(使用pg_dump)。
对我来说,备份数据库的名称实际上是默认的数据库名称,即postgres。再次确保数据库的名称(-d标志)与您备份的数据库名称相同。
所以对我来说,这个命令起作用了:
pg_restore -vFd -d postgres backups/location -j 5 --create -h HOST -p PORT -U USERNAME

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接