Hola a todos, en esta ocasión os queríamos comentar una de las cosas a tener en cuenta antes de realizar una migración con mongomirror. Habitualmente no se tiene en cuenta y de no hacerlo, el proceso de migración fallará. Para realizar una migración con mongomirror es necesario primero eliminar (temporal o definitivamente) los índices TTL. En la entrada de hoy contaremos como listar índices TTL para que se puedan localizar antes de la migración, así como luego crearlos y borrarlos. Comencemos.
¿Qué son los índices TTL y mongomirror?
En primer lugar debemos saber que mongomirror es una herramienta oficial de MongoDB. Esta utilidad se encarga de hacer una migración de un entorno local a Atlas, la nube de MongoDB. Con ella se realiza una migración de un replicaSet en un entorno local (OnPremise) hacia Atlas, sincronizando los datos actuales en Atlas.
Una parte de esa sincronización consiste en crear los índices que hay actualmente en el entorno. ¿Cuál es el problema entonces? No es compatible con este tipo de índices. Sí con los índices «normales». En esta página indica los prerrequisitos. Entre ellos la parte de los índices TTL que nos interesa:
mongomirroris not compatible with TTL indexes. Drop any existing TTL indexes and rebuild them when the migration process is complete. If you do not want to drop an existing index because it is important for query performance, contact support for alternative options.
Los índices TTL chequean la fecha del campo que se indique y los elimina pasados x segundos. Esto es un ejemplo de su creación:
db.eventlog.createIndex( -- Colección
{ "lastModifiedDate": 1 }, -- Campo a chequear
{ expireAfterSeconds: 3600 } -- Cantidad de segundos en la que será borrado
)
En el ejemplo anterior, todos los registros que en base a esa fecha tengan más de 3600 segundos, serán eliminados. Se usa habitualmente para tablas de log, para evitar que crezca demasiado. En vez de tener una tarea que chequee ese campo y elimine pasado esos segundos, se crea un índice de este tipo.
¿Cómo listar índices TTL para su borrado?
Para poder borrarlos primero, tenemos que localizaros, para ello, crearemos la siguiente función y la ejecutaremos:
function listAllIndexes() {
const databases = db.adminCommand({ listDatabases: 1 }).databases;
ttlIndexes = [];
for (const { name: dbName } of databases) {
if(dbName != 'admin' && dbName != 'config' && dbName != 'local')
{
let collections = db.getSiblingDB(dbName).getCollectionNames();
for (const collectionName of collections) {
let indexes = db.getSiblingDB(dbName).getCollection(collectionName).getIndexes();
indexes.forEach((index) => {
printjson({
Database: dbName,
Collection: collectionName,
Index: index,
});
if(index.expireAfterSeconds >= 0){
ttlIndexes.push(
(
{dbName,collectionName,index}
)
)}
});
}
}
}
print("Indexes with TTL: " + JSON.stringify(ttlIndexes))
};
listAllIndexes(); // Ejecutamos la función
Tras esto, nos listará todos los índices y si hay alguno TTL nos lo indicará al final del todo. En caso contrario nos aparecerá así:

Con los datos obtenidos (base de datos, colección, campos, etc…), nos lo guardamos en un fichero aparte y deberemos crear un script de creación y de borrado. A continuación, os mostramos ambos scripts de ejemplo.
Script de borrado de índices
Con este script, borraría los índices detectados. Deberemos ejecutarlo antes de mongomirror
function dropTTLIndexes() {
print("This script will delete the TTL indexes fecha_1 and expirationDate_1")
// Seleccionamos las colecciones
let col = db.getSiblingDB("BBDD_1").getCollection("coleccion_1")
let col2 = db.getSiblingDB("BBDD_2").getCollection("coleccion_2")
// Borramos los índices en las colecciones
col.dropIndex("expirationDate_1") // Estos nombres los obtendremos del script listAllIndexes
col2.dropIndex("fecha_1")
}
Script de creación de índices tras la migración
Una vez finalizada la migración, deberíamos recrearlo con este script:
function createTTLIndexes() {
print("This script will recreate the TTL indexes fecha_1 and expirationDate_1")
let col = db.getSiblingDB("BBDD_1").getCollection("coleccion_1")
let col2 = db.getSiblingDB("BBDD_2").getCollection("coleccion_2")
col.createIndex({ "expirationDate": 1 }, {expireAfterSeconds: 3600 })
col2.createIndex({ "fecha": 1 }, {expireAfterSeconds: 3600 })
}
El proceso de mongomirror puede ralentizarse varios días, en función de los datos que se tenga. Si entre medias es necesario, habría que crear una tarea que simulara este comportamiento en el entorno actual de OnPremise, no en el nuevo. Se podría hacer con algún script en crontab, alguna función en javascript u otro driver con conexion a la BBDD, etc.
Esperemos que estos scripts e información te hayan servido de utilidad. Si necesitas migrar tu entorno de MongoDB a Atlas, puedes contar con nuestra ayuda. El uso de índices TTL, es solo una parte de las cosas a tener en cuenta. No dejes una migración de producción a la improvisación, llevamos varias migraciones con mongomirror a nuestras espaldas. Confía en los profesionales y ponte en contacto con nosotros sin compromiso.
¿Aún no conoces Query Performance? Descubre cómo puede ayudarte en tu entorno Oracle. Más información en su página de LinkedIn.
Sígue a GPS en LinkedIn

