Подтвердить что ты не робот

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

Теперь я удаляю контейнер, используемый для db, и создаю еще один, с тем же именем, и попытаюсь восстановить ранее вставленные данные:

$ sudo docker run --volumes-from "$DB_CONTAINER_NAME" --rm -v $(pwd):/backup ubuntu tar xvf /backup/backup.tar 

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

4b9b3361

Ответ 1

Хорошо, я понял это. Postgresql не обнаруживает изменения в папке /var/lib/postgresql после ее запуска, по крайней мере, не те изменения, которые я хочу, чтобы они обнаруживали.

Первым решением является запуск контейнера с bash, а не запуск сервера postgres напрямую, восстановление данных, а затем запуск сервера вручную.

Второе решение - использовать контейнер данных. Раньше я этого не понимал, теперь я это делаю. Этот контейнер данных позволяет восстановить данные перед запуском контейнера postgres. Таким образом, при запуске сервера postgres данные уже существуют.

Ответ 2

Резервное копирование ваших баз данных

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

Ответ 3

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

  pgbackups:
    container_name: Backup
    image: prodrigestivill/postgres-backup-local
    restart: always
    volumes:
      - ./backup:/backups
    links:
      - db:db
    depends_on:
      - db
    environment:
      - POSTGRES_HOST=db
      - POSTGRES_DB=${DB_NAME} 
      - POSTGRES_USER=${DB_USER}
      - POSTGRES_PASSWORD=${DB_PASSWORD}
      - POSTGRES_EXTRA_OPTS=-Z9 --schema=public --blobs
      - [email protected] 0h30m00s
      - BACKUP_KEEP_DAYS=7
      - BACKUP_KEEP_WEEKS=4
      - BACKUP_KEEP_MONTHS=6
      - HEALTHCHECK_PORT=81

Ответ 4

Другой подход (основанный на 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'

Ответ 5

У меня была эта проблема при попытке использовать db_dump для восстановления БД. Я обычно использую dbeaver для restore-, однако получил дамп psql, поэтому мне нужно было найти способ восстановления с помощью контейнера Docker.

Методология, рекомендованная Фортом и отредактированная Совиутом, сработала для меня:

cat your_dump.sql | docker exec -i your-db-container psql -U postgres -d dbname

(поскольку это был один дБ, а не несколько дБ, я включил имя)

Однако, чтобы заставить это работать, я должен был также перейти к virtualenv, в котором находились док-контейнер и проект. Это немного ускользнуло от меня, прежде чем я понял его out-, когда я получал следующую ошибку докера.

read unix @->/var/run/docker.sock: read: connection reset by peer

Это может быть вызвано файлом /var/lib/docker/network/files/local-kv.db. Я не знаю точности этого утверждения: но я считаю, что я видел это, поскольку я не использую docker локально, поэтому у него не было этого файла, который он искал, используя ответ Forth.

Затем я перешел в правильный каталог (вместе с проектом), активировал virtualenv и запустил принятый ответ. Бум, работал как волчок. Надеюсь, что это поможет кому-то еще там!

Ответ 6

Это команда сработала для меня.

cat your_dump.sql | sudo docker exec -i {docker-postgres-container} psql -U {user} -d {database_name}

например

cat table_backup.sql | docker exec -i 03b366004090 psql -U postgres -d postgres

Ссылка: решение, данное GMartinez-Sisti в этом обсуждении.https://gist.github.com/gilyes/525cc0f471aafae18c3857c27519fc4b