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


155

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 

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


回答:


457

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

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

2
うん、それはそれを行うためのpostgresの方法ですが、私はあなたがそれを使うときは常にDockerの方法が好まれるべきだと思います
Carl Levasseur

42
ディスクのスペースを節約するために、ダンプをgzipにパイプすることができます: docker exec -t your-db-container pg_dumpall -c -U postgres | gzip > /var/data/postgres/backups/dump_date +%d-%m-%Y "_"%H_%M_%S.gz
Tarion

1
復元する前に、データを解凍してください。これを1つのライナーとして実行するcat your_dump.sqlには、cat結果をDocker execの代わりにunzipコマンドで置き換えて、それをパイプ処理する必要があります。
タリオン

2
日付の形式が乱れているので、コピーして貼り付ける前に再確認してください。
vidstige

1
それらのために日付のフォーマットを機能させる方法を理解することができませんでした: docker exec -t your-db-container pg_dumpall -c -U postgres | gzip > ./tmp/dump_$(date +"%Y-%m-%d_%H_%M_%S").gz
user1230795

18

特定の期間内にデータベースをバックアップする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
      - SCHEDULE=@every 0h30m00s
      - BACKUP_KEEP_DAYS=7
      - BACKUP_KEEP_WEEKS=4
      - BACKUP_KEEP_MONTHS=6
      - HEALTHCHECK_PORT=81

1
完璧に動作します!ありがとう
CaM2091

15

わかりました、私はこれを理解しました。いったん起動すると、Postgresqlはフォルダ/ var / lib / postgresqlへの変更を検出しません。少なくとも、検出したい種類の変更は検出しません。

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

2番目のソリューションは、データコンテナーを使用することです。私は前にそれの要点を理解していませんでした、今私はそうします。このデータコンテナーでは、postgresコンテナーを開始する前にデータを復元できます。したがって、postgresサーバーが起動すると、データはすでにそこにあります。


1
flockerまたはconvoyは、データコンテナーの処理に役立つ場合があります。
2015年

24
詳細を記入してください。これは実際のソリューションというよりはソリューションのスケッチのように聞こえます
nafg

5

別のアプローチ(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'

1
これは私のために働きました:pg_dump mydb -U postgres > export.psqlDockerコンテナbashで
Sepultura

3

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をアクティブにして、受け入れられた回答を実行しました。ブーム、トップのように働いた。これが他の誰かを助けることを願っています!



1

cat db.dump | docker exec ...私のダンプでは方法が機能しませんでした(〜2Gb)。数時間かかり、メモリ不足エラーが発生しました。

代わりに、ダンプをコンテナーにcpし、pg_restoreを使用して内部からダンプしました。

コンテナーIDがCONTAINER_ID、DB名がDB_NAME

# copy dump into container
docker cp local/path/to/db.dump CONTAINER_ID:/db.dump

# shell into container
docker exec -it CONTAINER_ID bash

# restore it from within
pg_restore -U postgres -d DB_NAME --no-owner -1 /db.dump

0

dksnaphttps://github.com/kelda/dksnappg_dumpallは、を介してダンプを実行およびロードするプロセスを自動化します/docker-entrypoint-initdb.d

実行中のコンテナのリストが表示され、バックアップするコンテナを選択できます。結果のアーティファクトは通常のDockerイメージであるためdocker run、Dockerレジストリにプッシュすることで共有したり、共有したりできます。

(免責事項:私はプロジェクトのメンテナーです)


0

以下のコマンドを使用して、Docker Postgressコンテナーからダンプを取得できます

docker exec -t <postgres-container-name> pg_dump --no-owner -U <db-username> <db-name> > file-name-to-backup-to.sql
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.