Compartir a través de


La restauración de una base de datos de SQL Server mediante una aplicación VDI con bandas múltiples podría producir un error 3456

Este artículo le ayuda a resolver un problema que se produce cuando se usan aplicaciones basadas en la interfaz de dispositivo virtual (VDI) para restaurar las bases de datos de SQL Server.

Síntomas

Al restaurar una copia de seguridad completa de la interfaz de dispositivo virtual (VDI) en SQL Server 2019 o posterior, es posible que reciba el error MSSQLSERVER_3456:

Msg 3456, Level 16, State 1, Line <LineNumber>
Could not redo log record (120600:18965748:1), for transaction ID (0:1527178398), on page (14:1987189), allocation unit 72057761533001728, database 'DB1_STRIPE' (database ID 8).
Page: LSN = (120598:23255372:8), allocation unit = 72057761317781504, type = 1. Log: OpCode = 6, context 2, PrevPageLSN: (120600:18965371:85).

Causa

Cuando SQL Server realiza una copia de seguridad en VDI, pasa datos a VDI a través de un búfer. A continuación, VDI controla el formato de cómo almacenar esa copia de seguridad. Sin embargo, en muchos casos, el cliente VDI podría esperar una sola copia de cada página de datos.

Cuando se agrupa una copia de seguridad en VDI, varios dispositivos de copia de seguridad componen el contenido de una copia de seguridad completa. Los datos se escriben de forma asincrónica y la lógica del cliente VDI controla el orden de copia de datos. Dado que la fase de copia de datos es asincrónica, los datos se pueden escribir fuera de orden. Sin embargo, en un escenario de copia de seguridad completo anterior a SQL Server 2019, solo hay una copia por página de datos. Por lo tanto, cuando el cliente VDI envía datos al búfer desde el que SQL Server lee para una restauración, SQL Server todavía podría saber exactamente dónde y cómo restaurar cada página de datos. Con la introducción del anclaje de registros retrasado en SQL Server 2019, es posible que se encuentren varias copias de la página de datos en los archivos de copia de seguridad. Existen varias copias debido a que se produce una copia de seguridad diferencial mínima dentro de la copia de seguridad completa (consulte la sección Más información para obtener más información ). El cliente VDI no espera varias copias de la misma página de datos o pasa las páginas de datos de vuelta a SQL Server en el orden incorrecto. Este comportamiento provoca el error de restauración. El error 3456 Could not redo log record indica que SQL Server intenta aplicar un registro de registro que espera la versión más reciente de la página de datos, pero encuentra una versión anterior.

Solución

  1. En función de la configuración, debe habilitar una o varias marcas de seguimiento como parámetros de inicio para la instancia de SQL Server:

    • Si va a realizar copias de seguridad completas cuando la instancia actúa como una réplica principal o una instancia sin grupos de disponibilidad, habilite la marca de seguimiento 3471 para deshabilitar la característica de anclaje de registros retrasada para copias de seguridad completas.

    • Si va a realizar copias de seguridad diferenciales cuando la instancia actúa como una réplica principal o una instancia sin grupos de disponibilidad, habilite la marca de seguimiento 3475 para deshabilitar la característica de anclaje de registros retrasada para las copias de seguridad diferenciales.

    • Si va a realizar copias de seguridad completas con COPY_ONLY cuando la instancia actúa como réplica secundaria, habilite la marca de seguimiento 3472 para deshabilitar la característica de anclaje de registros retrasada para las copias de seguridad diferenciales.

  2. Reinicie SQL Server.

  3. Vuelva a realizar copias de seguridad completas o diferenciales.

Nota:

También puede habilitar temporalmente estas marcas de seguimiento mediante el comando DBCC TRACEON .

DBCC TRACEON(3471,3472,3475,-1)

Este comando se puede usar para mitigar el problema si no puede reiniciar la instancia de SQL Server inmediatamente.

Importante

Debido a este problema, es posible que las copias de seguridad existentes no se puedan restaurar si se cumplen las condiciones siguientes:

  • La copia de seguridad se realiza con la característica de anclaje de registro retrasada habilitada.
  • La herramienta de copia de seguridad usa VDI.
  • La copia de seguridad se realiza mediante bandas múltiples (copia de seguridad en varios archivos).

Le recomendamos que restaure las copias de seguridad existentes en un servidor de prueba para comprobar si se pueden restaurar correctamente.

Más información

SQL Server 2019 presenta una característica denominada anclaje de registros retrasado. Antes de la introducción de esta característica, durante una copia de seguridad completa de la base de datos, SQL Server impide que se produzcan transacciones (ancla el registro), copia los datos y el registro y, a continuación, quita el anclaje justo al principio. Con la característica presente, SQL Server retrasa la realización de transacciones (ancla el registro) hacia el final de la duración de la copia de seguridad, en lugar de justo al principio. Esta característica está diseñada para evitar un problema completo del registro de transacciones (MSSQLSERVER_9002 error) durante una copia de seguridad completa que tarda mucho tiempo en completarse. Dado que el anclaje del registro se retrasa, las transacciones todavía se pueden aplicar a las páginas de datos de la base de datos mientras la copia de seguridad está en curso. SQL Server mantiene un mapa de bits para identificar las páginas que han cambiado desde la hora de inicio de la copia de seguridad completa en curso, de modo que pueda realizar una copia de seguridad diferencial mínima de ellas. De este modo, obtiene una copia actualizada de cada página de datos que se cambió mientras realiza una copia de seguridad de toda la base de datos. Esto provoca una copia adicional de algunas páginas de datos. Además, se crea esta sección adicional de la copia de seguridad completa.