Reputation: 9910
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?
Upvotes: 14
Views: 4938
Reputation: 1978
TLDR: -t
should not be used unnecessarily.
I think for your pg_dump, the -t
is corrupting the data written to db.dump. For that matter, the -i
is also redundant since pg_dump does not need to read from stdin.
For your pg_restore, you need neither option. If you redirect stdin from outside the container, then you need -i
.
I had the same problem and solved it by using neither -i
nor -t
for the pg_dump.
I think the following fixed pg_dump should work for your case:
$ docker exec my_postgres_container pg_dump -Fc -U postgres -d postgress > db.dump
Incidentally for the pg_restore, you don't need to copy the dump file to the container. You can just redirect stdin from the dump file on the host:
$ docker exec -i my_postgres_container pg_restore -Fc -c -U postgres -d postgres < db.dump
Upvotes: 10
Reputation: 141
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.
Upvotes: 5
Reputation: 9910
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
Upvotes: 31