¿CHECKPOINT o COMMIT escribe en el disco?

12

Digamos, para SQLServer2008R2 y superior, con bases de datos de modo de recuperación completa.

Siempre pense :

  1. Cuando se confirma una transacción (COMMIT), la transacción se escribe en el registro de transacciones en la RAM.

  2. Cuando ocurre un PUNTO DE VERIFICACIÓN (después de un tiempo y / o algunas transacciones y otros criterios), las transacciones entre el último PUNTO DE VERIFICACIÓN y el actual se escriben en el disco.

  3. Cuando ocurre un REGISTRO DE COPIA DE SEGURIDAD, los datos se escriben en el archivo MDF.

¿Estoy en lo correcto? Algunos de mis colegas dicen que estoy equivocado, y es difícil encontrar la respuesta correcta, incluso con el BOL.

¡Gracias!

Patator
fuente

Respuestas:

20

Desafortunadamente, hasta ahora hay una serie de errores en las respuestas con respecto a cómo funciona COMMIT, por lo que agregaré otro. Consulte Cómo funciona: Presentación de E / S de SQL Server de Bob Dorr para obtener detalles y conceptos básicos de E / S de SQL Server 2000 . Así es como funciona:

  • Todas las escrituras (cambios) de datos completamente registrados se producen exactamente en la secuencia siguiente (consulte Comprensión de cómo SQL Server ejecuta una consulta: Escribir datos ):

    • La página de datos está cerrada exclusivamente
    • Se agrega un registro de registro que describe el cambio al registro, en la memoria. El nuevo registro de registro genera un nuevo LSN, consulte Qué es un LSN: Número de secuencia de registro .
    • La página de datos se modifica (tanto el registro de datos como last_update_lsn en la página). Esta es ahora la página modificada ('sucia').
    • Se libera el pestillo de la página de datos.
    • nada se escribe directamente en el disco como resultado de la actualización
  • Un compromiso hace lo siguiente

    • agrega un nuevo registro de registro que describe el COMPROMISO al registro, en la memoria
    • todos los registros de anotaciones no vaciados en el disco, hasta e incluido el generado anteriormente, son vaciados (escritos en el disco)
    • los bloques de subprocesos esperan hasta que el sistema operativo informa que la escritura anterior es duradera (IO completa)
    • La declaración COMMIT (o la declaración DML con confirmación implícita) se completa
  • Un PUNTO DE CONTROL hace lo siguiente (simplificado), vea Cómo funcionan los puntos de control y qué se registra :

    • Todas las páginas sucias de la memoria se escriben en el disco.
      • Para cada página sucia, antes de comenzar a escribir en el disco, el registro e incluir el LSN que es el last_update_lsn en esa página se vacía (escrito en el disco). Tenga en cuenta que el vaciado de cualquier LSN implica que todos los LSN anteriores también están vaciados, por lo que para las páginas más sucias esto es un no-op, ya que es probable que su propia última actualización ya esté vacía.
    • el registro de registro que describe el punto de control se escribe en el registro y se vacía
    • la página de inicio de la base de datos se actualiza con el LSN del registro generado anteriormente

Las escrituras funcionan de manera diferente para operaciones mínimamente registradas, vea Operaciones que pueden ser mínimamente registradas . Aproximadamente las operaciones mínimamente registradas actúan de la siguiente manera (simplificada):

  • Antes de insertar filas en una página como parte de una operación mínimamente registrada, se genera un registro de registro que describe el hecho de que la página participa en operaciones mínimamente registradas y se agrega al registro (en la memoria)
  • La página mínimamente registrada se está actualizando, ya que se están escribiendo muchas inserciones en ella. No se registra nada, no se escribe nada en el disco.
  • Cuando se confirma una operación mínimamente registrada, antes de confirmarla se requiere que todas las páginas que participaron en operaciones mínimamente registradas en esa transacción se escriban en el disco. Onyl, una vez que se completa esta escritura, el registro de registro de COMMIT se puede agregar al registro (en la memoria) y el registro, incluido este registro de registro de confirmación recién agregado, se vacía (escribe) en el disco.
Remus Rusanu
fuente
8

Cuando se confirma una transacción (COMMIT), la transacción se escribe en el registro de transacciones en la RAM.

Una transacción se escribe en el registro de transacciones incluso antes de cambiar la página o los datos según lo solicitado por la consulta. Esto se llama registro de escritura anticipada (WAL). Si SQL Server se bloquea mientras se actualiza una página en la memoria, WAL garantiza que el motor de base de datos pueda leer el registro de transacciones y revertir la transacción. Esta es una propiedad ACID de un RDBMS.

Cuando ocurre un PUNTO DE VERIFICACIÓN (después de un tiempo y / o algunas transacciones y otros criterios), las transacciones entre el último PUNTO DE VERIFICACIÓN y el actual se escriben en el disco.

Un punto de control vacía las páginas sucias del búfer al disco. Se comporta un poco diferente para tempdb . Una página sucia es aquella que ha cambiado desde que se leyó desde el disco. Este proceso de punto de control crea una marca en el registro de transacciones hasta el punto en el que se han confirmado las transacciones. Después de una falla, la recuperación sabe que todas las transacciones hasta esa marca se habían comprometido. Puede emitir un punto de control manualmente con un comando TSQL.

Cuando ocurre un REGISTRO DE COPIA DE SEGURIDAD, los datos se escriben en el archivo MDF.

No, cuando ocurre el registro de respaldo, SQL Server copia la información del registro de transacciones del archivo de registro de la base de datos al disco donde está escribiendo el respaldo. Una operación de copia de seguridad lee datos del disco y los escribe en el disco.

Me gustaría que leyeras los enlaces a continuación

Comprender el registro y la recuperación en SQL Server Ya señalado por Mark

Internals de SQL Server 2008 y libro de solución de problemas

Arquitectura y gestión de registros de transacciones

Shanky
fuente
Ok, parece claro. Solo para estar seguro: cuando ocurre un COMPROMISO, usted dice que está escrito en el registro de transacciones; ¿te refieres a búfer o disco (LDF)?
Patator
Siempre se escribiría en el caché de registro primero y luego se volcaría al registro de transacciones en el disco. He agregado el enlace de administración del registro de transacciones, consulte cómo funciona WAL
Shanky
"Si SQL Server se bloquea mientras se actualiza una página en la memoria, WAL garantiza que el motor de base de datos pueda leer el registro de transacciones y revertir la transacción". Esto solo es cierto si la transacción no se confirma. Si ya está comprometido, nada se puede revertir. La información en el registro de transacciones se utiliza para actualizar los archivos de datos. Incluso si el búfer no se escribió en el archivo de datos antes del bloqueo.
milagro173
@Miracle: supongo que si la página se actualiza, lo que está relacionado con una transacción en particular, por supuesto, la transacción no se habría confirmado.
Shanky
4

A continuación se aclararán cosas para usted:

Cuando se confirma una transacción (COMMIT), la transacción se escribe en el registro de transacciones en la RAM.

  • COMMIT (o BEGIN) no tiene nada que ver con el modelo de recuperación. Está en el nivel de transacción. Una transacción tiene que completarse completamente o fallar ( recuerde las propiedades de ACID ). Entonces, esencialmente, un COMPROMISO marcará el final de una transacción exitosa (ya sea implícita o explícita). Una declaración de COMPROMISO garantizará que todas las modificaciones de la transacción se hagan una parte permanente de la base de datos.
  • Para realizar cualquier cambio, SQL Server utilizará WAL (Registro de escritura anticipada) en el que primero describirá en el registro cualquier cambio que esté a punto de realizar, antes de modificar los datos.

Cuando ocurre un PUNTO DE VERIFICACIÓN (después de un tiempo y / o algunas transacciones y otros criterios), las transacciones entre el último PUNTO DE VERIFICACIÓN y el actual se escriben en el disco.

Cuando ocurre un REGISTRO DE COPIA DE SEGURIDAD, los datos se escriben en el archivo MDF.

Referirse a :

Kin Shah
fuente