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

ami*_*ion 8 linux postgresql virtual-machine pg-restore

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

我已经SCPed一个.SQL在我的远程Ubuntu虚拟机文件.

我做了sudo su - postgres并创建了一个DB.

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

sudo -su postgres pg_restore < temp.sql

该命令成功运行.

但当我再次切换回postgres用户并使用\ dt检查数据库中的表列表时,我发现没有表格.

我究竟做错了什么?

小智 11

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

从手册页

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

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

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

pg_restore -d my_new_database temp.sql
Run Code Online (Sandbox Code Playgroud)

我自己对不同风格的pg_restore的体验表明,我需要多次指定转储文件的格式,即使它是"本机"格式,尽管手册页指示它会检测格式.

pg_restore -d my_new_database -Fc temp.dump
Run Code Online (Sandbox Code Playgroud)

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

postgres=#\c postgres
You are now connected to database "postgres" as user "postgres".
postgres=#\dt
No relations found.
Run Code Online (Sandbox Code Playgroud)

如果您的表确实还原到默认数据库,则会列出它们.

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

psql -d my_database < temp.sql
Run Code Online (Sandbox Code Playgroud)


d1j*_*i1b 5

假设您生成了类似于以下内容的数据库备份:

pg_dump -a --inserts databasename > exportfilename.sql
Run Code Online (Sandbox Code Playgroud)

尝试像这样恢复您的文件:

psql databasename -f exportfilename.sql
Run Code Online (Sandbox Code Playgroud)

pg_restore上面提到的Postgres仅用于dump文件,您不能像那样恢复它。在官方 postgres.org 网站上查看此答案

基本上你不要使用pg_restore与sql文件---> https://www.postgresql.org/message-id/AANLkTi%3DAqmWrUR4f8%2BEfCHzP%2BQrL1%3DunRLZp_jX7SoqF%40mail.gmail.com