Binary Coffee

¬ŅC√≥mo hacer una copia de tu base de datos en MongoDB?

docker mongodb

¬ŅPor qu√© copiar la base de datos (BD)?

Generalmente se suele hacer cuando se requiere copiar la BD para replicar el environment de producción en el entorno personal y de esta manera replicar errores o simplemente si se desea hacer una copia de seguridad.

Cualquiera sea el caso, en el presente artículo se explicará cómo por medio de las herramientas que brinda mongodb, se pueden hacer copias de la BD.

Copiar la BD

Para hacer una copia de una BD en mongodb se puede realizar de manera muy sencilla por medio de la utilidad mongodump, que viene como parte de mongodb por defecto a partir de la versión 4.0.

mongodump 
    --host <source host:port> 
    --ssl 
    --username <username> 
    --password <password> 
    --authenticationDatabase admin 
    --db <sourceDbName> 
    --collection <collection-name>

Vistos los parámetros necesarios para utilizar mongodump, a continuación se muestra un ejemplo de cómo hacer uso de esta utilidad y copiar la BD que se desee:

mongodump --host 127.0.0.1:27017 --db mydb

El comando anterior genera una carpeta dump/<db-name> en la que podemos encontrar la copia de la BD.

Utilizando docker

Otra manera en la que se puede hacer lo anterior sin instalar mongodb, es por medio de docker. Todo se reduce a ejecutar un contenedor de docker que tenga mongodb instalado (y por consiguiente mongodump) y ejecutar esta utilidad de la misma manera. El √ļnico detalle a tener en cuenta, es que la copia de la BD ser√° realizada dentro de la imagen de docker en que estamos trabajando, por lo que necesitamos copiar la informaci√≥n fuera del mismo (utilizando los vol√ļmenes de docker). seguidamente un ejemplo:

docker run \
    -v /home/dbsalva:/dump \
    --network="host" -d \
    mongo \
    sh -c 'mongodump --host 127.0.0.1:27017 --db mydb'

Explicando el ejemplo anterior línea a línea:

  • L√≠nea 1: se utiliza el comando run de docker que permite ejecutar un comando desde dentro de una imagen de docker.
  • L√≠nea 2: se define un volumen, de esta manera se puede extraer la salva de la BD fuera de la imagen de docker.
  • L√≠nea 3: definir el par√°metro --network="host" que permite al contenedor de docker tener acceso a los servicios fuera del contenedor actual (esto se traduce en que 127.0.0.1, no es el localhost del contenedor sino el localhost del sistema) y seguido de esto se utiliza -d para que la ejecuci√≥n de los comandos est√©n desligados de la ejecuci√≥n.
  • L√≠nea 4: selecci√≥n del contenedor que se utilizar√° (en este caso mongo)
  • L√≠nea 5: por √ļltimo, se selecciona se ejecutamos el comando que fue mostrado anteriormente (mongodump).

Al concluir la ejecución del comando anterior, podemos acceder a la salva de la BD en la carpeta dbsalva.

Recuperar la BD

A lo antes visto, solo queda agregarle el cómo se puede recuperar la BD copiada. Para esto se puede utilizar otra utilidad de mongodb que se llama mongorestore.

mongorestore 
    --host <target host:port> 
    --ssl 
    --username <username> 
    --password <password> 
    --authenticationDatabase admin 
    --db <targetDbName>
    --collection <collection-name>
    <ruta-de-la-salva>

y puesto en pr√°ctica:

mongorestore --host 127.0.0.1:27017 --db mydb /home/dbsalva/mydb

Utilizando docker

Tal y como se mostró en el caso de copiar la BD, vamos a utilizar exactamente el mismo comando, con la diferencia del comando a ejecutar dentro del contenedor de docker.

docker run \
    -v /home/dbsalva:/dump \
    --network="host" -d \
    mongo \
    sh -c 'mongorestore --host 127.0.0.1:27017 --db mydb /dump/mydb'

Enlaces

Conclusiones

Esta es una de las muchas maneras en que se puede salvar/copiar/clonar una BD de mongodb en solo 2 comandos sencillos.

Artículo sobre configurar tus bases de datos mongodb con docker

Happy coding!!!

Opiniones
noavatar
Si quieres evitar poner el password explícitamente en la línea de comandos o en el script puedes usar la opción --config=<filename> y poner el password en un YAML file.
noavatar
Muy bueno todo esto para backups y recuperaci√≥n. Solo a√Īadir que las opciones --db y --collection estan obsoletas. La doc indica que deben reemplazarse por --nsInclude
noavatar
En el artículo de mongodb que escribí no hace mucho, dejé algo sobre el tema, thx https://binary-coffee.dev/post/configurar-tus-base-de-datos-de-mongodb-con-docker
noavatar
Simple y muy buena la explicación, mejor que leerse 100 artículos con los que empezamos a entender estas cosas. Solo para agregar y esto lo tengo gracias a ti, es usando la imagen tutum/mongodb-backup.