Почему pg_restore segfaulting в Docker?

#postgresql #docker #backup #database-backups

#postgresql #docker #резервное копирование #резервные копии базы данных

Вопрос:

Я тестирую процедуру резервного копирования / восстановления для моей базы данных postgres в контейнере docker.

Я сбрасываю свою базу данных следующим образом:

 $ 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
  

Команда возвращается без вывода или ошибок, но ничего не происходит.

Поэтому вместо этого я попытался восстановить его вручную следующим образом:

 $ 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 при попытке прочитать дамп моей базы данных?

Ответ №1:

Анализ:

Проблема вызвана повреждением при сбросе базы данных. 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
  

Ответ №2:

Для таких, как я, у которых поврежден дамп и которые не могут следовать принятому ответу, я нашел обходной путь здесь

Формат файла дампа — DOS при открытии с помощью vim,
и если вы измените его на unix ( :set ff=unix ) и сохраните,
ошибка сегментации исчезнет

И это действительно работает.