pg_restore:[自定义存档器]无法从输入文件读取:文件结尾

问题描述 投票:0回答:2

我有一个生产数据库的转储,我可以使用以下命令在 Docker 容器中轻松恢复它:

docker exec -it my_db_container pg_restore --user=my_user --dbname=dbname sql/current.dump
。一切正常,数据都在这里。

但是,当我使用

docker exec -it my_db_container -U my-user -F c -b dbname > docker/db/current_stripped.dump
从 docker 重新转储本地数据库回到项目文件夹时,我的转储文件已创建(具有适当的大小和内容),但我无法使用它再次恢复 (
docker exec -it whasq-db pg_restore --user=my-user --dbname=dbname sql/current_stripped.dump
)由于错误而导致的新数据库:
pg_restore: [custom archiver] could not read from input file: end of file
但是恢复命令与生产环境中使用的相同(除了
my_user
,它是生产中的postgres)。

docker-compose postgresql-9.6 pg-dump pg-restore
2个回答
1
投票

我也遇到了同样的问题,并按如下方式解决了。我切换到

-f
--file
选项而不是管道(取自 https://stackoverflow.com/a/51073680/6593069)。我在容器内创建了转储文件,然后将其复制到我的主机。

在你的情况下这意味着:

docker exec -it my_db_container -U my-user -F c -b dbname -f current_stripped.dump
docker cp my_db_container:current_stripped.dump .

0
投票

旧线程,但我在 Docker 上运行的 Postgres 16 也遇到了这个问题。

问题是使用 docker exec -t 或 -ti 运行 pg_dump。伪 TTY 会在生成的备份文件中附加一些 EOL,因此 pg_restore 稍后不会接受它。

只需运行不带 -ti 的命令即可:

docker exec my_db_container pg_dump -Fc --user=my_user --dbname=dbname > sql/current.dump
docker exec my_db_container pg_restore -Fc --user=my_user --dbname=dbname sql/current.dump

您可以在这个 github 问题上找到有关此主题的讨论:https://github.com/docker-library/postgres/issues/219

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.