Originally written for Percona Blog in November, 2026 – Will your MongoDB upgrade break? Check it with UCFM
Você foi escalado para uma das tarefas mais comuns, e mais temidas, na vida de um DBA:
- Você precisa fazer o upgrade do seu cluster.
Upgrades são necessários por vários motivos, seja para corrigir um bug existente ou para manter o ambiente dentro do suporte e elegível a receber correções de segurança. Seja qual for o motivo, a tarefa é sua.
A troca do binário é a parte fácil. A parte difícil é tudo o que vem antes:
- O ambiente é crítico.
- O dataset é enorme, e você não faz ideia do que tem por trás desse tamanho.
- A configuração carrega parâmetros que ninguém lembra de ter setado.
- … e a lista continua.
Como era antes
Um upgrade major no MongoDB anda uma release por vez, não importa o salto que você planeja. Por exemplo: “Ir da 6.0 para a 8.0”
- Isso significa dois upgrades, 6.0 para 7.0 e depois 7.0 para 8.0, cada um com a sua troca de binário e a sua mudança de featureCompatibilityVersion (FCV).
Então a lição de casa não se faz uma vez. Ela se faz a cada passo, e em cada passo o checklist é mais ou menos este:
- Ler a página de compatibility changes e as release notes da versão de destino.
- Comparar cada
mongod.confe cadasetParametercom o que foi removido ou renomeado. - Procurar por comandos, operadores e aggregation stages removidos na aplicação, nas views e nas roles customizadas.
- Ah! Você usa um Sharded Cluster? Legal, você precisa repetir isso em vários nós e shards, além de checar o balancer, os config servers e cada shard.
- […]
Nada disso é difícil por si só. É só longo, chato, fácil de errar e diferente para cada passo de versão. E não existia um único comando que respondesse à pergunta de verdade:
Esse deployment está pronto para o upgrade? Se não, o que eu devo corrigir primeiro?
Conheça o UCFM, o upgrade checker para MongoDB
O UCFM (Upgrade Checker For MongoDB) diz se um deployment de MongoDB ou de Percona Server for MongoDB está pronto para o upgrade, e o que corrigir primeiro.
Se você já trabalhou com MySQL, a ideia pode soar familiar: isso porque o ucfm é bastante inspirado no upgrade checker do MySQL Shell, o util.checkForServerUpgrade().
DBAs de MySQL têm essa resposta há anos.
- Você aponta a ferramenta para um servidor e uma versão de destino, e ela roda uma lista numerada de checks.
- Cada check diz “No issues found” ou lista o que encontrou como Error, Warning ou Notice, com os objetos envolvidos e um link para a documentação.
- A saída termina com uma contagem e uma frase simples: corrija os erros antes de fazer o upgrade.
O valor não está em nenhum check isolado. Está em ter um lugar só que conhece cada mudança entre duas versões, aplica todas elas ao seu deployment e te entrega uma lista curta do que corrigir.
Foi essa a ideia por trás dele: uma ferramenta que diz o que está certo e o que está errado no seu ambiente, e responde essa mesma pergunta um passo de upgrade por vez.
Se você está um passo antes e ainda decide qual caminho tomar, deixa eu recomendar o MongoDB Upgrade Roadmap; ele pode te ajudar com os passos do upgrade.
O que ele faz e o que não faz
O ucfm é uma ferramenta somente leitura que funciona checando fatos de cada membro que consegue alcançar no seu deployment.
Você aponta para um nó, e ele descobre o resto do replica set, ou os config servers, shards e mongos. Depois roda três tipos de check:
- O que desaparece entre versões.
- O que as release notes dizem.
- Se uma mudança de comportamento afeta você.
No fim do check, ele gera uma lista com os achados e as ações recomendadas.
Vale destacar que o ucfm não faz upgrade de nada. Ele lê e reporta; o upgrade continua sendo seu.
O que ele te dá é a resposta para a pergunta do começo deste post. Antes da janela de manutenção, você sabe o que pode quebrar e onde.
Como usar
Instalação
Um comando baixa a última release, verifica o checksum e instala o ucfm em /usr/local/bin (ou em ~/.local/bin quando você não é root). Rodar de novo atualiza.
curl -fsSL https://raw.githubusercontent.com/jenunes/ucfm/main/install.sh | bash
Crie um usuário somente leitura
A ferramenta precisa de clusterMonitor, readAnyDatabase e uma role pequena que consiga ler usuários, roles e definições de views. Para isso criamos uma role customizada, a ucfmViewSecurity, que guarda as permissões necessárias, e você pode removê-la depois se preferir:
use admin
db.createRole({
role: "ucfmViewSecurity",
privileges: [
{ resource: { cluster: true }, actions: ["viewUser"] },
{ resource: { db: "", collection: "" }, actions: ["viewUser", "viewRole"] },
{ resource: { db: "", collection: "system.views" }, actions: ["find"] }
],
roles: []
})
Depois crie o usuário com as permissões necessárias:
use admin
db.createUser({
user: "ucfm",
pwd: passwordPrompt(),
roles: ["clusterMonitor", "readAnyDatabase", "ucfmViewSecurity"]
})
Nota: Em sharded cluster, crie o usuário no mongos e também no primary de cada shard. ucfm conecta direto nos membros dos shards, e eles só aceitam usuários locais do shard. Se você esquecer algum, ele avisa e nomeia o shard.
Cheque seu cluster
Aponte o --uri para qualquer membro do replica set, ou para um mongos (se for sharded cluster), e informe a versão de destino:
ucfm check --uri "mongodb://ucfm@db1:27017/?authSource=admin" --target 7.0
Se preferir, deixe a senha fora do --uri e o ucfm pergunta por ela. Para scripts, use a variável de ambiente UCFM_URI ou o --uri-file.
O relatório começa com os checks do deployment inteiro (caminho de upgrade, FCV, saúde, estado do sharding), depois traz um bloco por passo de upgrade. Um exemplo resumido:
The MongoDB deployment at db1:27017 (replica set rs0, 3 members), Percona
Server for MongoDB 6.0.29-23, will now be checked for compatibility issues for
upgrade to MongoDB 7.0 (path 6.0 → 7.0)...
================================================================================
Deployment-wide checks
================================================================================
1) Upgrade path (upgrade-path)
No issues found: from 6.0 (current) to 7.0 (target) is a supported upgrade
path.
2) Server versions across members (binary-versions-consistent)
No issues found: all 3 members run 6.0.29-23.
3) featureCompatibilityVersion (fcv-matches-binary)
No issues found: FCV is 6.0 on 3 members, the same as their binaries.
[...]
================================================================================
Upgrade 6.0 → 7.0
Checked against Percona Server for MongoDB 7.0, psmdb-7.0.45-24
================================================================================
[...]
20) PSMDB journal options (psmdb-journal-option-ignored)
Notice: storage.journal.enabled / --journal / --nojournal are set. PSMDB 7.0
and later always journal and ignore these settings, logging a startup
warning.
- db1:27017, db2:27017, db3:27017
Solution:
- Remove the journal settings from the configuration.
More information:
https://docs.percona.com/percona-server-for-mongodb/7.0/install/upgrade-from-60.html
[...]
24) Usage of removed commands (command-removed-in-use)
Warning: Clients ran these commands since the servers started (longest uptime
1d); 7.0 no longer implements them and will answer CommandNotFound.
- availableQueryOptions (6 calls)
Solution:
- Find the applications or tools issuing these commands (profiler, logs,
$currentOp) and update them before upgrading.
More information:
https://www.mongodb.com/docs/manual/release-notes/7.0-compatibility/
[...]
================================================================================
Errors: 0
Warnings: 3
Notices: 4
Checks with warnings:
- 24) Usage of removed commands (command-removed-in-use)
- 31) Floating-point rounding in $add (add-rounding)
- 35) $natural hint and sort values (natural-hint-values)
No errors were found. Review the 3 warnings before upgrading.
Antes de passar pelos resultados, leia o topo do relatório: ele diz o que está sendo checado, e os primeiros checks dizem o que não pôde ser checado e como resolver isso.
A ferramenta checa um upgrade major por vez. Caso o destino esteja mais longe, por exemplo do 6.0 ao 8.0, o check mostra o caminho completo e o relatório só do primeiro passo, nesse caso 7.0; rode a ferramenta novamente depois de cada upgrade para ter o relatório correto da versão.
O exit code segue o resultado (0 limpo, 1 warnings, 2 errors, 3 falha da ferramenta), então o check cabe num pipeline. Adicione --format json para obter a saída em JSON, ou --deep-check para amostrar até 1000 documentos por collection e verificar as mudanças que dependem dos dados armazenados.
Auditar as configurações de produção
Upgrade é um bom momento para entender como anda o resto da casa. O ucfm audit compara o deployment com as Production Notes e o Operations Checklist do MongoDB:
ucfm audit --uri "mongodb://ucfm@db1:27017/?authSource=admin"
Você também pode anexar essa auditoria ao ucfm check padrão com --with-audit:
ucfm check --uri "mongodb://ucfm@db1:27017/?authSource=admin" --target 7.0 --with-audit
Uma execução, um relatório com as duas seções.
Com isso, acredito que você já tem o que precisa para a sua próxima janela de manutenção. Quando quiser ir além, como checar o sistema operacional de cada host ou coletar um snapshot para analisar em outro lugar, dê uma olhada na documentação do UCFM, que tem mais detalhes.
Conclusão
O UCFM nasceu do desejo de simplificar um processo e de responder à pergunta destacada no começo, uma pergunta que, até agora, não tinha um único comando para respondê-la.
Ainda assim, ele não substitui o seu julgamento, o seu backup nem o procedimento de upgrade. Ele substitui o checklist manual e longo por uma única passada de leitura no ambiente que você já tem: um passo por vez, com achados nos quais você pode agir antes da janela de manutenção.
Instale, aponte para um nó, escolha o destino e leia o relatório. Corrija os erros, rode de novo e me conte como foi.
Sugestões, correções e features são todas bem-vindas; o projeto é open source em: github.com/jenunes/ucfm.