01
O disco que encheu sem o banco crescer
O time de dados tinha trocado o pipeline de analytics: saiu um conector Debezium que lia a tabela de pedidos por replicação lógica, entrou uma exportação incremental para o data warehouse. O conector foi desligado, o serviço removido do cluster e o ticket fechado. O slot lógico debezium_orders, criado pelo conector na primeira execução, continuou existindo na primária. Um slot não depende de o consumidor estar vivo. Ele é um objeto persistente do servidor, sobrevive a reinícios e não expira por padrão.
Dia 0 pipeline de analytics migrado; conector Debezium antigo desligado
slot logico "debezium_orders" continua na primaria (active = false)
restart_lsn congela no ultimo LSN confirmado
Dia 1..8 primaria gera ~40 GB de WAL por dia
checkpoint quer reciclar segmentos antigos, mas o slot ainda "precisa" deles
pg_wal: 1 GB -> 40 GB -> 120 GB -> ... -> 320 GB
volume de 500 GB: dados 150 GB + pg_wal crescendo
Dia 8, 22:10 alerta de disco em 90%: tratado como crescimento normal de dados
Dia 9, 03:42 PANIC: could not write to file "pg_wal/xlogtemp.48121": No space left on device
primaria fora do ar, API e workers parados
Correcao: pg_drop_replication_slot('debezium_orders') + CHECKPOINT
pg_wal volta para ~2 GB em menos de 1 minutoDois sinais foram ignorados porque pareciam normais. O alerta de disco em 90% disparou na noite anterior e foi lido como crescimento de dados, já que ninguém olhava o tamanho do pg_wal separado do tamanho das tabelas. E o painel de replicação mostrava a réplica física em dia, com atraso de milissegundos, porque o slot problemático não era dela. O incidente só foi entendido quando alguém rodou du no diretório de dados e viu 320 GB dentro do pg_wal.
O primeiro impulso do plantão foi apagar arquivos antigos do pg_wal para liberar espaço. Isso teria sido o pior desfecho possível: os segmentos ali incluem o WAL necessário para a recuperação após a queda, e apagar o arquivo errado transforma um disco cheio em um banco que não sobe ou em dados corrompidos. A correção certa levou três comandos SQL, mas só depois de liberar espaço fora do pg_wal para a primária conseguir iniciar.