Todos os produtos
Search
Central de documentação

Data Transmission Service:Sincronizar ou migrar coleções do MongoDB com índices TTL

Última atualização: Jun 27, 2026

Ao usar o Data Transmission Service (DTS) para sincronizar ou migrar coleções do MongoDB com índices Time-to-Live (TTL), a exclusão automática baseada em TTL no destino pode causar atrasos na tarefa e inconsistência de dados. Para evitar isso, defina temporariamente os índices TTL do destino com o valor máximo de expiração durante a sincronização ou migração.

Contexto

Ao migrar uma instância do MongoDB que contém coleções com índices TTL (por exemplo, sessões de usuário, logs ou dados de cache), use o DTS para sincronização completa e incremental. O objetivo é garantir zero perda de dados com impacto mínimo no serviço.

No entanto, o mecanismo de exclusão automática por TTL pode entrar em conflito com a sincronização do DTS, resultando em latência da tarefa e inconsistência de dados:

  • Exclusões redundantes reduzem a eficiência: Quando o índice TTL da origem exclui dados expirados, ele grava um registro DELETE no Oplog. O DTS replica esse DELETE no destino. Se o índice TTL do destino já tiver excluído os mesmos dados, o MongoDB retornará uma contagem de linhas afetadas inesperada. Isso aciona o tratamento de exceções e desacelera a migração.

  • Inconsistência de dados devido à exclusão assíncrona do TTL: Os índices TTL não excluem dados em tempo real. Dados expirados podem ainda existir na origem enquanto o destino já os excluiu, causando inconsistência.

    Exemplo:

    O Oplog ou ChangeStream do MongoDB registra apenas os campos atualizados para uma operação UPDATE, não o documento completo. Se um UPDATE não encontrar os dados de destino, o DTS ignora a operação.

    Momento

    Instância de origem

    Instância de destino

    1

    O serviço insere dados

    2

    O DTS sincroniza a operação INSERT

    3

    Os dados expiraram, mas o índice TTL ainda não os excluiu

    4

    O serviço atualiza os dados (por exemplo, atualiza o campo do índice TTL para alterar o tempo de expiração)

    5

    O índice TTL exclui os dados

    6

    O DTS sincroniza o UPDATE, mas não encontra os dados. A operação é ignorada.

    Como resultado, esse documento fica ausente na instância do MongoDB de destino.

Solução

Defina temporariamente os índices TTL do destino com o valor máximo de expiração durante toda a sincronização ou migração (fases completa e incremental). Restaure as configurações originais de TTL após alternar o tráfego para a nova instância.

Procedimento:

  1. Faça backup das configurações de índice TTL: No banco de dados de origem, execute um script para identificar todas as coleções com índices TTL e registre seus valores de expiração.

    Clique em para visualizar o script de exemplo

    // Script: Find and print information about all TTL indexes
    const collections = db.getCollectionNames();
    let ttlIndexes = [];
    collections.forEach(collName => {
        const indexes = db.getCollection(collName).getIndexes();
        indexes.forEach(idx => {
            if (idx.hasOwnProperty('expireAfterSeconds')) {
                console.log(`Found TTL index -> Collection: ${collName}, Index name: ${idx.name}, Expires after: ${idx.expireAfterSeconds} seconds`);
                ttlIndexes.push({
                    collection: collName,
                    name: idx.name,
                    expireAfterSeconds: idx.expireAfterSeconds
                });
            }
        });
    });
    // Save the following JSON output to a file for later steps.
    printjson(ttlIndexes);
  2. Desative a exclusão automática por TTL no destino:

    1. Verifique se a instância de destino já contém as coleções alvo e os índices TTL.

    2. Caso não contenha, use a migração de esquema para sincronizar as coleções primeiro. Em seguida, conecte-se ao banco de dados de destino e defina o tempo de expiração com o valor máximo para impedir a exclusão automática durante o processo.

    3. Se já contiver, conecte-se ao banco de dados de destino antes de iniciar a tarefa do DTS e defina a expiração do TTL com o valor máximo para impedir a exclusão automática durante o processo.

  3. Execute e monitore a tarefa do DTS: Inicie a tarefa de sincronização completa e incremental do DTS. Com a exclusão automática por TTL desativada no destino, o DTS consegue replicar todas as operações da origem sem conflitos.

    1. Crie e inicie a tarefa de sincronização ou migração de dados no console do DTS.

    2. Monitore as seguintes métricas durante o processo:

      • Latência da tarefa do DTS: Verifique na página de detalhes da tarefa se a latência da sincronização incremental permanece baixa.

      • Uso de armazenamento no destino: Como os dados no destino não expiram durante a migração, o uso de armazenamento cresce continuamente. Garanta espaço de armazenamento suficiente.

  4. Restaure as configurações de TTL: Após a conclusão da sincronização do DTS e a alternância do tráfego para a nova instância, restaure os valores originais de expiração do TTL a partir do seu backup. Um thread em segundo plano do MongoDB limpará os documentos expirados acumulados durante a migração.

  5. Observações:

    • Durante a sincronização ou migração incremental, o DTS ainda replica as operações DELETE geradas pelo índice TTL da origem sobre dados expirados.

    • Com a expiração do TTL no destino aumentada, o destino armazena dados que já expiraram na origem caso ocorra latência durante a sincronização/migração. Provisione armazenamento suficiente no destino com base no volume de escrita da origem.

    • Para coleções com valores de TTL muito curtos (dados temporários ou logs), evite migrar dados históricos. Em casos extremos, os dados totalmente migrados podem expirar no destino quase imediatamente, deixando a coleção vazia. Considere uma estratégia de escrita dupla ou apenas migração incremental.