无法在远程Linux VM上执行pg_restore SQL文件

时间:2016-10-27 18:57:43

标签: linux postgresql virtual-machine pg-restore

我使用PostgreSQL作为我的数据库。

我的远程Ubuntu VM上有 SCPed .sql 文件。

我做了sudo su - postgres并创建了一个数据库。

然后我切换回我的原始帐户并尝试了这个:

sudo -su postgres pg_restore < temp.sql

命令成功运行。

但当我再次切换回 postgres 用户并使用 \ dt 检查数据库的表格列表时,我找不到表格。

我做错了什么?

3 个答案:

答案 0 :(得分:7)

'pg_restore'用于恢复'pg_dump'生成的文件。

来自手册页

  

pg_restore是一个用于从中恢复PostgreSQL数据库的实用程序   由pg_dump(1)以非纯文本格式之一创建的存档。

https://www.postgresql.org/docs/9.2/static/app-pgrestore.html

如果您的文件是由pg_dump生成的,您可能至少需要告诉它要转储到哪个数据库:

pg_restore -d my_new_database temp.sql

我自己对不同风格的pg_restore的经验表明,很多时候我需要指定转储文件的格式,即使它是“本机”格式,尽管手册页指示它会检测格式。

pg_restore -d my_new_database -Fc temp.dump

这只是一个猜测,但我在想,如果表实际已经恢复,而没有指定数据库,则它们被转储到默认数据库中。您可以通过列出'postgres'数据库中的表来检查这一点(应该没有)。

postgres=#\c postgres
You are now connected to database "postgres" as user "postgres".
postgres=#\dt
No relations found.

如果您的表确实已恢复到默认数据库,则会列出它们。

纯文本SQL文件需要区别对待,通常使用psql通过SQL命令执行。

psql -d my_database < temp.sql

答案 1 :(得分:2)

假设您生成的数据库备份与此类似:

pg_dump -a --inserts databasename > exportfilename.sql

尝试像这样恢复文件:

psql databasename -f exportfilename.sql
上面提到的

Postgres pg_restore仅可与dump文件一起使用,不能像这样恢复它。在postgres.org官方网站上查看此答案

基本上,您不要pg_restoresql文件一起使用---> https://www.postgresql.org/message-id/AANLkTi%3DAqmWrUR4f8%2BEfCHzP%2BQrL1%3DunRLZp_jX7SoqF%40mail.gmail.com

答案 2 :(得分:0)

在具有psql用户的终端中运行ubuntu命令时,我遇到了同样的问题。该命令将以out of memory错误结束。

然后我用sudo -i -u postgres切换到postgres用户。

如上所述,我从那里简单地运行psql databasename -f databasefilebackup.sql