Copia de seguridad / restauración de una base de datos Dogreized PostgreSQL

155

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?

Carl Levasseur
fuente

Respuestas:

457

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

Restaura tus bases de datos

cat your_dump.sql | docker exec -i your-db-container psql -U postgres
Adelante
fuente
2
Sí, esa es la forma de postgres de hacerlo, pero creo que la forma de estibador siempre debe preferirse cuando la usas
Carl Levasseur
42
Para ahorrar espacio en el disco, es posible que desee canalizar el volcado a gzip: 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
Tarion
1
Simplemente descomprima los datos antes de restaurarlos. Para hacerlo de una sola vez, tendrá que reemplazarlo cat your_dump.sqlcon el comando descomprimir y canalizar eso en lugar del catresultado para docker exec.
Tarion
2
El formato de la fecha está desordenado, así que verifíquelo antes de copiar y pegar.
vidstige
1
Para aquellos que no podrían descubrir cómo hacer que funcione el formato de fecha: docker exec -t your-db-container pg_dumpall -c -U postgres | gzip > ./tmp/dump_$(date +"%Y-%m-%d_%H_%M_%S").gz
user1230795
18

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.

  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
Tharindu Pradeep
fuente
1
Funciona perfectamente ! Gracias
CaM2091
15

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

Carl Levasseur
fuente
1
flocker o convoy pueden ayudar con el manejo de contenedores de datos.
del
24
Por favor complete más detalles. Esto suena más como un boceto de una solución que una solución real
nafg
5

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 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'
sjakubowski
fuente
1
esto funcionó para mí: pg_dump mydb -U postgres > export.psqlen basurero contenedor Docker
Sepultura
3

Tuve 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í!

realidad activa
fuente
1

Este es el comando que me funcionó.

cat your_dump.sql | sudo docker exec -i {docker-postgres-container} psql -U {user} -d {database_name}

por ejemplo

cat table_backup.sql | docker exec -i 03b366004090 psql -U postgres -d postgres

Referencia : Solución dada por GMartinez-Sisti en esta discusión. https://gist.github.com/gilyes/525cc0f471aafae18c3857c27519fc4b

Jacob Nelson
fuente
1

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_IDy el nombre de DB es DB_NAME:

# copy dump into container
docker cp local/path/to/db.dump CONTAINER_ID:/db.dump

# shell into container
docker exec -it CONTAINER_ID bash

# restore it from within
pg_restore -U postgres -d DB_NAME --no-owner -1 /db.dump
Alex Fedoseev
fuente
0

dksnap( https://github.com/kelda/dksnap ) automatiza el proceso de ejecución pg_dumpally 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 runcompartirlo o compartirlo empujándolo a un registro de Docker.

(descargo de responsabilidad: soy un mantenedor en el proyecto)

Kevin Lin
fuente
0

El siguiente comando se puede utilizar para realizar un volcado del contenedor de postgreso de Docker

docker exec -t <postgres-container-name> pg_dump --no-owner -U <db-username> <db-name> > file-name-to-backup-to.sql
Shubham
fuente