Restaurar una base de datos en un contenedor con mariadb o mysql
Tengo un contenedor con varios esquemas y me sucede con frecuencia que tengo que restaurar copias de producción en local para hacer pruebas o mejoras.
Pasos:
- Obtengo un backup de producción
- Lo muevo a una carpeta con permisos de lectura
- Ejecuto el comando docker cp
- Me conecto al contenedor de mariadb
- Ejecuto la sentencia de restauración
Obtener backup:
mysqldump --no-tablespaces --host=<el.nombre-o-ip.del.servidor> --user=<nombre-usuario> --password="<contraseña>" <nombre-de-la-bd> > <ruta-archivo-dump.sql>
-- algo así:
mysqldump --no-tablespaces --host=localhost.wix.com --user=userwix33 --password="$$12*@347--+abXx" db_wixweb > $HOME/out/backups/mi-backup.sql
-- de alguna forma descargo el backup de wix usando ftp, ssh, api, etc
Carpeta con permisos de lectura unicamente:
- Obtengo un backup de producción
- Lo muevo a una carpeta con permisos de lectura
- Ejecuto el comando docker cp
- Me conecto al contenedor de mariadb
- Ejecuto la sentencia de restauración
Obtener backup:
mysqldump --no-tablespaces --host=<el.nombre-o-ip.del.servidor> --user=<nombre-usuario> --password="<contraseña>" <nombre-de-la-bd> > <ruta-archivo-dump.sql>
-- algo así:
mysqldump --no-tablespaces --host=localhost.wix.com --user=userwix33 --password="$$12*@347--+abXx" db_wixweb > $HOME/out/backups/mi-backup.sql
-- de alguna forma descargo el backup de wix usando ftp, ssh, api, etc
Carpeta con permisos de lectura unicamente:
Tengo una carpeta temporal exclusivamente para estos dumps: $HOME/dockercfg/db_dumps luego termino teniendo esta ruta en mi sistema local.
$HOME/dockercfg/db_dumps/mi-backup.sql
Comando docker cp:
cd $HOME/dockercfg/db_dumps;
docker cp $HOME/dockercfg/db_dumps/mi-backup.sql cont-mariadb-univ:/tmp/mi-backup.sql
En este punto ya tengo el backup dentro del contenedor. El siguiente paso es conectarme.
docker exec -it --user root cont-mariadb-univ bash
Ejecuto el restore:
Ya dentro del contenedor... dbloc_wixweb puede ser el nombre que desees yo uso ese prefijo dbloc.
Antes de restaurar reemplazo las primeras lineas con el siguiente código:
DROP DATABASE IF EXISTS `nombre_de_bd`;
CREATE DATABASE IF NOT EXISTS `nombre_de_bd` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
USE `nombre_de_bd`;
-- resto de sentencias
root@host-maria-univ:/$ mysql --host=localhost --user=root --password=abcd dbloc_wixweb < /tmp/mi-backup.sql
Como información extra dejo la configuración del Dockerfile y docker-compose.yml relacionados con el contenedor
Dockerfile:
FROM mariadb
RUN apt-get update
RUN apt-get install -y iputils-ping
docker-compose.yml
version: "3.3"
services:
service-db:
build: ./mariadb/
container_name: cont-mariadb-univ
hostname: host-maria-univ
environment:
# .env.DB_USER
MYSQL_USER: ${DB_USER}
# .env.DB_PASSWORD
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
volumes:
- ${DB_FOLDER}/initdb:/docker-entrypoint-initdb.d/
- ${DB_FOLDER}/mysql:/var/lib/mysql
ports:
- "3306:3306"
command:
'mysqld --innodb-flush-method=fsync'
networks:
- net
networks:
net:
Autor: Eduardo A. F.
Publicado: 27-03-2021 21:27
Actualizado: 28-03-2021 21:05