PostgreSQL: pg_restore: [archiver] 输入文件似乎不是有效的归档文件。

23
我正在按照Postgres DVD教程进行工作,但在导入他们的示例数据库时遇到了问题。
运行pg_restore -U postgres -d dvdrental ~[filepath]/dvd-database.tar.gz时出现pg_restore: [archiver] input file does not appear to be a valid archive的错误。
到目前为止,我的步骤如下:
  1. 下载dvdrental.zip文件
  2. 使用tar czf dvd-database.tar.gz dvdrental.zip将其解压为.tar文件(我还尝试先将zip文件解压到一个文件夹中,结果相同,还尝试去掉.gz后缀)
  3. 按照上述步骤运行pg_restore -U postgres -d dvdrental ~[filepath]/dvd-database.tar
我目前正在使用Postgres 9.5版本,可能是导致问题的原因。希望能得到一个解答,指出我在这个过程中出错的地方,或者如何将Postgres数据库的存档更新到9.5版本。

3
我认为 pg_restore 无法处理 .tar.gz 文件。你尝试过解压缩 unzip dvdrental.zip,然后将 .tar 文件提供给 pg_restore 吗? - user330315
刚要编辑这个文件——我在错误地使用tar并输出了一个gzipped文件。然而,现在我正在提供一个未压缩的tar给pg_restore,但是我得到了pg_restore: [tar archiver] could not find header for file "toc.dat" in tar archive的错误提示,尽管当.tar文件被解压缩时,toc.dat是存在的。 - Charlie Weems
2
然后尝试解压 tar 文件并将 pg_restore 指向该目录。 - user330315
谢谢,这很有效。我显然想多了/需要查阅文档。 - Charlie Weems
8个回答

28

根据上面的评论,解决方案很简单。

按照教程说明建议的那样,将dvdrental.zip文件提取到未压缩的.tar文件中是不必要的。如果将pg_restore指向提取数据库转储的目录,则可以工作

pg_restore -U <用户名> -d dvdrental <已提取的目录路径>/dvdrental


如果您使用的是Mac并且已经安装了postgres.app,请运行以下命令并重新启动终端。然后在此帖子上执行指向提取文件夹的命令。 sudo mkdir -p /etc/paths.d && echo /Applications/Postgres.app/Contents/Versions/latest/bin | sudo tee /etc/paths.d/postgresapp参考链接: https://postgresapp.com/documentation/cli-tools.html - BOE

3

我的问题是在安装postgresql时,我选择了另外一个超级用户的名字(例如root,而不是postgres)。但是dvdrental/restore.sql文件使用postgres角色。因此,要解决这个问题,您需要创建另一个名为postgres的超级用户。

createuser --superuser postgres

然后创建具有角色postgres和数据库dvdrental的服务器(PosgreSQL)。

之后,您可以成功地从已提取的文件夹中恢复数据库。


0
我遇到了同样的错误: pg_restore: 错误:输入文件似乎不是有效的归档文件
因为我导出了但没有将“apple”数据库存档到“backup.sql”中,使用的是pg_dump,如下所示:
pg_dump -U john apple > backup.sql

或者:

pg_dump -U john -Fp apple > backup.sql

然后,我尝试使用pg_restore将非归档的backup.sql导入到orange数据库中,该工具通常用于导入归档文件。
pg_restore -U john -d orange < backup.sql

所以,我使用了psql来导入非存档文件,然后我就能解决这个错误了。*我的回答解释了如何导出数据库,我的回答解释了如何导入数据库。
psql -U john -f backup.sql orange

0

经过数小时的尝试,我发现以下命令适用于我。自从PgAdmin 4以来,它变得非常难以使用。

/Library/PostgreSQL/10/bin/pg_restore -U postgres -p 5433  -d dvdrental /pg-db/dvdrental/

只需将zip文件解压到一个文件夹中,然后在我的Mac OS上使用这些选项执行pg_restore命令,其中/pg-db/dvdrental/是已解压的zip目录。


0

不知道原因,但这是对我有效的方法。

我正在使用Ubuntu 20.04,pgadmin4版本5.7,Postgres版本12.8。

在“还原”对话框中,“自定义和tar”,在文件名中点击“...”,单击上传以上传tar文件,选择已上传的文件,然后选择三个选项:预数据、数据和后数据。 一直出现错误:退出代码1。

删除了数据库,再次创建了同名的数据库,按照之前完全相同的方式操作。

第二次成功了。 在日志中执行了以下命令:

/usr/bin/pg_restore --host "localhost" --port "5432" --username "postgres" --no-password --dbname "mydb" 
--section=pre-data --section=data --section=post-data --verbose "/var/lib/pgadmin/storage/my_email.com/restore_file.tar"

0
要将一个SQL文本文件恢复到PostgreSQL数据库中,你可以使用常用于与PostgreSQL数据库交互的命令行工具psql。以下是恢复SQL文本文件的步骤:
  1. 打开命令提示符或终端:在您的计算机上打开一个命令提示符或终端窗口。

  2. 导航到目录:使用cd命令导航到存放SQL文本文件的目录。

    cd /path/to/directory
  3. 登录到PostgreSQL:使用psql命令登录到您的PostgreSQL数据库。您需要提供用户名和数据库名称作为参数。您可能还需要输入密码。

    psql -U your_username -d your_database

    your_username替换为您的PostgreSQL用户名,将your_database替换为要将SQL文件还原到的数据库的名称。

  4. 执行SQL文件:登录后,您可以使用\i命令后跟文件路径来执行文本文件中的SQL命令:

    \i /path/to/your_sql_file.sql

    /path/to/your_sql_file.sql替换为您的SQL文本文件的完整路径。

  5. 退出psql:在SQL文件执行完毕后,您可以输入以下命令退出psql

    \q

    这将返回到命令提示符。

好了!您的SQL文本文件已经成功恢复到您的PostgreSQL数据库中。请确保您的SQL文件包含有效的SQL语句,并且与您的PostgreSQL数据库版本兼容。

1
https://meta.stackoverflow.com/q/421831/11107541 - undefined

0

如果您正在使用 Docker 运行您的 Postgres,请确保传递主机名和端口号,

pg_restore -U postgres -h localhost -p 5432 -d dvdrental ./Downloads/dvdrental

这里,./Downloads/dvdrental 是从dvdrental.zip中提取的文件夹。


-2

使用pgAdmin 4会更容易。

通过pgAdmin将tar文件还原到数据库时,您可能会遇到此错误。我们通常会在这一点上卡住,并忘记检查模式。

忽略错误。数据已经被加载和还原。


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