Резервное копирование / восстановление докеризованной базы данных 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 


но таблицы пусты, почему данные не восстанавливаются должным образом ?

777   3  

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

    Ничего не найдено.