简体   繁体   中英

Why is pg_restore segfaulting in Docker?

I am testing a backup/restore procedure for my postgres DB inside a docker container.

I dump my db like this:

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

Afterwards, I try to restore it like this:

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

The command returns without output or errors, but nothing happens.

So instead, I tried to restore it manually like this:

$ 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)

Why is pg_restore segfaulting when trying to read my DB dump?

Analysis:

The problem is caused by a corruption when dumping the DB. pg_dump produces binary output. This output is first passed through the Docker container's stdout and then redirected into a file on the host. Somewhere on the way, non-ASCII bytes are corrupted.

Solution:

Let pg_dump write to a file inside the Docker container , then copy that out to the host:

correct dumping procedure:

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

correct restoring procedure:

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

For those like me that have the corrupt dump and can't follow the accepted answer, I found a workaround here

The dump file's format is DOS when you open with vim,
and if you change this to unix ( :set ff=unix ) and save it,
the segmentation fault will go away

And that does works.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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