Copiando colecciones de MongoDB entre dos instancias remotas

Copiando colecciones de MongoDB entre dos instancias remotas

En más de una ocasión se necesita copiar una colección de Mongo a una instancia diferente, un ejemplo muy común es cuando creamos la réplica de un ambiente de producción para pruebas o desarrollo.

Esto se puede lograr de una manera óptima con los comandos mongodump y mongorestore para lograrlo.

Haciendo el dump de la colección

Usamos mongodump apuntando a nuestra primera instancia y especificando la base de datos y la colección que queremos copiar.

mongodump --host 52.14.108.29 --port 27017 --username mariohd --authenticationDatabase admin --password holacrayola -d mydatabase -c mycollection

Esto creará una carpeta con el nombre de la base de datos que contiene la colección en formato .bson. Ambas las podemos encontrar en la carpeta dump.

Restaurando en nuestra otra instancia

Finalmente apuntaremos al archivo recién creado y lo restauraremos con el comando mongorestore pero conectados a nuestra otra instancia.

mongorestore --host 52.14.108.23 --port 27017 --username mariohd --authenticationDatabase admin --password holacrayola -d mydatabase -c mycollection --dir=dump/mydatabase/mycollection.bson

Este método es más rápido que otras soluciones, como descargar el archivo en formato JSON desde Compass y restaurándolo con ese mismo software.

Automatizando el proceso

Para evitar el proceso tedioso podemos crear un bash script que nos permita copiar más de una colección.

#!/bin/bash
set -u

# Defaults
ADMIN_DATABASE="admin"
MONGODUMP=`which mongodump`
MONGORESTORE=`which mongorestore`

# Copy configurations
DB="mydatabase"
COLLECTIONS="collection1 collection2 collection3"

# Origin connection configuration
ORIGIN_HOST="52.14.108.29"
ORIGIN_PORT="27017"
ORIGIN_USER="mariohd"
ORIGIN_PASSWORD="holacrayola"

# Target connection configuration
TARGET_HOST="52.14.108.23"
TARGET_PORT="27017"
TARGET_USER="mariohd"
TARGET_PASSWORD="holacrayola"

# Start copy #
ORIGIN_AUTHENTICATION="--username $ORIGIN_USER --authenticationDatabase $ADMIN_DATABASE --password $ORIGIN_PASSWORD"
ORIGIN_REMOTE="--host $ORIGIN_HOST --port $ORIGIN_PORT"
TARGET_AUTHENTICATION="--username $TARGET_USER --authenticationDatabase $ADMIN_DATABASE --password $TARGET_PASSWORD"
TARGET_REMOTE="--host $TARGET_HOST --port $TARGET_PORT"

for collection in $COLLECTIONS; do
    $MONGODUMP $ORIGIN_AUTHENTICATION $ORIGIN_REMOTE -d $DB -c $collection
    $MONGORESTORE $TARGET_AUTHENTICATION $TARGET_REMOTE -d $DB -c $collection --dir=dump/$DB/$collection.bson
done