web-dev-qa-db-fra.com

Sauvegarder / restaurer une base de données PostgreSQL dockerisée

J'essaie de sauvegarder/restaurer une base de données PostgreSQL comme expliqué sur le site Web de Docker, mais les données ne sont pas restaurées.

Les volumes utilisés par l'image de la base de données sont:

VOLUME  ["/etc/postgresql", "/var/log/postgresql", "/var/lib/postgresql"]

et le CMD est:

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

Je crée le conteneur DB avec cette commande:

docker run -it --name "$DB_CONTAINER_NAME" -d "$DB_IMAGE_NAME"

Ensuite, je connecte un autre conteneur pour insérer des données manuellement:

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>

L'archive tar est alors créée:

$ 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

Maintenant, je supprime le conteneur utilisé pour la base de données et en crée un autre, portant le même nom, et tente de restaurer les données insérées auparavant:

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

Mais les tables sont vides, pourquoi les données ne sont-elles pas correctement restaurées?

101
Carl Levasseur

Ok, j'ai compris ça. Postgresql ne détecte pas les modifications apportées au dossier/var/lib/postgresql une fois qu'il est lancé, du moins pas le type de modifications que je souhaite qu'il détecte.

La première solution consiste à démarrer un conteneur avec bash au lieu de démarrer directement le serveur postgres, à restaurer les données, puis à démarrer le serveur manuellement.

La deuxième solution consiste à utiliser un conteneur de données. Je n'avais pas compris le but avant, maintenant je le fais. Ce conteneur de données permet de restaurer les données avant de démarrer le conteneur postgres. Ainsi, lorsque le serveur postgres démarre, les données sont déjà présentes.

15
Carl Levasseur

Sauvegardez vos bases de données

docker exec -t your-db-container pg_dumpall -c -U postgres > dump_`date +%d-%m-%Y"_"%H_%M_%S`.sql

Restaurez vos bases de données

cat your_dump.sql | docker exec -i your-db-container psql -U postgres
339
Forth

Je pense que vous pouvez également utiliser un conteneur de sauvegarde Postgres qui permettrait de sauvegarder vos bases de données dans un délai donné.

  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
Tharindu Pradeep

Une autre approche (basée sur docker-postgresql-workflow )

Base de données en cours d'exécution locale (pas dans docker, mais la même approche fonctionnerait) pour exporter:

pg_dump -F c -h localhost mydb -U postgres export.dmp

Base de données de conteneurs à importer:

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
sjakubowski

J'ai eu ce problème en essayant d'utiliser un db_dump pour restaurer une base de données. J'utilise normalement dbeaver pour restaurer. Cependant, j'ai reçu un vidage psql. Je devais donc trouver une méthode de restauration à l'aide du conteneur Docker.

La méthodologie recommandée par Forth et éditée par Soviut a fonctionné pour moi:

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

(puisqu'il s'agissait d'un dump de base de données unique et non de plusieurs bases de données, j'ai inclus le nom)

Cependant, pour que cela fonctionne, je devais également accéder à la virtualisation dans laquelle se trouvaient le conteneur et le projet de menu fixe. Cela m’a échappé un peu avant de le comprendre car je recevais l’erreur de menu suivante.

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

Cela peut être causé par le fichier /var/lib/docker/network/files/local-kv.db. Je ne connais pas l'exactitude de cette déclaration: mais je crois que je l'ai vu car je n'utilise pas docker localement, Par conséquent, le fichier qu’il cherchait n’était donc pas associé à la réponse de Forth.

J'ai ensuite navigué pour corriger le répertoire (avec le projet), activé le virtualenv puis exécuté la réponse acceptée. Boom, a travaillé comme un top. J'espère que cela aide quelqu'un d'autre là-bas!

3
activereality