Estoy tratando de 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>
Luego 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, e intento 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?
database
postgresql
backup
docker
Carl Levasseur
fuente
fuente
Respuestas:
Copia de seguridad de sus bases de datos
Restaura tus bases de datos
fuente
docker exec -t your-db-container pg_dumpall -c -U postgres | gzip > /var/data/postgres/backups/dump_
fecha +% d-% m-% Y "_"% H_% M_% S.gz
cat your_dump.sql
con el comando descomprimir y canalizar eso en lugar delcat
resultado para docker exec.docker exec -t your-db-container pg_dumpall -c -U postgres | gzip > ./tmp/dump_$(date +"%Y-%m-%d_%H_%M_%S").gz
Creo que también puede usar un contenedor de respaldo de potgres que respaldaría sus bases de datos dentro de un período de tiempo determinado.
fuente
De acuerdo, lo he resuelto. 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 lo entendí antes, ahora sí. Este contenedor de datos permite restaurar los datos antes de iniciar el contenedor de postgres. Por lo tanto, cuando se inicia el servidor postgres, los datos ya están allí.
fuente
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:
Base de datos de contenedores para importar:
fuente
pg_dump mydb -U postgres > export.psql
en basurero contenedor DockerTuve este problema al intentar usar un db_dump para restaurar un db. Normalmente uso dbeaver para restaurar, sin embargo, recibí un volcado de psql, así que tuve que encontrar un método para restaurar usando el contenedor docker.
La metodología recomendada por Forth y editada por Soviut funcionó para mí:
cat your_dump.sql | docker exec -i your-db-container psql -U postgres -d dbname
(como se trataba de un único volcado de db y no de varios db, incluí el nombre)
Sin embargo, para que esto funcione, también tuve que ir al virtualenv en el que se encontraban el contenedor y el proyecto de la ventana acoplable. Esto me eludió por un momento antes de descubrirlo, ya que recibía el siguiente error de ventana acoplable.
read unix @->/var/run/docker.sock: read: connection reset by peer
Esto puede ser causado por el archivo /var/lib/docker/network/files/local-kv.db. No sé la precisión de esta declaración: pero creo que estaba viendo esto, ya que no utilizo el acoplador localmente, por lo tanto, no tenía este archivo, que estaba buscando, usando la respuesta de Forth.
Luego navegué al directorio correcto (con el proyecto) activé virtualenv y luego ejecuté la respuesta aceptada. Boom, funcionó como un top. Espero que esto ayude a alguien más por ahí!
fuente
Este es el comando que me funcionó.
por ejemplo
Referencia : Solución dada por GMartinez-Sisti en esta discusión. https://gist.github.com/gilyes/525cc0f471aafae18c3857c27519fc4b
fuente
cat db.dump | docker exec ...
La forma no funcionó para mi volcado (~ 2Gb). Tomó algunas horas y terminó con un error de falta de memoria.En cambio, puse un volcado en un contenedor y pg_restore lo hice desde dentro.
Suponiendo que la identificación del contenedor es
CONTAINER_ID
y el nombre de DB esDB_NAME
:fuente
dksnap
( https://github.com/kelda/dksnap ) automatiza el proceso de ejecuciónpg_dumpall
y carga del volcado a través de/docker-entrypoint-initdb.d
.Le muestra una lista de contenedores en ejecución y usted elige cuál desea respaldar. El artefacto resultante es una imagen de Docker normal, por lo que puede luego
docker run
compartirlo o compartirlo empujándolo a un registro de Docker.(descargo de responsabilidad: soy un mantenedor en el proyecto)
fuente
El siguiente comando se puede utilizar para realizar un volcado del contenedor de postgreso de Docker
fuente