Crescimento excessivo do log de transações / undo
Sintoma
O arquivo de log de transações ou a área de undo/redo está crescendo rápido; 'log full', 'ORA-01555 snapshot too old', 'unable to extend undo'.
1. Encontre a transação aberta que faz o log crescer
O log/undo não pode ser liberado até que a transação ativa mais antiga termine. Uma única transação longa aberta pode estar segurando o log inteiro.
Oracle
SELECT s.sid, s.username, t.start_time, t.used_ublk FROM v$transaction t JOIN v$session s ON t.ses_addr=s.saddr ORDER BY t.start_time;PostgreSQL
SELECT pid, state, xact_start, now()-xact_start age, query FROM pg_stat_activity WHERE xact_start IS NOT NULL ORDER BY xact_start;MySQL
SELECT trx_id, trx_started, trx_mysql_thread_id FROM information_schema.innodb_trx ORDER BY trx_started;SQL Server
DBCC OPENTRAN;2. Entenda a causa raiz específica da engine
MSSQL: no recovery model FULL, o log cresce indefinidamente se não forem feitos backups de log. Oracle: ORA-01555 = retenção/tamanho de undo insuficiente + uma consulta longa. PG: se um replication slot não avança, o WAL se acumula; uma transação longa bloqueia o VACUUM.
3. A ação certa para o log do MSSQL
Faça um backup de log (BACKUP LOG) — isso torna o log reutilizável. Se o recovery model realmente deveria ser SIMPLE, altere-o. Depois, se necessário (e só se necessário), reduza o log com shrink.
SQL Server
BACKUP LOG [DB] TO DISK='C:\backup\DB_log.trn';
-- Then, if needed: DBCC SHRINKFILE (N'DB_log', 512);4. Verificação de WAL / replication slot no PG
Um replication slot que não avança (inativo) causa acúmulo de WAL. Antes de removê-lo, verifique o dono do slot (slot_type, database, plugin): pode ser um standby temporariamente desconectado ou um assinante lógico/CDC (ex.: Debezium). Se o slot for removido, o standby ligado a ele precisa ser reconstruído e o lado assinante/CDC precisa ser ressincronizado. Remova-o apenas se realmente não estiver em uso; para proteção duradoura, defina um limite superior com max_slot_wal_keep_size (PG13+).
PostgreSQL
SELECT slot_name, active, pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn)) retained FROM pg_replication_slots ORDER BY 3 DESC;
-- If unneeded: SELECT pg_drop_replication_slot('slot_name');5. Ajuste undo/retenção e evite a recorrência
Oracle: aumente o tablespace UNDO, defina undo_retention de acordo com as consultas longas (ou RETENTION GUARANTEE). Evite transações longas abertas na aplicação. Monitore se o job de backup de log está rodando.