DBAtlas · Atlas de operaciones de bases de datos

Crecimiento del log de transacciones / undo

Síntoma

El archivo de log de transacciones o el área de undo/redo crece rápidamente; 'log full', 'ORA-01555 snapshot too old', 'unable to extend undo'.

1. Encuentre la transacción abierta que hace crecer el log

El log/undo no se puede liberar hasta que finalice la transacción activa más antigua. Una sola transacción larga abierta puede estar reteniendo todo el log.

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. Entienda la causa raíz específica del motor

MSSQL: en el modelo de recuperación FULL, el log crece indefinidamente si no se toman backups de log. Oracle: ORA-01555 = retención/tamaño de undo insuficiente + una consulta larga. PG: si un replication slot no avanza, se acumula WAL; una transacción larga bloquea VACUUM.

3. La acción correcta para el log de MSSQL

Tome un backup de log (BACKUP LOG): esto permite reutilizar el log. Si el modelo de recuperación realmente debe ser SIMPLE, cámbielo. Luego, si es necesario (y solo si es necesario), reduzca el log.

SQL Server

BACKUP LOG [DB] TO DISK='C:\backup\DB_log.trn';
-- Then, if needed: DBCC SHRINKFILE (N'DB_log', 512);

4. Revisión de WAL / replication slot en PG

Un replication slot que no avanza (inactivo) provoca acumulación de WAL. Antes de eliminarlo, verifique el propietario del slot (slot_type, database, plugin): puede ser un standby desconectado temporalmente o un suscriptor lógico/CDC (p. ej., Debezium). Si se elimina el slot, el standby asociado debe reconstruirse y el lado del suscriptor/CDC debe resincronizarse. Elimínelo solo si realmente no se usa; para una protección duradera, establezca un límite superior con 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/retención y evite que se repita

Oracle: amplíe el tablespace UNDO, ajuste undo_retention según las consultas largas (o RETENTION GUARANTEE). Evite transacciones largas abiertas en la aplicación. Supervise que el job de backup de log se ejecute.

Abrir en DBAtlas →