Este es el segundo artículo de la serie dedicado al registro de transacciones de SQL Server y sus especificidades. Aquí vamos a examinar los detalles del registro de registro.
Registros de registro
Los registros de registro son el núcleo de los mecanismos de registro y recuperación. Un registro de registro describe un solo cambio en una base de datos. Por lo tanto, cada cambio en una base de datos tiene un registro o registros que ayudan a describir ese cambio en particular. Aunque no es necesario que comprenda los detalles del registro de registro, para comprender lo que sucede con el registro y la recuperación, esos detalles son extremadamente interesantes.
El registro de registro tiene un número de secuencia de registro único que definimos en el primer artículo. El número de secuencia de registro permite encontrar el registro de registro en el registro de transacciones. Además, cada página de archivo de datos tiene un LSN en su encabezado de página que identifica el registro de registro más reciente cuyo cambio se refleja en la página. Esto es fundamental para la recuperación de fallas.
Los registros de registro de transacciones concurrentes se entremezclan en el registro de transacciones de acuerdo con el momento en que ocurrieron. Los registros de registro se almacenan en bloques de registro en el grupo de búfer hasta que se vacían en el disco.
No hay operaciones no registradas en las bases de datos del usuario o del sistema. Sin embargo, hay una excepción:en tempdb, las operaciones de almacenamiento de versiones y archivos de trabajo no se registran. Los registros de registro nunca se mueven en el registro de transacciones.
¿Qué hay dentro de un registro de registro?
La información en un registro de registro permite que se rehaga (hacia adelante) o se deshaga (hacia atrás). Esta capacidad de un registro de registro es crucial para permitir que las transacciones se reviertan y para el trabajo de recuperación. Los registros de registro contienen muchos campos, según el tipo de registro de registro. Hay algunos campos comunes entre todos los registros, que incluyen:
- El tipo de registro de registro
- comenzar el registro de transacciones
- confirmar registro de transacciones
- asignar una página cambiando el mapa de bits de asignación
- insertar una fila
- borrar una fila
- modificar una fila
- El contexto del registro , en su caso.
- El ID de transacción del que forma parte el registro Si alguna. La mayoría de los registros son parte de las transacciones.
- La longitud del registro . Los registros de registro generalmente tienen un tamaño fijo y luego, dependiendo de la cantidad de datos que haya en el registro de registro, también habrá una parte variable.
- El LSN del registro anterior en la misma transacción . Si alguna. El LSN es esencialmente un puntero al registro de transacciones anterior generado por esa transacción en particular. Esta cadena de LSN anteriores permite revertir esa transacción en particular, porque la reversión se realiza en el orden inverso, comenzando en el registro de registro más reciente.
- La cantidad de espacio de registro reservado en caso de que se deba deshacer el registro.
Reserva de espacio de registro
Cada registro de registro que se genera en la parte delantera de una transacción debe reservar espacio libre en el registro de transacciones para permitir que el registro de registro se revierta, sin que el registro de transacciones tenga que crecer.
El mecanismo de reserva de espacio de registro es muy conservador, reservando siempre suficiente espacio, y generalmente más, en caso de que ocurra una situación inesperada. Por ejemplo, una actualización o eliminación en una tabla comprimida reservará más espacio que una actualización o eliminación similar en una tabla no comprimida. Esto sucede porque la reversión de la actualización en la tabla comprimida puede tener que hacer frente a que la fila actualizada ya no se encuentra en una página comprimida, por lo que tendría que escribir columnas de ancho completo en el registro en lugar de datos comprimidos.
Tipos de registro de registro
Hay muchos tipos de registros, incluidos:
- LOP_FORMAT_PAGE La operación de página de formato de registro es donde se ha formateado una página, lo que significa que se ha creado su encabezado. El registro registrará al menos el encabezado de la página y potencialmente algunos contenidos más de la página si la página se ha creado y completado como parte de una operación como la creación o reconstrucción de un índice)
- LOP_MODIFY_ROW Esta operación está cambiando una pequeña parte de los datos existentes.
- LOP_SET_BITS Este registro de registro se aplica a los mapas de bits de asignación.
- LOP_INSERT_ROWS y LOP_DELETE_ROWS
- LOP_SET_FREE_SPACE Se aplica a PFS:la asignación del mapa de bits que realiza un seguimiento de los estados de asignación de las páginas.
Cualquier registro de registro que vaya a realizar un cambio en una página de datos o una página de índice en un índice tabular incluye :
- El ID de la unidad de asignación
- El ID de página y el ID de ranura del registro en la página, que es esencialmente el ID de registro de base cero de los datos o el registro de índice en la página.
- La imagen residual, o la imagen anterior y la imagen posterior de los datos modificados. Puede haber múltiples conjuntos de estos en un solo registro. Las imágenes secundarias permiten que se produzca la rehacer. Las imágenes anteriores permiten que se deshaga.
Bloquear registro
Algunos registros incluyen un mapa de bits de los bloqueos que se mantuvieron cuando se produjo el cambio descrito. El mapa de bits contiene:
- Recuento del número de bloqueos.
- Qué tipo y modo de bloqueo, por ejemplo, un bloqueo de página en modo X.
- En qué está el candado
Durante la recuperación de fallas y la creación de reflejo de la base de datos/conmutaciones por error del grupo de disponibilidad, estos bloqueos se adquirirán para todos los registros que se van a deshacer. Esto permite la función de recuperación rápida en Enterprise Edition desde SQL Server 2005 en adelante.
Registrar registros en transacciones
Todas las transacciones generan al menos tres registros, siempre en la siguiente secuencia:
- LOP_BEGIN_XACT – incluye información como el SPID, el nombre de la transacción y la hora de inicio. Todas las transacciones iniciadas por SQL Server tienen nombres para describir la operación (por ejemplo, AllocFirstPage, DROPOBJ)
- Otros registros de la transacción.
- LOP_COMMIT_XACT – si la transacción se confirma.
- LOP_ABORT_XACT – si la transacción se revierte.
Ambos incluyen la hora de finalización de la transacción.
Los registros de una transacción están vinculados hacia atrás por LSN. Esto significa que el siguiente registro de registro que se genera para una transacción tiene el LSN del registro de registro anterior que se generó para esta transacción en particular. Esto permite que la transacción se revierta correctamente. Algunos registros no son transaccionales, incluidos:
- Cambios en el espacio libre de PFS (imposible de conciliar con otras transacciones)
- Cambios de mapa de bits diferenciales (solo cambio unidireccional)
Examen de registros
Hay dos formas de examinar los registros. Puede usar la función DBCC LOGINFO, pero se recomienda usar la función con valores de tabla fn_dblog. Tiene una sintaxis extremadamente simple:
SELECT * FROM fn_dblog (startLSN, endLSN); GO
Es una función extremadamente poderosa porque:
- devuelve un conjunto de resultados tabulares que se pueden administrar fácilmente.
- permite el uso de predicados complejos.
- analiza todo el registro de transacciones en la parte activa del registro, desde el inicio de la transacción no confirmada más antigua hasta el registro de registro más reciente. Esto se puede anular usando el indicador de rastreo 2537
Los campos startLSN y endLSN generalmente se pasan como NULL
Aquí está la demostración:
USE DBTest2014 GO SET NOCOUNT ON; GO --Set the SIMPLE recovery mode with no auto-stats -- to avoid unwanted log records ALTER DATABASE DBTest2014 SET RECOVERY SIMPLE; ALTER DATABASE DBTest2014 SET AUTO_CREATE_STATISTICS OFF; CREATE TABLE [TEST_TABLE] ([C1] INT, [C2] INT, [C3] INT); INSERT INTO [TEST_TABLE] VALUES (1,1,1); GO --Clear out the log CHECKPOINT; GO -- Implicit transaction INSERT INTO [TEST_TABLE] VALUES (2,2,2); GO SELECT * FROM fn_dblog(null, null); GO
Aquí está el conjunto de resultados abreviado. En realidad, fn_dblog devuelve una variedad de registros diferentes, como Longitud de registro de registro, Bits de marca, Reserva de registro, AllocUnitId, PageID, SlotID, LSN de página anterior y otros.
Modificación del contenido de las filas
Las modificaciones de registro se registran de dos maneras:como LOP_MODIFY_ROW o LOP_MODIFY_COLUMNS registro. No importa qué método se use, registrará los bytes que realmente se están cambiando. Por ejemplo, cambiar un valor INT de 1 a 24 solo registra un byte de cambio ya que los otros tres bytes cero no cambiaron. SQL Server utilizará un LOP_MODIFY_ROW registro de registro si hay una sola parte de la fila que se está actualizando. Una porción se define de la siguiente manera:cada columna de longitud variable en la fila es una "porción" y toda el área de ancho fijo de la fila es una "porción", incluso si se actualizan varias columnas, pero solo si los bytes se actualizadas tienen una separación de 16 bytes o menos en la fila.
LOP_MODIFY_ROW contiene:
- Imagen anterior
- Imagen posterior
- Columnas de clave de índice, si corresponde
- Bloquear mapa de bits
LOP_MODIFY_COLUMNS contiene:
- Arreglo de compensaciones antes y después
- Matriz de longitud
- Columnas de clave de índice, si corresponde
- Bloquear mapa de bits
- Pares de imágenes de antes y después
Registros de registro de compensación
Este es un tipo especial de registros que se utilizan para ayudar a revertir una transacción. Cuando se retrotrae una transacción, el cambio descrito por cada registro de la transacción se debe deshacer en la base de datos. La reversión comienza con el registro de registro más reciente para la transacción y sigue los enlaces LSN anteriores hasta el registro de registro LOP_BEGIN_XACT. Para cada entrada de registro:
- Realice la "anti-operación" que anulará los efectos del registro
- Generar un registro de registro, marcándolo como un registro de COMPENSACIÓN, ya que está compensando el registro de registro en la parte delantera de la transacción.
- El LSN anterior del registro de COMPENSACIÓN apunta al registro de registro anterior al que está compensando. Esencialmente, hace que el registro ya no sea parte de la cadena de registros de la transacción.
- Se libera el espacio de registro reservado para el registro
Los registros de COMPENSACIÓN no se pueden deshacer, solo se pueden rehacer.
Revertir una transacción
Esta es una representación gráfica de lo que sucede cuando se revierte una transacción:
Examinemos el siguiente código:
USE DBTest2014 GO SET NOCOUNT ON; GO ALTER DATABASE DBTest2014 SET RECOVERY SIMPLE; ALTER DATABASE DBTest2014 SET AUTO_CREATE_STATISTICS OFF; CREATE TABLE [TEST_TABLE] ([C1] INT, [C2] INT, [C3] INT); INSERT INTO [TEST_TABLE] VALUES (1,1,1); INSERT INTO [TEST_TABLE] VALUES (2,2,2); GO --Clear out the log CHECKPOINT; GO -- Explicit transaction to insert a new record BEGIN TRAN; INSERT INTO [TEST_TABLE] VALUES (3,3,3); GO SELECT * FROM fn_dblog(null, null); GO --Roll it back ROLLBACK TRAN; GO SELECT * FROM fn_dblog(null, null);
Aquí podemos ver un registro de registro especial con la descripción "COMPENSACIÓN"
Si observamos el LSN anterior, podemos ver que LOP_INSERT_ROWS que hicimos, enlaces a …0f40:0001 y esta es la transacción BEGIN porque la parte delantera de la transacción se vincula con el registro de registro anterior. El LOP_DELETE_ROW el registro de compensación no se vincula a un registro por el que está compensando; se vincula a él (al registro de registro de transacciones BEGIN).
Entonces DELEDE compensó INSERT y lo eliminó de la lista de registros. ElLOP_ABORT_XACT es la señal de que la transacción finaliza con el rollback. Además, puedes ver que LOP_ABORT_XACT enlaza con el LOP_BEGIN_XACT.
Cuando hacemos un registro de compensación, la reserva de espacio de registro disminuye [-74]. Por lo tanto, en realidad está devolviendo algo de espacio que estaba reservado para la parte de avance de la transacción (LOP_INSERT_ROWS [178]). Como puede ver, el sistema de reserva de espacio de registro es muy conservador:INSERTAR reserva más espacio del que devuelve ELIMINAR.
Restauraciones y copias de seguridad diferenciales
Si una base de datos tiene una copia de seguridad completa, entonces una transacción actualiza 100.000 registros pero la transacción se revierte, ¿por qué una copia de seguridad diferencial hace tantos datos? ¿Seguramente la reversión de la transacción significa que nada cambió? La pieza del rompecabezas que falta aquí es que revertir una transacción no elimina todos los cambios realizados por la transacción. Como hemos visto, la reversión tiene que generar registros de registro de compensación, porque la reversión tiene que generar otros cambios para compensar la parte de avance de la transacción. Los encabezados de página de todas las páginas afectadas se cambiaron al menos dos veces. Uno para actualizar el LSN de la página para la parte de avance de la transacción y otro para actualizar el LSN de la página para la parte de reversión de la transacción. En ambos casos, la actualización hará que la extensión se marque como cambiada en el mapa de bits diferencial. No importa cuál fue el cambio, solo que algo en la medida cambió. No hay forma de excluir estas extensiones de la copia de seguridad diferencial.
Resumen
En este artículo, hemos examinado los registros de registro. Los registros de registro son el núcleo de los mecanismos de registro y recuperación. Cada cambio en una base de datos tiene un registro de registro asociado. Cada entrada de registro describe un pequeño cambio. Un gran cambio tiene varios registros dentro de una sola transacción. Hay muchos tipos diferentes de registros y hemos analizado algunos de ellos.
El registro de transacciones es un tema esencialmente amplio y un par de artículos no son suficientes para revelar todos los detalles. Entonces, si desea obtener información más detallada, le sugiero que lea el siguiente libro:SQL Server Transaction Log Management por Tony Davis y Gail Shaw y este artículo:Gestión de registros de transacciones.
Lea también:
Sumérjase en el registro de transacciones de SQL Server:parte 1
Sumérjase en el registro de transacciones de SQL Server:parte 2