web-dev-qa-db-ja.com

Docker化されたPostgreSQLデータベースのバックアップ/復元

Docker Webサイトで説明されているように、PostgreSQLデータベースをバックアップ/復元しようとしていますが、データは復元されません。

データベースイメージで使用されるボリュームは次のとおりです。

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"]

次のコマンドでDBコンテナーを作成します。

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 

しかし、テーブルは空です、なぜデータが適切に復元されないのですか?

98
Carl Levasseur

さて、私はこれを理解しました。 Postgresqlは、一度起動されたフォルダー/ var/lib/postgresqlに対する変更を検出しません。少なくとも、私が検出したい種類の変更は検出しません。

最初の解決策は、postgresサーバーを直接起動する代わりにbashでコンテナーを起動し、データを復元してから、サーバーを手動で起動することです。

2番目の解決策は、データコンテナーを使用することです。私はそれのポイントを前に得ませんでした、今私はします。このデータコンテナにより、postgresコンテナを開始する前にデータを復元できます。したがって、postgresサーバーが起動すると、データは既にそこにあります。

14
Carl Levasseur

データベースをバックアップする

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
323
Forth

特定の期間内にデータベースをバックアップするpostgresバックアップコンテナも使用できると思います。

  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
      - SCHEDULE=@every 0h30m00s
      - BACKUP_KEEP_DAYS=7
      - BACKUP_KEEP_WEEKS=4
      - BACKUP_KEEP_MONTHS=6
      - HEALTHCHECK_PORT=81
6

別のアプローチ( docker-postgresql-workflow に基づく)

エクスポートするローカル実行中のデータベース(dockerではなく、同じアプローチが機能します):

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'
4
sjakubowski

Db_dumpを使用してdbを復元しようとしたときに、この問題が発生しました。私は通常dbeaverを使用して復元しますが、psqlダンプを受け取ったため、Dockerコンテナを使用して復元する方法を見つけ出す必要がありました。

Forthが推奨し、Soviutが編集した方法論は、私にとってはうまくいきました。

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

(これは単一のdbダンプであり、複数のdbには名前が含まれていなかったため)

ただし、これを機能させるには、Dockerコンテナとプロジェクトが含まれているvirtualenvに移動する必要がありました。次のdockerエラーを受け取っていたため、これを理解する前に少し理解できませんでした。

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

これは、ファイル/var/lib/docker/network/files/local-kv.dbが原因である可能性があります。このステートメントの正確性はわかりません。しかし、Dockerをローカルで使用していないため、これを見ていました。そのため、Forthの回答を使用して、このファイルを探していませんでした。

次に、(プロジェクトと共に)正しいディレクトリに移動してvirtualenvをアクティブにし、受け入れられた回答を実行しました。ブーム、トップのように働いた。これが他の誰かに役立つことを願っています!

2
activereality