Abrir un archivo LDF y ver su contenido

Cada base de datos SQL Server está mapeada sobre un conjunto de archivos del sistema operativo. Estos archivos guardan datos e información de registro. Archivos individuales son usados sólo por una base de datos, y los datos y la información de registro nunca son mezclados en el mismo archivo. Mientras los datos son almacenados en un archivo MDF, todas las transacciones y las modificaciones a la base de datos SQL Server hechos por cada transacción son almacenadas en un archivo LDF – un archivo de registro de transacciones que es un componente esencial de la base de datos. Conceptualmente, el archivo de registro es una cadena de entradas de registro. Físicamente, las entradas de registro son almacenadas en uno o el conjunto de archivos LDF físicos que implementan el registro de transacciones.

El propósito primario de un archivo LDF es proveer el concepto ACID – Atomicity (Atomicidad), Consistency (Consistencia), Isolation (Aislamiento) y Durability (Durabilidad).

  • Atomicidad: Si una parte de la transacción falla, la transacción entera falla, y el estado de la base de datos se queda sin cambios.
  • Consistencia: Cualquier transacción lleva la base de datos de un estado válido a otro.
  • Aislamiento: La ejecución de transacciones concurrentes lleva la base de datos a un estado como si las transacciones fueran ejecutadas en serie, una por una.
  • Durabilidad: Una vez aplicada, la transacción permaneces así, incluso en caso de errores, pérdida de energía, o bloqueos.

Un archivo LDF almacena suficiente información para reproducir o deshacer un cambio, o recuperar la base de datos a un punto de tiempo específico. Por lo tanto, debido a varios requerimientos de autoría o recuperación, frecuentemente hay una necesidad de abrir un archivo LDF y ver su contenido. Pero ver el contenido de un archivo LDF no es una tarea fácil.

Hay muchas funciones de SQL Server y comando (por ejemplo, fn_dblog, fn_dump_dblog y DBCC PAGE) que potencialmente proveen una manera de ver el contenido de un archivo LDF. De todas maneras, un conocimiento significativo de T-SQL es requerido para usarlas, algunas no están documentadas, y los resultados que proveen son difíciles de convertir a un formado humanamente legible. Los siguientes son ejemplos de cómo ver el contenido de un archivo LDF usando funciones de SQL Server y comandos:

  1. Aquí está un ejemplo usando fn_dblog para leer un registro de transacciones en línea, con un resultado de 129 columnas (sólo 7 se muestran):

    Using fn_dblog to read an online transaction log

  2. La función fn_dump_dblog es usada para leer el registro de transacciones nativo o copias de seguridad nativamente comprimidas.
    El resultado es similar:

    Using fn_dump_dblog to open LDF file

    Desafortunadamente, no hay documentación oficial disponible para las funciones fn_dblog y fn_dump_dblog. Para traducir las columnas, usted necesita familiarizarse con la estructura interna y el formato de datos, banderas y su número total en una fila de datos.

  3. DBCC PAGE es usado para leer el contenido de archivos de la base de datos en línea – MDF y LDF. El resultado es una salida hexadecimal, la cual, a menos que tenga un editor hexadecimal, será difícil de interpretar.

    Using DBCC PAGE to read MDF and LDF files

Usando ApexSQL Log como lector de archivos LDF

ApexSQL Log es un lector de registros de transacciones de SQL Server que lee registros de transacciones en línea, registros de transacciones sueltos y copias de seguridad de registros de transacciones – tanto nativos y comprimidos nativamente. Como un visor LDF, está enfocado en operaciones (tanto DML como DDL, 45 en total), y lo que fue cambiado por la ejecución de estas operaciones.

Aparte de mostrar el contenido lógico de un archivo LDF, ApexSQL Log también provee algunas características adicionales como crear scripts Deshacer/Rehacer, un historial de filas para operaciones DML, y más.

Para abrir y ver un archivo LDF usando ApexSQL Log:

  1. Conéctese a la base de datos a la cual pertenece el archivo LDF.

    Connecting to the database that the LDF file belongs to

  2. El siguiente paso es añadir cualquier copia de seguridad de archivos LDF y/o archivos LDF sueltos que contienen la información que necesita ver. Asegúrese que formen una cadena de registro completa. Una cadena de registro es una secuencia continua de copias de seguridad de registros de transacciones. Comienza con una copia de seguridad de base de datos completa seguida por todas las copias de seguridad de registros subsecuentes hasta el punto de auditoría. Si se rompe, sólo las transacciones en los registros hasta la última copia de seguridad antes de la perdida se pueden mostrar con información completa (por ejemplo, un esquema y nombre de objeto, o un historial de fila).

    A diferencia de las operaciones INSERT y DELETE, las cuales son completamente registradas en los archivos LDF, las operaciones UPDATE son registradas mínimamente – sólo los cambios que son hechos son registrados, pero los valores antiguos y nuevos no. Cuando las operaciones UPDATE se están registrando, SQL Server no registra estados de filas de antes y después, sólo el cambio incremental que ocurrió a la fila. Por ejemplo, si una palabra “log” fuera actualizada a la palabra “blog” SQL Server, en un caso general, sólo registra una adición de letra “b” en el índice 0. Esto es suficiente para su propósito de asegurar ACID pero no es suficiente para entender qué cambio realmente ocurrió, ApexSQL Log tiene que reconstruir el contexto en el cual el cambio ocurrió desde el resto del registro de transacciones y/o copia de seguridad y datos de la base de datos en línea.

    Para lograra esto despliega varias técnicas de reconstrucción de estados de fila complementarias, una de las cuales es reconstrucción usando una cadena completa de registro. Especificar la cadena de registro completa, junto con las más recientes copias de seguridad completas y diferenciales, permite a ApexSQL Log reconstruir el contexto de UPDATE comenzando por el estado de filas actualizado al tiempo de la última copia de seguridad y reconstruyendo todas las operaciones que afectaron desde entonces. En nuestro ejemplo, ApexSQL Log encontraría el estado de filas al tiempo de la última copia de seguridad, vería que el valor de los campos era “log” y desde ahí concluiría que el cambio registrado de adición de “b” en el índice 0 ha transformado el valor del campo a “blog”.

    Por otra parte, una cadena de registros permite leer las transacciones más rápidamente usando varios archivos de copias de seguridad de registros de transacciones en lugar de un solo registro de transacciones en línea que puede ser muchas veces más grande que todas las copias de seguridad de registros de transacciones usados. Adicionalmente, un archivo LDF suelto puede ser usado como una fuente de lectura también – ApexSQL Log analizará todas las fuentes provistas para facilitar información precisa acerca de las transacciones grabadas en los archivos LDF.

    Para hacer eso use el botón Add en el paso Select SQL logs to analyze.

    Using the Transaction logs tab

  3. Usar la pestaña Database backups provee la copia de seguridad completa de la base de datos que será usada como punto de inicio desde el cual la cadena de transacciones completa comienza.

    Selecting database backups to be analyzed

  4. Usando la sección Time range en el paso Filter setup, especifique el espacio de tiempo cuando las operaciones en las que está interesado fueron ejecutadas. Esto acelerará el proceso reduciendo las operaciones requeridas.

    Filter setup - open LDF file

  5. Cuando todo esto esté fijado, use el botón Open para iniciar el proceso de leer archivos LDF. Todas las transacciones, de acuerdo a las fuentes provistas y filtros, serán mostradas en la cuadrícula principal de ApexSQL Log cuando el proceso finalice.

Conclusión acerca del lector de archivos LDF

Como se describió, hay diferentes maneras de abrir un archivo LDF, y la mayor parte de ellas hacen sólo eso – abrir el archivo. Es difícil obtener alguna información legible para un humano y hacer uso de ella.

Por otro lado, además de simplemente abrir un archivo LDF, ApexSQL Log añade valor al proceso. Usted podrá leer registros de transacciones para ver el tipo de operación, el esquema y nombre del objeto afectado, el tiempo cuando la operación fue ejecutada, el nombre del usuario que ejecutó la operación, y más.

Las principales ventajas de procesar un archivo LDF con ApexSQL Log vs. sólo abrirlo son que puede:

  • Mostrar información legible para humanos enlazando e interpretando datos (convertir valores hexadecimales y binarios) desde 129 columnas nativas
  • Encadenar diferentes archivos LDF en uno sólo
  • Combinar archivos en línea y con copia de seguridad (tanto archivos de bases de datos como LDF), para proveer más detalles acerca de cada transacción
  • Reconstruir completamente operaciones UPDATE, incluyendo los valores de campo antiguos (antes) y nuevos (después)
  • Mostrar el historial de cambios de una fila completa para operaciones DML incluyendo el ingreso del usuario que realizó cada operación, y el tiempo de la ejecución de la transacción
  • Mapear antiguos (dropped) IDs de tablas para permitir la recuperación de datos de tablas que ya no existen
  • Procesar y mostrar el contenido de un archivo LDF sin requerir conocimiento de T-SQL

Además de lectura, ApexSQL Log también proporciona:

  • Orden de cuadrículas, filtrado, y la búsqueda avanzada le permite manipular los datos en muchas maneras diferentes
  • Además del renderizado de cuadrícula – ApexSQL Log puede convertir los datos a CSV, HTML, XML o SQL y ayudarle a administrar la exportación y guardar el contenido de la cuadrícula para análisis posteriores.
  • La creación de scripts SQL para volver o reproducir transacciones SQL Server – esto puede ser útil para un escenario de recuperación de bases de datos cuando datos perdidos necesitan ser recuperados, o cambios de datos/esquema necesitan retrotraerse sin hacer una restauración de base de datos completa
  • Documentación oficial para todas las características
  • Soporte técnico y más

Autor: Ivan Stankovic

Traductor: Daniel Calbimonte

Diciembre 8, 2014