#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
) и сохраните,
ошибка сегментации исчезнет
И это действительно работает.