pg_dump database postgresql backup docker

database - pg_dump - docker postgresql import db



Hacer una copia de seguridad/restaurar una base de datos PostgreSQL dockerized (3)

Respalda tus bases

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

Restaure sus bases de datos

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

Estoy intentando hacer una copia de seguridad / restaurar una base de datos PostgreSQL como se explica en el sitio web de Docker, pero los datos no se restauran.

Los volúmenes utilizados por la imagen de la base de datos son:

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

y el CMD es:

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

Creo el contenedor DB con este comando:

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

Luego conecto otro contenedor para insertar algunos datos manualmente:

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>

El archivo tar se crea luego:

$ 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

Ahora elimino el contenedor utilizado para el archivo db y creo otro, con el mismo nombre, y trato de restaurar los datos insertados antes:

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

Pero las tablas están vacías, ¿por qué los datos no se restauran correctamente?


Está bien, lo he descubierto. Postgresql no detecta cambios en la carpeta / var / lib / postgresql una vez que se inicia, al menos no el tipo de cambios que quiero que detecte.

La primera solución es iniciar un contenedor con bash en lugar de iniciar el servidor postgres directamente, restaurar los datos y luego iniciar el servidor manualmente.

La segunda solución es usar un contenedor de datos. No entiendo el punto antes, ahora lo hago. Este contenedor de datos permite restaurar los datos antes de iniciar el contenedor postgres. Por lo tanto, cuando se inicia el servidor Postgres, los datos ya están allí.


Otro enfoque (basado en docker-postgresql-workflow )

La base de datos local en ejecución (no en Docker, pero el mismo enfoque funcionaría) para exportar:

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

Base de datos de contenedores para importar:

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