Copia de seguridad/Restauración de una base de datos PostgreSQL acoplada


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>

Entonces se crea el archivo 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

Ahora elimino el contenedor utilizado para la base de datos y creo otro, con el mismo nombre, y tratar 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 ?

Author: Daniel Serodio, 2014-07-13

3 answers

Copia de seguridad de sus bases de datos

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

Restaurar sus bases de datos

cat your_dump.sql | docker exec -i your-db-container psql -U postgres
 221
Author: Forth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-28 20:00:03

Vale, ya me he dado cuenta. 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 utilizar un contenedor de datos. Antes no entendía el punto, ahora lo entiendo. Este contenedor de datos permite restaurar el datos antes de iniciar el contenedor postgres. Por lo tanto, cuando se inicia el servidor postgres, los datos ya están allí.

 10
Author: Carl Levasseur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-13 12:23:06

Otro enfoque (basado en docker-postgresql-workflow )

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 a 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'
 4
Author: sjakubowski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-01 19:06:04