繁体   English   中英

为什么 Docker 中的 pg_restore 段错误?

[英]Why is pg_restore segfaulting in Docker?

我正在 docker 容器内测试我的 postgres 数据库的备份/恢复过程。

我像这样转储我的数据库:

$ docker exec -ti my_postgres_container pg_dump -Fc -U postgres > db.dump

之后,我尝试像这样恢复它:

$ docker cp db.dump my_postgres_container:/db.dump
$ docker exec -ti my_postgres_container pg_restore -U postgres -c -d postgres db.dump

该命令返回没有 output 或错误,但没有任何反应。

因此,我尝试像这样手动恢复它:

$ docker cp db.dump my_postgres_container:/db.dump
$ docker exec -ti my_postgres_container bash
root@fdaad610bee3:/# pg_restore -U postgres -c -d postgres db.dump
Segmentation fault (core dumped)

为什么在尝试读取我的数据库转储时 pg_restore 出现段错误?

分析:

该问题是由转储数据库时损坏引起的。 pg_dump产生二进制输出。 此输出首先通过 Docker 容器的stdout ,然后重定向到主机上的文件中。 在途中的某个地方,非 ASCII 字节已损坏。

解决方案:

pg_dump写入Docker 容器内的文件,然后将其复制到主机:

正确的倾销程序:

docker exec -ti my_postgres_container bash -c 'pg_dump -Fc -U postgres > /db.dump'
docker cp my_postgres_container:/db.dump db.dump

正确的恢复过程:

docker cp db.dump my_postgres_container:/db.dump
docker exec -ti my_postgres_container pg_restore -U postgres -c -d postgres db.dump

对于像我这样具有损坏转储且无法遵循公认答案的人,我在这里找到了解决方法

使用 vim 打开时,转储文件的格式为 DOS,
如果您将其更改为 unix ( :set ff=unix ) 并保存,
分段错误将 go 消失

这确实有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM