Copia de seguridad/restauración de una base de datos PostgreSQL dockerizada
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 de base de datos 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 usado 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?
Haga una copia de seguridad de sus bases de datos
docker exec -t your-db-container pg_dumpall -c -U postgres > dump_`date +%Y-%m-%d"_"%H_%M_%S`.sql
Crea un nombre de archivo comodump_2023-12-25_09_15_26.sql
Si desea un tamaño de archivo más pequeño, utilice gzip:
docker exec -t your-db-container pg_dumpall -c -U postgres | gzip > dump_`date +%Y-%m-%d"_"%H_%M_%S`.sql.gz
Si desea tamaños de archivo aún más pequeños, utilice brotli
o bzip2
:
docker exec -t your-db-container pg_dumpall -c -U postgres | brotli --best > dump_`date +%Y-%m-%d"_"%H_%M_%S`.sql.br
o
docker exec -t your-db-container pg_dumpall -c -U postgres | bzip2 --best > dump_`date +%Y-%m-%d"_"%H_%M_%S`.sql.bz2
Restaura tus bases de datos
cat your_dump.sql | docker exec -i your-db-container psql -U postgres
Base de datos de respaldo
generar sql:
docker exec -t your-db-container pg_dumpall -c -U your-db-user > dump_$(date +%Y-%m-%d_%H_%M_%S).sql
para reducir el tamaño del sql puedes generar una compresa:
docker exec -t your-db-container pg_dumpall -c -U your-db-user | gzip > ./dump_$(date +"%Y-%m-%d_%H_%M_%S").gz
Restaurar base de datos
cat your_dump.sql | docker exec -i your-db-container psql -U your-db-user -d your-db-name
para restaurar un sql comprimido:
gunzip < your_dump.sql.gz | docker exec -i your-db-container psql -U your-db-user -d your-db-name
PD: esta es una recopilación de lo que funcionó para mí y lo que obtuve de aquí y de otros lugares. Estoy empezando a hacer aportes, cualquier comentario será apreciado.
Creo que también puede utilizar un contenedor de copia de seguridad de Postgres que haga una copia de seguridad de 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