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 ?
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
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í.
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'
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