Hola a todos, recientemente, en uno de nuestros clientes nos encontramos con un misterio. Tras un cambio de nodo en AlwaysOn, pasadas unas horas empezaron a llegar alertas porque no baja el log de una base de datos. A pesar de hacerse backup de log, éste no bajaba. ¿Qué estaba pasando?
Previo al cambio de nodo se había activado CDC sólo en algunas bases de datos, en el nodo que estaba inicialmente como principal, pero no se activó en el nodo secundario. Esta sería la clave como veremos más adelante, y como lo solucionamos.
Comprobación del log
Lo primero que hicimos era controlar el log, ver su nivel de ocupación en MB y en porcentaje. Esta información la proporciona el comando nativo de SQL Server:
dbcc sqlperf(logspace)
Con este comando, comprobamos que, aunque lentamente, se iba llenando el log de la única base de datos que recibíamos alerta al estar en más del 80%. Investigando cuál podría ser la causa, ejecutamos la siguiente query, que te dice por qué no puede liberar el log (por una transacción activa por ejemplo, porque esta esperando backup de log…)
SELECT name, log_reuse_wait_desc FROM sys.databases WHERE name = 'TuBaseDeDatos';
Pero el resultado fue llamativo. En todas las BBDD aparecía ‘NOTHING‘ en el valor de «log_reuse_wait_desc» a excepción de las 4 bases de datos que habíamos activado CDC. En una de ellas ponía «ACTIVE_TRANSACTION», porque tendría alguna transacción activa, y en las otras 3, ponía «REPLICATION«.
Este dato fue el que nos dio la pista. A pesar de no tener ninguna replicación esa instancia (se comprobó por si hubiera alguna tabla o algún rastro de alguna replicación antigua) y no salía nada.
Atando cabos, nos dimos cuenta que de las 3 bases de datos que ponía «REPLICATION», las 3 tenían CDC activado en el antiguo nodo. Adicionalmente, había una cuarta base de datos que tenía CDC activado, pero aparecía como «NOTHING» al igual que el resto de bases de datos, por lo que modificamos la query anterior, para incluir si tiene CDC habilitado o no y su estado sea distinto de ‘NOTHING’ y este fue el resultado:

El problema no era el log, sino el CDC
Tras tener acotado el problema, comprobamos que las BBDD tenían habilitado CDC en el nodo actualmente secundario (y primario tras el cambio), pero no tenía los jobs de captura y borrado.
Para solucionarlo, creamos los jobs de captura y limpieza propios del CDC en una BBDD ejecutando este script:
USE BBDD_CON_CDC;
GO
-- Creación del job de captura
EXEC sys.sp_cdc_add_job @job_type = N'capture';
GO
-- Creación del job de limpieza
EXEC sys.sp_cdc_add_job
@job_type = N'cleanup',
@start_job = 0,
@retention = 5760;
Al comprobar que se empezó a liberar el backup de log, lo aplicamos para el resto de las BBDDs con CDC y se resolvió el problema.
Conclusión
A pesar de que todo apuntaba a que había un problema con el log, o el backup de log. Realmente el problema era el CDC. Somos conscientes de que a este tipo de conclusiones se llegan con la experiencia. Por este motivo, contamos en nuestra plantilla con expertos en bases de datos SQL Server. Si tienes algún misterio de SQL Server u otras bases de datos, como Oracle, que no puedes resolver o quieres que revisemos tu entorno. No dudes en ponerte en contacto con nosotros.
Si no quieres perderte consejos y problemas que vamos solucionando con el día a día, no dudes a suscribirte a nuestra newsletter. Con solo un email al mes, estarás al día de nuestras publicaciones.
¿Aún no conoces Query Performance? Descubre cómo puede ayudarte en tu entorno Oracle. Más información en su página de LinkedIn.
Sígue a GPS en LinkedIn
