Резервное копирование / восстановление докеризованной базы данных PostgreSQL
Я пытаюсь создать резервную копию / восстановить базу данных PostgreSQL, как описано на веб-сайте Docker, но данные не восстанавливаются.
Тома, используемые образом базы данных являются:
VOLUME ["/etc/postgresql", "/var/log/postgresql", "/var/lib/postgresql"]
и CMD:
CMD ["/usr/lib/postgresql/9.3/bin/postgres", "-D", "/var/lib/postgresql/9.3/main", "-c", "config_file=/etc/postgresql/9.3/main/postgresql.conf"]
Я создаю контейнер БД с помощью следующей команды:
docker run -it --name "$DB_CONTAINER_NAME" -d "$DB_IMAGE_NAME"
затем я подключаю другой контейнер, чтобы вставить некоторые данные вручную:
docker run -it --rm --link "$DB_CONTAINER_NAME":db "$DB_IMAGE_NAME" sh -c 'exec bash'
psql -d test -h $DB_PORT_5432_TCP_ADDR
# insert some data in the db
<CTRL-D>
<CTRL-D>
затем создается архив tar:
$ sudo docker run --volumes-from "$DB_CONTAINER_NAME" --rm -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /etc/postgresql /var/log/postgresql /var/lib/postgresql
теперь я удаляю контейнер, используемый для БД и создать еще один, с тем же именем, и попытаться восстановить данные, вставленные ранее:
$ sudo docker run --volumes-from "$DB_CONTAINER_NAME" --rm -v $(pwd):/backup ubuntu tar xvf /backup/backup.tar
но таблицы пусты, почему данные не восстанавливаются должным образом ?
3 ответов:
резервное копирование баз данных
docker exec -t your-db-container pg_dumpall -c -U postgres > dump_`date +%d-%m-%Y"_"%H_%M_%S`.sqlвосстановить базы данных
cat your_dump.sql | docker exec -i your-db-container psql -U postgres
хорошо, я понял это. Postgresql не обнаруживает изменений в папке /var/lib/postgresql после ее запуска, по крайней мере, не те изменения, которые я хочу, чтобы он обнаружил.
первое решение состоит в том, чтобы запустить контейнер с bash вместо запуска сервера postgres напрямую, восстановить данные, а затем запустить сервер вручную.
второе решение заключается в использовании контейнер данных. Я не понимал этого раньше, теперь понимаю. Этот контейнер данных позволяет восстановите данные перед запуском контейнера postgres. Таким образом, когда сервер postgres запускается, данные уже есть.
другой подход (на основе docker-postgresql-workflow)
локальная запущенная база данных (не в докере, но такой же подход будет работать) для экспорта:
pg_dump -F c -h localhost mydb -U postgres export.dmpбаза данных контейнеров для импорта:
docker run -d -v /local/path/to/postgres:/var/lib/postgresql/data postgres #ex runs container as `CONTAINERNAME` #find via `docker ps` docker run -it --link CONTAINERNAME:postgres --volume $PWD/:/tmp/ postgres bash -c 'exec pg_restore -h postgres -U postgres -d mydb -F c /tmp/sonar.dmp'
Comments