Memorias de un DBA

Un blog dedicado a contribuir a la comunidad SQL Server en español

¿Qué es el Transaction Log?

with 6 comments

Desde que comencé a trabajar con bases de datos de SQL Server, siempre preguntaba a quienes consideraba mis maestros, ¿Para que sirve el Transaction Log?, siempre recibía la misma respuesta, “No se, creo que para nada”. Esa respuesta nunca me pareció correcta, debido a que siempre pensé que si ese tipo de archivo existía en una base de datos, para algo ha de servir. Peor aun me parecía el trato que le daban a este archivo en los sistemas que ya se encontraban en producción, y era crear un job especifico para truncar el log de la base de datos y que este deje de crecer tan desproporcionalmente sin siquiera preguntarse porque lo hacia, simplemente este job iba y descuartizaba al pobre archivo de log.

Bueno pasados los años y adquirido el conocimiento por fin aprendí que el Transaction Log es una parte vital de la base de datos y muy importante para poder tener un sistema saludable. En el “Transaction Log” o “Log de Transacciones” se guardan todas y cada una de las transacciones que se realizan en la base de datos, el explicar lo que es una transacción en base de datos sera otro post completo y dedicado a explicarlas, pero por ahora debe quedar claro que el log de transacciones es el que asegura que una transacción tenga la propiedad ACID (Atomicity, Consistency, Isolation and Durability), debido a que cuando se modifica un dato en la base de datos, lo primero que se hace para asegurar que la transacción ha sido confirmada es escribir en el log de transacciones los cambios realizados por la transacción, una vez realizado esto recién se puede decir que la transacción esta completada, esta es la única manera de asegurar que una transacción sea durable en el tiempo, porque si ocurriese un problema justo después de hacer “commit” a una transacción, el log de transacciones es el único medio que tiene la base de datos para poder reproducir los cambios en los archivos de datos de la base de datos.

Casi en el inicio de este post mencione que lo que normalmente los desarrolladores ya analistas de las compañías donde antes trabajaba hacían para evitar el problema del crecimiento del archivo “Log de Transacciones” era usar un par de sentencias las cuales permitían truncar el log de transacciones y reducir el tamaño del mismo. Felizmente en las ultimas versiones de SQL Server (2008 en adelante) estas sentencias han quedado descontinuadas y ya no se pueden usar, obligando de esta manera a darles un correcto trato a los log de transacciones. Pero ¿por qué es tan perjudicial truncar y reducir el tamaño del log?, bueno esto se debe a que al reducir el espacio que ocupa el log de transacciones, este en algún memento o momentos necesitara crecer degradando la performance del sistema debido a que ninguna transacción podrá ser confirmada hasta que el log de transacciones este listo para poder seguir recibiendo transacciones. Otro de los defectos es que cada vez que crece el log de transacciones, el archivo se puede tener fragmentar dentro del disco.

El log de transacciones se maneja dependiendo del modelo de recuperación que tenga configurado la base de datos. En otro post hablaremos mas detalladamente de los modelos de recuperación que manejan las bases de datos SQL Server. Por ahora se debe solamente tener en claro que los registros dentro de log de transacciones manejan estados (activo / inactivo), de esta manera se identifica los registros que ya no son útiles y se pueden sobrescribir, o de los cuales se pueden reclamar espacio en disco. Si no hay espacio libre o registros inactivos para que el log de transacciones pueda escribir sobre ellos, entonces el este crecerá un determinado numero de bytes, y como ya hemos explicado este crecimiento es costoso en términos de performance. De esto podemos derivar la conclusión de que el log de transacciones tiene un comportamiento cíclico, es decir que cuando llega al final de archivo buscara  espacio libre al inicio para poder seguir escribiendo las transacciones de la base de datos.

Como ya hemos mencionado el log de transacciones tiene la habilidad de crecer pero hasta que tamaño o en que proporción, para esto podemos ejecutar el siguiente comando:

EXECUTE sp_helpfile

El resultado del comando sera el siguiente

En la imagen anterior podemos observar que en esta base de datos en especifico el log esta configurado para crear ilimitadamente (columna “maxsize”) y que adicionalmente se ha configurado un crecimiento automático del 10% del tamaño del log, es decir que la proxima vez que necesite crecer el log de transacciones, este crecerá en un 10% del tamaño actual. Esta configuración no es muy optima porque como hemos discutido el log de transacciones no debe de crecer tan seguido, entonces para evitar eso debemos colocar un valor fijo y no un porcentaje, el valor fijo que coloquemos debe ser suficiente como para aguantar la llegada de todas las transacciones de la base de datos sin necesidad de volver a crecer automáticamente y volver a golpear la performance de la base de datos.

Otra de las características del log de transacciones es que su método de escritura es secuencial es decir va en un orden predeterminado, no es como un archivo de datos de una base de datos que escribe la data en forma aleatoria según la ubicación de las paginas de datos. El log de transacciones al ser un archivo de escritura secuencial es mas rápido en cuanto a escritura de disco concierne porque la aguja del disco duro no debe moverse aleatoriamente, sino que esta solo debe moverse en una dirección hasta que se llegue al final del archivo y se necesite aplicar el comportamiento cíclico del archivo y se regrese al inicio del archivo para seguir ingresando transacciones.

Written by dbamemories

junio 28, 2011 a 3:12 pm

6 comentarios

Subscribe to comments with RSS.

  1. Muy bien la explicacion me aclaro esto

    Alejandro

    mayo 9, 2012 at 9:27 pm

  2. Muy bueno el tema y muchas gracias por las aclaraciones.
    Saludos.

    Esteban Quijada Suazo

    febrero 4, 2014 at 8:25 am

  3. Cuando habla que el log debemos colocar un valor fijo y no un porcentaje 10% en mis base de datos y en su ejemplo, cual es el valor mas apropieado 10000, 15000 kb, o dependera del crecimiento de tu base de datos????
    Saludos.

    Esteban Quijada Suazo

    febrero 4, 2014 at 8:36 am

    • Hola Esteban, el valor de crecimiento del transaction log debe ser un valor fijo para que los subsecuentes VLFs creados en cada autogrowth tengan el mismo tamaño. En cuanto al tamaño fijo de crecimiento dependera, no tando del tamaño de tu base de datos, sino de cuan transaccional sea, si es bastante transaccional entonces el valor sera mas grande, si no lo es tanto, entonces este debera ser mas pequeño. Pero recuerda que el autocrecimiento ocurre siempre y cuando no se este haciendo un mantenimiento debido al transaction log o la base de datos recibio mas transacciones de las regulares en un periodo de tiempo.

      dbamemories

      febrero 4, 2014 at 8:44 am

      • Nuevamente gracias me ha quedado claro y muy buena esta web para todos los que nos gustan las bases de datos y sobretodo porque me estoy preparando para dar el examen de DBA 70-432 y por lo que todas estas dudas debo tenerlas claras, saludos y gracias.

        Esteban Quijada Suazo

        febrero 4, 2014 at 9:09 am

  4. Podría pedirle un favor si no es la mucha molestia, he estado viendo sus publicaciones y no ha escrito sobre transacciones no del Log sino la transacción y propiedades ACID, ahora personalmente he leido y aprendido de eso pero creo que es un tema muy importante del cual tener una visión mas amplia de una persona con mayor experiencia del tema se agradecería mucho, saludos.

    Esteban Quijada Suazo

    marzo 5, 2014 at 10:04 am


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: