Log

VLF: Entendiendo el Log de SQL Server nivel pro

En nuestra constante búsqueda de optimización y eficiencia en el manejo de bases de datos, nos encontramos con una pieza clave en el rompecabezas de SQL Server: los Virtual Log Files (VLF). Estos componentes, aunque pequeños y a menudo pasados por alto, son fundamentales para el rendimiento y la gestión de nuestras bases de datos. Hoy, nos sumergimos en el mundo de los VLF para entender su función y cómo una gestión adecuada puede marcar la diferencia en nuestro trabajo diario como DBAs. Referenciando nuestro artículo anterior ¿Cómo funcionan los ficheros de Log de SQL Server?, podemos recordar que el log de transacciones juega un papel vital en la recuperación de datos y, los VLFs, como parte fundamental de los logs, tienen la misma importancia.

¿Qué son los VLF y por qué son importantes?

Los VLF son segmentos virtuales en los que se divide el archivo de log de transacciones de una base de datos en SQL Server. Es decir, SQL Server no trabaja con el fichero de log completo sino con pequeñas particiones del mismo. Cada vez que se crea o se expande un log, SQL Server lo divide en varios VLFs. La cantidad y el tamaño de estos VLF pueden tener un impacto significativo en el rendimiento de la base de datos, especialmente durante operaciones de recuperación y respaldo. En casos extremos, si tenemos el log muy particionado puede afectarnos también al rendimiento de nuestras transacciones. 

Gestión Efectiva de VLF

Para mantener un sistema saludable, es crucial gestionar adecuadamente los VLF. Un número excesivo de VLF pequeños puede causar lentitud en el proceso de recuperación de la base de datos, mientras que muy pocos VLF grandes pueden dificultar el proceso de respaldo. Por ello, encontrar el equilibrio correcto es esencial. Los VLF son los bloques de construcción de este log, y su gestión eficiente permite una recuperación más rápida y una mejor disponibilidad de la base de datos.

Una estrategia efectiva para la gestión de VLF implica monitorear su cantidad y tamaño regularmente. SQL Server proporciona herramientas que nos permiten visualizar y ajustar estos parámetros, como el deprecado comando DBCC LOGINFO o su nueva versión, la función sys.dm_db_log_info. Además, prácticas como el truncamiento regular del log y la expansión controlada del archivo de log ayudan a mantener un número óptimo de VLF.

Creación de VLFs

Hemos visto que el motor de SQL Server crea automáticamente los VLFs durante el crecimiento de los ficheros de logs, sin embargo, esto no significa que nosotros no podamos influir sobre ello. Simplemente tendremos que conocer qué reglas sigue SQL para crear VLFs para adaptarnos a ello. Antes de nada tenemos que especificar que las reglas de creación de VLFs han cambiado con SQL 2022 por lo que tanto para esta versión como para Azure tendremos que tenerlo en cuenta. Veamos cómo se crean los VLFs:

  • Cuando el crecimiento del archivo de log es menor a 64 Mb SQL creará 4 VLFs en versiones antiguas y solo 1 VLF en SQL 2022 y en Azure.
  • Si el crecimiento del archivo de log es igual o mayor a 64 Mb pero menor a 1 Gb se crearán 8 VLFs.
  • Si el crecimiento del archivo de log es igual o mayor a 1Gb se crearán 16 VLFs.

Cuantos VLFs tienen mis logs

Ya sabemos cómo se crean los VLFs y por qué podemos llegar a tener muchos en nuestros mecheros de logs pero, no os he dicho aún cómo comprobar en vuestras bases de datos cuantos VLFs teneis. Para ello usaremos el siguiente script. Y ahora la pregunta clave, ¿Cuántos VLF debería tener? La respuesta es depende, no hay una respuesta universal a esta pregunta. Personalmente creo que sobre 50 es una buena cifra pero dependerá en gran medida del tamaño del fichero de log. 

Hora de hacer números y corregir los VLF

Supongamos que nuestra base de datos tiene un log de 20Gb y hemos visto que por alguna mala práctica del pasado tenemos muchos VLF. Lo primero que tendremos que hacer es un shrink para reducir el log lo máximo posible. Una vez con el log en su tamaño mínimo vamos a volver a dimensionarlo a sus 20Gb originales pero siguiendo las buenas prácticas de VLF. Vamos a crear un número de VLF cercano a 50. Para ello no podemos dimensionar directamente en 20Gb porque solo nos crearía 16 VLF y serían muy grandes para ser administrados por SQL de manera óptima. Qué pasa si aumentamos 8 Gb iniciales, luego otros 8 y terminamos con un crecimiento de 4 Gb. Esto serían 3 crecimientos del fichero superiores a 1 Gb por lo que se nos crearían 16 VLF en cada “salto”, 16*3=48. Parece bastante razonable. Ahora, si el fichero puede necesitar crecer en un futuro, podría ser interesante hacer 3 crecimientos de 8 Gb lo que nos daría 24 Gb de log repartidos igualmente en 48 VLF (unos ficheros de 512 Mb cada uno, algo asumible).

Conclusión

La gestión de VLF no es solo una tarea de mantenimiento; es una oportunidad para maximizar el rendimiento de nuestras bases de datos. Al comprender la importancia de estos elementos y aplicar prácticas de gestión efectivas, podemos asegurar un sistema robusto y ágil. Los VLF son, sin duda, pequeños gigantes en el mundo de SQL Server, y su correcta administración está reservada a unos pocos DBAs expertos con gran pericia técnica, como vosotros ahora.

Espero que este artículo te haya sido útil. Si tenéis alguna duda o sugerencia, podéis dejarla en Twitter, por mail o dejarnos un mensaje en los comentarios. Y recuerda que también tenemos un grupo de LinkedIn y un canal de YouTube a los que te puede unir. ¡Hasta la próxima!

Publicado por Roberto Carrancio en Rendimiento, SQL Server, 0 comentarios

¿Cómo funcionan los ficheros de Log de SQL Server?

En el artículo de hoy vamos a profundizar en los ficheros de log. Estos ficheros representan una de las herramientas más potentes para garantizar la integridad y la recuperación de datos. Estos archivos, a menudo subestimados, son fundamentales para el funcionamiento de cualquier sistema que dependa de la gestión de datos transaccionales como es SQL Server. 

¿Qué son los ficheros de Log?

Los ficheros de log, también conocidos como archivos de transacciones, registran todas las operaciones que modifican los datos o la estructura de la base de datos. Cada transacción en SQL Server comienza con una entrada en el log, asegurando que cualquier cambio pueda ser rastreado y, si es necesario, revertido o reproducido. Físicamente, los podemos encontrar como ficheros con extensión LDF. 

La importancia de los Logs en la recuperación de datos

Como ya vimos en el artículo sobre los CHECKPOINTS, una de las funciones más críticas de los ficheros de log es su papel en la recuperación de datos. En caso de un fallo del sistema, los logs son esenciales para restaurar la base de datos a un punto consistente en el tiempo, minimizando la pérdida de datos y manteniendo la integridad de los datos. Esto, en última instancia, nos garantiza la continuidad de nuestro negocio.

El impacto del nivel de recuperación en el comportamiento de la base de datos

El nivel de recuperación de una base de datos es un factor determinante en la forma en que SQL Server maneja los ficheros de log y, por ende, afecta directamente el comportamiento de la base de datos. Al seleccionar un modelo de recuperación, estamos definiendo cómo y cuándo se registran las transacciones en los ficheros de log, lo que tiene implicaciones significativas en la disponibilidad, la integridad y la recuperabilidad de los datos.

Modelo de recuperación simple

Con el modelo de recuperación simple, SQL Server minimiza el mantenimiento de los ficheros de log al truncar automáticamente los registros de transacciones que ya no son necesarios para la recuperación. Truncar el fichero significa vaciarlo, sin embargo, como ya hemos comentado en más ocasiones, el tamaño del fichero no se reduce, se queda pre dimensionado para cuando otras transacciones lo necesiten. Este modelo de recuperación de las bases de datos reduce el espacio de almacenamiento requerido y simplifica la gestión, pero limita la capacidad de recuperar la base de datos a puntos específicos en el tiempo, ofreciendo solo la posibilidad de restaurar hasta el último respaldo completo o diferencial.

Modelo de recuperación completa

A diferencia del modo simple, el modelo de recuperación completa mantiene un registro detallado de todas las transacciones, lo que permite una recuperación punto a punto. Esto significa que podemos restaurar la base de datos a cualquier momento específico, siempre y cuando dispongamos de los respaldos de log necesarios. Para entendernos, las transacciones no se borran del fichero de log nada más concluyen (commit o rollback) sino que se mantienen en el fichero hasta que se hace una copia de seguridad. Este nivel de detalle, por tanto, requiere una gestión más activa de los ficheros de log para evitar un crecimiento excesivo y problemas de rendimiento.

Modelo de recuperación bulk-logged

El modelo de recuperación bulk-logged es una variante del modelo completo que ofrece una solución intermedia. Permite operaciones masivas de datos, como importaciones o indexaciones, sin registrar cada detalle en el log mientras mantiene todo el detalle de las transacciones normales. Esto nos permite reducir el tamaño del fichero durante estas operaciones. Aunque ofrece ciertas ventajas en términos de rendimiento, también conlleva un riesgo mayor en la recuperación de datos, ya que no se pueden recuperar transacciones individuales realizadas durante las operaciones masivas.

Gestión y mantenimiento de los ficheros de Log

Una gestión efectiva de los ficheros de log implica monitorear su tamaño y realizar un mantenimiento regular, como el truncamiento de log, que libera espacio para nuevas transacciones. Ignorar estas prácticas puede llevar a un crecimiento descontrolado del log y afectar negativamente el rendimiento del sistema. 

Como hemos visto, el log de transacciones almacena las transacciones en curso en el modelo de recuperación simple o, en el modo completo las en curso y las finalizadas de las que no dispongamos backup. Podemos entender entonces que, puede llenarse completamente por varias razones, que van desde un gran número de transacciones hasta consultas mal optimizadas o configuraciones inadecuadas. Uno de los factores más comunes es la retención de registros de transacciones debido a transacciones largas o no completadas. Además, si el modelo de recuperación de la base de datos está configurado como completo o bulk-logged y no se realizan copias de seguridad del log de forma regular, el log seguirá creciendo, ya que SQL Server espera que estos registros estén disponibles para una posible recuperación punto a punto.

¿Por qué no se vacía mi log de transacciones?

SQL Server proporciona una columna muy útil en la vista de catálogo sys.databases llamada log_reuse_wait_desc, que indica la razón por la cual el espacio del log de transacciones no se puede reutilizar. Algunos de los tipos de log_reuse_wait más comunes son:

  1. ACTIVE_TRANSACTION: Indica que hay una transacción activa que impide el truncamiento del log.
  2. LOG_BACKUP: Señala que se necesita una copia de seguridad del log para permitir la reutilización del espacio.
  3. CHECKPOINT: Sugiere que no se ha alcanzado un punto de control que permita el truncamiento del log.
  4. ACTIVE_BACKUP_OR_RESTORE: Implica que una operación de copia de seguridad o restauración está en curso, lo que impide el truncamiento.
  5. REPLICATION: Indica que la replicación no ha terminado de procesar los registros que necesitan ser distribuidos. Este tipo de espera se usa también para Log Shipping.
  6. DATABASE_MIRRORING: Señala que el espejo de base de datos está activo y que los registros aún no se han enviado a la réplica secundaria.
  7. AVAILABILITY_REPLICA: Indica que una réplica de disponibilidad de AlwaysOn está aplicando registros del log a una base de datos secundaria.

Cada uno de estos estados requiere una acción específica para liberar espacio en el log de transacciones. Por ejemplo, si el log_reuse_wait_desc muestra LOG_BACKUP, se debe realizar una copia de seguridad del log para permitir que el espacio sea reutilizado. Si muestra ACTIVE_TRANSACTION, se debe investigar y resolver la transacción larga o bloqueada.

Conclusión

Los ficheros de log son el core de la seguridad y la integridad de las bases de datos en SQL Server. Su correcta gestión y comprensión son esenciales para cualquier DBA que busque asegurar la máxima eficiencia y confiabilidad en sus sistemas. Al dominar los ficheros de log, nos equipamos con una poderosa herramienta para enfrentar casi cualquier desafío en el mundo de las bases de datos.

Entender por qué se llena el log de transacciones y cómo gestionar los diferentes tipos de log_reuse_wait es esencial para cualquier administrador de bases de datos SQL Server. Una gestión adecuada del log no solo previene problemas de rendimiento, sino que también asegura la disponibilidad y la recuperabilidad de la base de datos. Con este conocimiento, los DBAs podemos tomar medidas proactivas para mantener el log de transacciones en un tamaño manejable y garantizar el funcionamiento óptimo de nuestros sistemas de bases de datos.

Espero que este artículo te haya sido útil. Si tenéis alguna duda o sugerencia, podéis dejarla en Twitter, por mail o dejarnos un mensaje en los comentarios. Y recuerda que también tenemos un grupo de LinkedIn y un canal de YouTube a los que te puede unir. ¡Hasta la próxima!

Publicado por Roberto Carrancio en SQL Server, 2 comentarios