DBAtlas · Atlas de operações de banco de dados

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.

Abrir no DBAtlas →